1

我试图通过使用存在于MATLAB. 我只是复制粘贴了数学函数的 FFT 代码,并用音频文件替换了该函数。

Fs = 44100;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
y = wavread('c-note2.wav');     
plot(Fs*t(1:50),y(1:50))

xlabel('time (milliseconds)')

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)') 
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

在这里,y=wavread('c-note2.wav')我们有类似y=0.15sin(5x)+0.32cos(50t)+rand(I)(给信号添加噪声)的东西,而不是 。

我们正在尝试做的事情是否正确?我们可以用 wavread 代替数学信号吗?

从获得的图表中,我想获得 的峰值频率c-note并检查它是否与 a 的实际频率匹配c-note,但我得到的结果很荒谬。

4

1 回答 1

2

音符的音高通常与 FFT 返回的峰值频率不同。音符通常包含大量泛音,许多泛音通常比音高频率更强,有些甚至可能在频率上略微不和谐。搜索音高检测或估计算法,而不仅仅是查看 FFT 频谱。

此外,当使用 FFT 查看音频频谱时,FFT 的长度必须比感兴趣的最低频率的几个周期长。您的 FFT 长度似乎太短而无法解析 50 Hz(20 mS 周期)。

于 2013-03-07T20:20:11.823 回答