50

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

時間領域

周波数領域に変換すると、ノイズを含む信号 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)|')

周波数領域

4

4 に答える 4

40

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

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

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

2 番目のプロットの周波数軸は、0 からFs/2、つまりサンプリング周波数の半分になります。 ナイキスト周波数は常にサンプリング周波数の半分です。これを超えるとエイリアシングが発生するためです。エイリアシングの図

信号はそれ自体で「折り返し」、500Hz 以下の周波数のように見えます。

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

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

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

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

さらにサポートできるように、明確にする必要があることをお知らせください。

于 2012-05-25T16:55:07.230 に答える
10

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

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

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

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

于 2012-05-25T18:46:41.110 に答える
1

FFTとは何かについて、ある程度の背景知識が必要なようです(例: http: //en.wikipedia.org/wiki/FFT)。しかし、あなたの質問に答えるために:

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

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

編集:( 例が時間領域ベクトルを埋めていることに気づきませんでした。)

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

周波数が0から500の間であることをどうやって知ることができますか?

上記を参照。

FFTは、周波数がどの限界にあるかを教えてはいけませんか?

いいえ。

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

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

于 2012-05-25T16:49:37.257 に答える
-1

X 軸が 500 Hz までの周波数のみをプロットする理由は、コマンド ステートメント「f = Fs/2*linspace(0,1,NFFT/2+1);」です。. Fs は 1000 です。したがって、それを 2 で割り、0 から 1 の範囲の値を掛けると、長さ NFFT/2+1 のベクトルが返されます。このベクトルは、0 ~ Fs/2 (つまり 500 Hz) の範囲の等間隔の周波数値で構成されます。' plot(f,2*abs(Y(1:NFFT/2+1))) ' コマンドを使用してプロットするため、X 軸の制限は 500 Hz です。

于 2016-11-03T05:36:36.527 に答える