Matlab FFT后校正幅频响应图

Matlab FFT后校正幅频响应图,matlab,plot,fft,Matlab,Plot,Fft,我将一个对数扫频正弦(带有一些短的淡入/淡出)加载到Matlab中,通过fft函数运行它,并使用semilog绘制它 输入信号的振幅在10。。。20000赫兹范围。因此,为了更准确地表示正在发生的事情,我希望将图形看作几乎是水平线 我应该应用什么公式使AFR图水平? 我用来绘制图表的Matlab脚本: fid = fopen('sweepfaded.raw','rb'); %open file data = fread(fid, inf, 'float32'); %read in the

我将一个对数扫频正弦(带有一些短的淡入/淡出)加载到Matlab中,通过fft函数运行它,并使用semilog绘制它

输入信号的振幅在10。。。20000赫兹范围。因此,为了更准确地表示正在发生的事情,我希望将图形看作几乎是水平线

我应该应用什么公式使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脚本中插入一个正确的公式就足够了。

只有在每个频率单元中具有相同的能量时,您的频谱才会平坦-这意味着在FFT采样窗口期间,您的正弦波必须以恒定(线性)速率扫描


理想情况下,您还应该在FFT之前应用a以减少的影响,但是这将影响扫频正弦的最终大小,您需要对此进行补偿。

响应校正系数将取决于对数扫频的精确速率。通过在FFT之前使用合适的窗口函数,可以减少低频角处的一些扇形。谢谢,你是对的,但不幸的是,我不得不使用对数扫描,因为它在低频段提供了更高的AFR精度,这就是为什么我需要在FFT后进行一些归一化来补偿这一点,但我不知道如何计算校正值。在80赫兹以下的扫频率可能有问题——在80赫兹以上的扫频率有一个线性斜率,应该很容易校正。如果你想准确地捕捉那些较低的频率,你可能需要一个较大的FFT和较慢的扫描。(或者可能只是因为您的淡入/淡出干扰了扫频正弦的开始和结束的振幅,即极低频和高频?)@Paul R:是的,我将在最终设计中使用其他淡入/淡出功能。“这应该很容易纠正”