MATLAB FFT周波数の次数


9

このウィキブックでは、MATLABの出力は次のFFTように順序付けられた波数に対応していると述べています。

k={0,1,...,n2,n2+1,n2+2,...,1}

ただし、同じページのコード例では、波数は次のようにコード化されています。

k = [0:n/2-1 0 -n/2+1:-1];

これは最初のものと同じですが、波数(「最大波数」)が0に置き換えられています。彼らが0を 2回含むのは奇妙に思えます。n/200

wikibookで説明されているように、フーリエ変換を介して導関数を取得するには正しい順序が必要であるようです。これらのうち正しいものはどれですか。MATLABはこれをどこかに文書化していますか?


3
関数fftshiftを調べます。これは、fftの出力を受け取り、[-n / 2 + 1:n / 2-1]から並べ替えます。これは、混乱を防ぐのに役立ちます。
Godric Seer 2013

これは、自分ですぐにテストできるものではありませんか?FFTの出力がどの順序であるかは、2、3の実験で簡単に判断できます。
フェデリコポローニ2018年

回答:


4

私はコメントを拡張して、元の例よりも理解しやすい方法で参照する例を作り直し、なぜfft係数を元の方法で返すのかを説明したいと思います。

参考までに、例のfft部分は次のとおりです。

Nx = size(x,2);
k = 2*pi/(b-a)*[0:Nx/2-1 0 -Nx/2+1:-1];
dFdx = ifft(1i*k.*fft(f));
d2Fdx2 = ifft(-k.^2.*fft(f));

そのすぐ下に別のコードセクションを追加しました。

Nx = size(x,2);
k = 2*pi/(b-a)*(-Nx/2:Nx/2-1);
dFdxp = ifft(ifftshift(1i*k.*fftshift(fft(f))));
d2Fdx2p = ifft(ifftshift(-k.^2.*fftshift(fft(f))));

tic; tocラフなタイミングのために、両方のコードをで囲みました。より読みやすい形式では、2番目の方法は次のものを使用します。

ckf = fftshift(fft(f));
ckdf = 1i*k.*ckf;
df = ifft(ifftshift(ckdf));

最初の違いは、2番目の例の方がはるかに直感的であることkです。これが2番目の例の主な利点です。kは、私たちが考える形になっているからです。2行目と3行目では、fftshiftへの呼び出しの前後に追加する必要がありfft、次にへの呼び出しのifftshift内部に直接呼び出しますifft。これらの追加の関数呼び出しは、コンピューターが係数を操作するために必要なものから、人間が通常それらを考える方法まで、係数を並べ替えます。

2番目の例の問題は、k私たちにとってはより直感的ですが、これにより、fftあまり有利でない形式で解いたり反転したりするための内部行列が残ることです。だから我々はへの呼び出しで順番を切り替えてどちらかfftswitchifftswitchか、それはハードにコード化する必要があるfft機能。これはユーザーからのエラーの可能性は低くなります(多くの人がそうであるように、ユーザーがfftの動作に不慣れであると想定します)が、実行時に料金を支払います。

前に述べたように、比較のために2つのブロックの周りにタイミングコールを追加し、複数のNに対して実行しました。タイミングの結果は次のとおりです。

N =     1000,  Ex1 = 0.000222 s,   Ex2 = 0.007072 s
N =    10000,  Ex1 = 0.001576 s,   Ex2 = 0.003506 s
N =   100000,  Ex1 = 0.023857 s,   Ex2 = 0.034051 s
N =  1000000,  Ex1 = 0.213816 s,   Ex2 = 0.406250 s
N = 10000000,  Ex1 = 4.555143 s,   Ex2 = 7.102348 s

ご覧のように、値を前後に切り替える動作は、特にNが低い場合(30倍遅い)、プロセスをかなり遅くします。これはほんの一例であり、メモリ速度、プロセッサコア/速度などによって、お使いのコンピュータに若干異なる傾向が見られる場合がありますが、これはポイントの例示です。fft出力が混乱する理由は、計算時間の重要な部分を節約できるためです。


3
これでも元の質問の答えにはなりません-なぜゼロを2回含めるのになぜまったく機能しないのですか?そしてなぜドキュメントはゼロが一度だけ含まれるべきであると示唆しているのですか?
David Ketcheson、2015年

2

波数の「置換」に関する質問はかなりトリッキーです。一般に、この種の波数変更は、一部がここで示唆しているように、フロップを保存することを意図したものではなく、たとえば特定の微分演算子の分析特性を尊重するように設計されています。TrefethenのSpectral Methodsに関連する議論が見つからなかったことに非常に驚いています。先に進むには、FFTベースのスペクトル微分に関心があり、カーディナリティが偶数のドメインで変換を実行していると仮定します。

奇数の導関数の経験則は、

k = [0:n/2-1 0 -n/2+1:-1];

そして、導関数でさえ、

k = [0:n/2 -n/2+1:-1];

パディングを処理している場合、ナイキスト周波数の処理は同様に面倒です。ここにこれらのトピックを証明し、解説する優れた記事があります



0

NN/2xRN/2N/2N/2

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