FFT后调直幅频响应图
Posted
技术标签:
【中文标题】FFT后调直幅频响应图【英文标题】:Straightening amplitude-frequency response graph after FFT 【发布时间】:2011-10-17 11:51:27 【问题描述】:我已经将一个对数扫频正弦(带有一些短暂的淡入/淡出)加载到 Matlab 中,并通过 fft 函数运行它并使用 semilog 绘制它。
输入信号幅度在 10 ... 20000 Hz 范围内几乎是恒定的。因此,为了更准确地表示正在发生的事情,我希望将图表视为几乎水平的线。
我应该应用什么公式来使 AFR 图水平?
我用来绘制图形的 Matlab 脚本:
fid = fopen('sweepfaded.raw','rb'); %open file
data = fread(fid, inf, 'float32'); %read in the data
fclose(fid); %close file
n = size(data,1);
n = 2^nextpow2(n); % Next power of 2 from length of audio - 2-powers are faster to calculate
p = fft(data, n); % take the fourier transform
nUniquePts = ceil((n+1)/2);
p = p(1:nUniquePts); % select just the first half since the second half
% is a mirror image of the first
p = abs(p); % take the absolute value, or the magnitude
p = p/n; % scale by the number of points so that
% the magnitude does not depend on the length
% of the signal or on its sampling frequency
p = p.^2; % square it to get the power
sampFreq = 44100;
freqArray = (0:nUniquePts-1) * (sampFreq / n); % create the frequency array
semilogx(freqArray, 10*log10(p))
xlabel('Frequency (Hz)')
ylabel('Power (dB)')
我想要水平的结果图(比如对其进行一些旋转,使 100...10000 Hz 的范围变成一条水平线):
附:我不擅长音频信号处理,我只是一个普通的程序员,所以不要浪费你的时间来解释发生了什么(虽然我想,总有一天我还是要读一本好的 DSP 书)。只要一个正确的公式插入到我的 Matlab 脚本中就足够了。
【问题讨论】:
【参考方案1】:只有当您在每个频率区间中具有相同的能量时,您的频谱才会是平坦的 - 这意味着您的正弦波必须在 FFT 采样窗口期间以恒定(线性)速率扫描。
理想情况下,您还应该在 FFT 之前应用 window function 以减少 spectral leakage 的影响,但这会影响扫频正弦的结果幅度,您需要对此进行补偿。
【讨论】:
谢谢,你是对的,但不幸的是我必须使用对数扫描,因为它在较低频率下提供更高的 AFR 精度,这就是为什么我需要在 FFT 之后进行一些归一化来弥补这一点,但我不知道如何计算校正值。 看起来低于 80 Hz 左右的扫描速率可能存在问题 - 高于该频率时,您有一个易于校正的线性斜率。如果您想准确捕获这些较低频率,您可能需要更大的 FFT 和更慢的扫描。 (或者可能只是您的淡入/淡出弄乱了扫频正弦的开始和结束的幅度,即极低频和极高频?) @Paul R:是的,我将在最终设计中使用其他一些淡入/淡出。 “这应该很容易纠正” 【参考方案2】:响应校正因子将取决于对数扫描的准确速率。在 FFT 之前使用合适的窗函数可以减少低频拐角处的一些扇形。
【讨论】:
以上是关于FFT后调直幅频响应图的主要内容,如果未能解决你的问题,请参考以下文章