11

単純な概念とは何かを理解するのに苦労しています。実数で対称な MATLAB でベクトルを作成しました。MATLAB で FFT を実行すると、フーリエ変換の対称規則では、実対称関数の FT も実対称である必要があると規定されているにもかかわらず、結果にかなりの虚数成分が含まれます。私のコード例:

N = 1 + 2^8;
k = linspace(-1,1,N);

V = exp(-abs(k));

Vf1 = fft(fftshift(V));
Vf2 = fft(ifftshift(V));
Vf3 = ifft(fftshift(V));
Vf4 = ifft(ifftshift(V));
Vf5 = fft(V);
Vf6 = ifft(V);

disp([isreal(Vf1) isreal(Vf2) isreal(Vf3) isreal(Vf4) isreal(Vf5) isreal(Vf6)])

結果:

0 0 0 0 0 0

実対称ベクトルの組み合わせ(i)fftや結果はありません。偶数と奇数の両方の N ( vs. )(i)fftshiftを試しました。N = 2^8N = 1+2^8

を調べてみたところk+flip(k)、 のオーダーの残差がいくつかありますeps(1)が、残差も対称であり、FFT の虚数部は のオーダーでファズとして出てくるのではeps(1)なく、実部に匹敵する大きさで出てきます。

私が見逃しているのは、目がくらむほど明白なことですか?

私が見逃していた盲目的に明らかなこと:

FFT は全空間にわたる積分ではないため、周期的な信号を想定しています。上記では、偶数を選択した期間の最後のポイントを複製しているNため、存在しない分数インデックスなしで最初にゼロ周波数を配置するようにシフトする方法はありません。

の私の選択について一言k。それは任意ではありません。私が解決しようとしている実際の問題は、モデル FTIR インターフェログラムを生成し、FFT してスペクトルを取得することです。k波数の周波数に変換される干渉計が移動する距離です。実際の問題では、生成関数 V が物理的に意味のある数値を生成するように、さまざまな倍率が存在します。

4

4 に答える 4

2

「k = linspace(-1,1,N);」の後に次の行を追加するだけです。

k(end)=[];

配列の最後の要素を削除します。これは、対称配列であると定義されています。

isreal(complex(1,0)) が false であることも考慮してください!!! isreal 関数は、メモリ ストレージ形式をチェックするだけです。したがって、上記の例では 1+0i は実数ではありません。

実数をチェックするために関数を定義しました(このように)

myisreal=@(x) all((abs(imag(x))<1e-6*abs(real(x)))|(abs(x)<1e-8));

最後に、ソース コードは次のようになります。

N = 1 + 2^8;
k = linspace(-1,1,N);

k(end)=[];

V = exp(-abs(k));


Vf1 = fft(fftshift(V));

Vf2 = fft(ifftshift(V));
Vf3 = ifft(fftshift(V));
Vf4 = ifft(ifftshift(V));
Vf5 = fft(V);
Vf6 = ifft(V);

myisreal=@(x) all((abs(imag(x))<1e-6*abs(real(x)))|(abs(x)<1e-8));

disp([myisreal(Vf1) myisreal(Vf2) myisreal(Vf3) myisreal(Vf4) myisreal(Vf5) myisreal(Vf6)]);
于 2015-09-26T03:59:10.700 に答える