我已经将一个对数扫描正弦(带有一些淡入淡出/淡出)加载到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变为水平线):
P.S。我不擅长音频信号处理,我只是一个通用的程序员,所以不要浪费你的时间来解释发生了什么(虽然我想,总有一天我将不得不阅读一本好的DSP书籍)。只需要一个正确的公式插入我的Matlab脚本就足够了。
答案 0 :(得分:2)
如果您在每个频率仓中具有相同的能量,您的频谱将只是平坦的 - 这意味着您的正弦波必须在FFT采样窗口的持续时间内以恒定(线性)速率扫描。
理想情况下,您还应该在FFT之前应用window function以减少spectral leakage的影响,但这会影响扫描正弦的结果幅度,您需要对此进行补偿。
答案 1 :(得分:0)
响应校正因子将取决于对数扫描的确切速率。在FFT之前使用合适的窗口函数可以减少低频拐角处的一些扇形。