web-dev-qa-db-ja.com

Matlab FFTの例の理解

私はmatlabとFFTが初めてで、 Matlab FFTの例 を理解したいと思っています。今のところ、2つの主な質問があります。

1)x軸(周波数)が500で終わるのはなぜですか?周波数がこれ以上ない、または単に無視されていることをどのようにして知ることができますか?

2)周波数が0から500の間であることを知るにはどうすればよいですか? FFTは周波数の限界を教えてくれませんか? FFTは、周波数なしで振幅値のみを返しますか?

ヒントをありがとう!


問題の例:

1000 Hzでサンプリングされたデータを検討してください。振幅0.7の50 Hz正弦波と振幅1の120 Hz正弦波を含む信号を形成し、いくつかのゼロ平均ランダムノイズでそれを破壊します。

Fs = 1000;                    % 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
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); 
y = x + 2*randn(size(t));     % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

time domain

周波数領域に変換すると、ノイズの多い信号yの離散フーリエ変換は、高速フーリエ変換(FFT)を実行することで見つかります。

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)|')

frequency domain

45
stefan.at.wpf

1)x軸(周波数)が500で終わるのはなぜですか?周波数がこれ以上ない、または単に無視されていることをどのようにして知ることができますか?

500Hzで終了するのは、それが1000Hzでサンプリングされたときに 信号のナイキスト周波数 であるためです。 Mathworksの例の次の行を見てください。

f = Fs/2*linspace(0,1,NFFT/2+1);

2番目のプロットの周波数軸は、0からFs/2、つまりサンプリング周波数の半分になります。ナイキスト周波数は常にサンプリング周波数の半分です。その上で、 aliasing が発生します: Aliasing illustration

信号はそれ自体に「折り返され」、が500Hz以下の周波数になるように表示されます

2)周波数が0から500の間であることを知るにはどうすればよいですか? FFTが周波数の限界を教えてくれませんか?

上記の「フォールディング」(ナイキスト周波数は一般に「フォールディング周波数」とも呼ばれます)により、500Hzを超える周波数がFFTに現れることは物理的に不可能です。高い周波数は「折り返し」、低い周波数として表示されます。

FFTは、周波数なしで振幅値のみを返しますか?

はい、MATLAB FFT関数は振幅の1つのベクトルのみを返します。ただし、渡される周波数ポイントにマップされます。

明確化が必要なものをお知らせください。さらにサポートさせていただきます。

37
kevlar1818

ここにはいくつかの誤解があります。

500を超える周波数canは、長さ1000のFFT結果で表されます。残念ながら、これらの周波数はすべてまとめられ、最初の500個のFFT結果ビンに混合されます。したがって、FFTは気にせず、高い周波数と低い周波数(エイリアシング)を混合して結果をきれいにするので、通常はサンプリングレートの半分以上の周波数を含む信号をFFTに送りたくないあまり役に立たない。そのため、データをサンプリングしてFFTに供給する前に、データをローパスフィルターする必要があります。

FFTは、FFTの長さだけでなく、FFT自体またはその入力の一部ではないデータのサンプルレートにも依存するため、周波数のない振幅を返します。任意のサンプルレートで同じ長さのFFTデータをフィードできるため、あらゆる範囲の周波数を取得できます。

結果のプロットが500で終了する理由は、実際のデータ入力に対して、FFTの長さの半分を超える周波数が、前半のデータのミラーリングされた繰り返し(複素共役)であるためです。それらは重複しているため、ほとんどの人は単にそれらを無視します。重複をプロットする理由FFTは、FFT複素数データ(実数成分と虚数成分の両方)を供給する人の結果の残りの半分を計算します。これにより、2つの異なる半分が作成されます。

10
hotpaw2

FFTとは何かの背景を読む必要があるようです(例 http://en.wikipedia.org/wiki/FFT )。しかし、あなたの質問に答えるには:

X軸(周波数)が500で終わるのはなぜですか?

入力ベクトルの長さは1000であるため、一般に、長さ-N入力波形のFFTは、長さ-N出力ベクトルになります。入力波形が実数である場合、出力は対称になるため、最初の501ポイントで十分です。

編集:(この例が時間領域ベクトルを埋めていることに気づかなかった。)

時間領域波形のサンプルレートは1 kHzであると宣言されているため、周波数は500 Hzになります。ナイキストサンプリング定理は、サンプルレートfsの信号が、fs/2の最大帯域幅を持つ(実際の)信号をサポートできることを示しています。

周波数が0から500の間であることを知るにはどうすればよいですか?

上記を参照。

FFTが周波数の限界を教えてくれませんか?

番号。

FFTは、周波数なしで振幅値のみを返しますか?

FFTは、すべての周波数ビンに振幅(および位相)を割り当てるだけです。

1