4

これと同様の質問がたくさんあることは知っていますが、まだ答えを見つけることができません。MATLAB に時報があるとします。

t=0:1/44100:1

および周波数 500Hz のコサイン信号:

x=cos(2*pi*500*t);

今、fft信号 x のコマンドを使用して得られた振幅スペクトルをプロットしようとしています

FFT=abs(fft(x))
plot(FFT)

理論によれば、プロットには 2 つのピークがあり、1 つは -500 Hz で、もう 1 つは 500 Hz です。私が理解できないのは、2 つのピークが得られるということですが、これらのピークがどの周波数にあるのかわかりません。FFT インデックス、入力信号の長さ、およびサンプリング周波数を使用して周波数を計算する方法があることは知っていますが、それでも周波数を計算できません。

関数を使用してピークが表す周波数のインデックス番号にピークが位置するようにFFTプロットを整列させる方法があることは知っていますがfftshift、私が望むのは、単にこの関数を呼び出した結果のプロットを使用して周波数を把握することです:

FFT=fft(x)

この場合、信号に 500Hz の余弦が含まれていることは既にわかっていますが、FFT を取得したい信号が事前にわからない場合はどうなるでしょうか。fft関数からの出力を使用して、そのサンプルのピークの周波数値を取得するにはどうすればよいでしょうか?

4

2 に答える 2

1

自分で周波数配列を生成し、それに対して FFT の結果をプロットする必要があります。

このような:

function [Ycomp, fHz] = getFFT(data, Fs)
     len = length(data);
     NFFT = 2^nextpow2(len);
     Ydouble = fft(data, NFFT)/len; % Double-sided FFT
     Ycomp = Ydouble(1:NFFT/2+1); % Single-sided FFT, complex
     fHz = Fs/2*linspace(0,1,NFFT/2+1); % Frequency array in Hertz.
     semilogx(fHz, abs(Ycomp))
end
于 2012-12-05T11:17:03.953 に答える
1

500 Hz と Fs - 500 Hz にピークが見られます (つまり、特定のケースでは 44100 - 500 = 43600 Hz)。

これは、実数から複素数への FFT 出力が複素共役対称であるためです。振幅だけを見ている場合、スペクトルの上半分は下半分の「鏡像」であり、したがって冗長です。

通常、パワー スペクトルのプロットでは、FFT、ウィンドウ関数、プロットなどのすべての詳細を直接処理するよりも、 MATLAB のピリオドグラム関数を使用することで多くの作業を節約できることに注意してください。

于 2012-12-05T11:18:10.917 に答える