FFT位相スペクトルに困惑!


9

非常に単純なMATLAB実験:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

そしてここに出力があります: ここに画像の説明を入力してください

ここで、上記のコードスニペットに小さな変更を加えました。次のように、期間を1サンプルだけ短縮します。

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

そして、位相スペクトルは完全に狂っています:

ここに画像の説明を入力してください

質問:

  1. 最初のプロットでは、この例では200の正の周波数に対応するビン700にゼロ位相が表示されることを望んでいました。それはそうではないようです。次に、プロット1のグラフの線形部分がわかりません。いわゆる数値ノイズが原因で存在する可能性のある位相成分を理解していますが、そのノイズはどのようにして位相が「線形」になるのでしょうか。

  2. 2番目のプロットで、1つのサンプルのみを削除すると、位相プロットにそのような劇的な影響が出るのはなぜですか?

  3. ここで根本的に間違っていることをしていますか?

回答:


18

あなたは何も悪いことをしていませんが、あなたが見ることを期待すべきであるものについて注意深く考えていません。それが結果に驚いている理由です。質問1では、推測は近いですが、実際には逆のことが起こります。最初のノイズではなく、2番目のノイズを悩ませているのは数値ノイズです。

写真が役立つ場合があります。以下は、最初の試行の振幅と位相のプロットです。

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

ここに画像の説明を入力してください

ここに画像の説明を入力してください

そして2番目のもの:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

ここに画像の説明を入力してください

ここに画像の説明を入力してください

k/10000k999

k/10010k1000200/1000k/1001

一般に、位相角のグラフだけでは、まさにこの理由から、情報を伝達するための非常に悪い考えだと思います。最初に、低振幅のガベージの位相と実際の信号のどちらを見ているのかがわかりません。次に、変換不変ではなく、単純な入力に対して完全に当惑するグラフを取得するのは簡単です。さらに良いのは、位相情報を伝えるものを探している場合は、位相と振幅の情報を同じ視覚的な方法で同時に表現するグラフです。たとえば、位相が色相としてエンコードされ、大きさが輝度としてエンコードされるプロットなどです。

補遺:これは、前の段落で述べた原理を説明するMathematicaからの写真です。

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

11×11500×5001紫にマップします。これは、位相スペクトルが非シフト不変であり、したがって人間の視覚的理解を受け入れられないと言うとき、私が意味することです。たとえば、200データポイントの循環シフトでは、静的に見えるため、フェーズで何が起こっているかを知ることは完全に不可能ですが、入力信号は他の入力ケースよりも複雑ではありません。


0

信号の周波数またはFFTの長さを変化させて、信号がFFTアパーチャ内で正確に周期的なものとそうでないものとの間で変化するようにし、その信号の変化に対するピークマグニチュードビンの位相を見たくない場合は、 FFTアパーチャが最初ではなくFFTの場合、信号の初期位相を中心に参照できます(生成されたsin(t)の場合、FFTアレイの中心にt = 0を入れます)。


-1

Gaussian Wavesサイトでは、フェーズとそのランダムな動作に関する部分について詳しく説明しています。DumpsterDoofusが述べたように、浮動小数点エラーの問題だけです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.