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后调直幅频响应图的主要内容,如果未能解决你的问题,请参考以下文章

FFT和IFFT的Matlab实现(幅频响应和相频响应)

如何在幅频响应上使用逆 FFT?

已知传递函数,求幅频响应?

电路的频率响应---带宽的定义

滤波器相关知识

在 FFT 中补偿麦克风频率响应