FFT后校直幅频响应图

时间:2011-10-17 11:51:28

标签: matlab plot fft

我已经将一个对数扫描正弦(带有一些淡入淡出/淡出)加载到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变为水平线):

Data from FFT

P.S。我不擅长音频信号处理,我只是一个通用的程序员,所以不要浪费你的时间来解释发生了什么(虽然我想,总有一天我将不得不阅读一本好的DSP书籍)。只需要一个正确的公式插入我的Matlab脚本就足够了。

2 个答案:

答案 0 :(得分:2)

如果您在每个频率仓中具有相同的能量,您的频谱将只是平坦的 - 这意味着您的正弦波必须在FFT采样窗口的持续时间内以恒定(线性)速率扫描。

理想情况下,您还应该在FFT之前应用window function以减少spectral leakage的影响,但这会影响扫描正弦的结果幅度,您需要对此进行补偿。

答案 1 :(得分:0)

响应校正因子将取决于对数扫描的确切速率。在FFT之前使用合适的窗口函数可以减少低频拐角处的一些扇形。