在MATLAB中获取音符的峰值频率

时间:2013-03-07 18:34:29

标签: matlab fft

我试图通过使用MATLAB中存在的FFT函数来获得音符的峰值频率。我只是复制粘贴了数学函数的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),而不是c-note(为信号添加噪音)。

我们想要做的是正确的吗?我们可以用wavread而不是数学信号吗?

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

1 个答案:

答案 0 :(得分:2)

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

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