我试图通过使用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}}的实际频率匹配,但我得到了荒谬的结果。
答案 0 :(得分:2)
音符的音高通常与FFT返回的峰值频率不同。音符通常包含大量的泛音,许多泛音通常比音调频率强,有些甚至可能在频率上略微不和谐。搜索音调检测或估算算法,而不仅仅是查看FFT频谱。
此外,当使用FFT查看音频频谱时,FFT的长度必须长于感兴趣的最低频率的几个周期。您的FFT长度似乎太短,无法解析50 Hz(20 mS周期)。