1

に存在する FFT 関数を使用して、音符のピーク周波数を取得しようとしています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し、実際の の周波数と一致しているかどうかを確認したいのc-noteですが、ばかげた結果が得られています。

4

1 に答える 1

2

音符のピッチは、FFT によって返されるピーク周波数とはしばしば異なります。音符には通常、大量の倍音が含まれており、その多くはピッチ周波数よりも強いことが多く、周波数がわずかに不調和な場合もあります。FFT スペクトルを見るだけでなく、ピッチ検出または推定アルゴリズムを検索します。

また、FFT を使用してオーディオ スペクトルを調べる場合、FFT の長さは、対象となる最低周波数の数周期よりも長くする必要があります。FFT 長が短すぎて 50 Hz (20 mS 周期) を解決できないようです。

于 2013-03-07T20:20:11.823 に答える