MATLAB:


11

MATLABでは、fftおよび/ ifft関数の出力は、分析の対象となる前に追加の処理を必要とすることがよくあります。

私は何が正しいのかについて多くの異なる意見を聞いています:

  • スケーリング

    Mathworksによるとfftifft関数は次の方程式に基づいています:

    X[k]=11n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
  • 信号長によるスケーリング

    私の同僚は通常、データを1だけスケーリングします1Nすぐに処理した後fft
    fftスケーリング前の生データは考慮していません。)

    %% fftを実行
    X_f = fft(x、n_sample、1)/ n_sample; %fftは、データのサンプル数で正規化する必要があります。 %この規則は、ソフトウェア開発者(Mathworks)によって設定されました。

    これは正しいです?

    1. その場合、MATLAB ifft関数はなぜスケーリングされていないことを期待するのですか?1/N
    2. 1 / Nでifft自動的にスケーリングしないMATLAB 関数または関数オプションはありますか?1/N

    または、配置するときに使用するより良い規則がありますか?たとえば、1 / Nをではなくに配置する、または1 / √を配置する1/N1/Nfftifftの代わりに、両方式において、1/N1/N1/N

  • サンプリング周期によるスケーリング

    fftifft関数は、サンプリング周期想定しており、関数がtrueになるためには、次のようにする必要があると聞きました。適用:Tsampling=1/fsampling=1

X[k]=1Tsamplingn=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=TsamplingNk=1NX[k]e+j2π(k1)(n1)N,where1nN

リンクを参照してください。

  • リンク1(Seis博士によるMatt Szelistowskiへのコメントを参照)
  • リンク2(リックロッソンの回答とサイス博士の回答を参照)
  • リンク3(Mattによるコメント(メッセージ:7/16)およびPooryaによるコメント(14/16)を参照)
  • リンク4(10ページのスライド[1,1]を参照)
  • リンク5(ページ8 + 9を参照)[fftとifftの逆の規則を使用しているようです]

これは本当ですか?

ウィキペディアでサンプリング期間を含むDFTまたはDTFT方程式を見つけることができないので、私は特にうんざりしています。


2
ところで、kandoはそのまま(MATLABを使用して)こう述べています:が、私はMATLABのこのハードワイヤード大会(または周波数成分の振幅ビン#1にDCを配置することを言っているのkビンにK+1私はnutzクソドライブ!!!!
X[k]=n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
kk+1
robert bristow-johnson 2016

回答:


6

順方向FFTを1 / Nでスケーリングするかどうかは、エネルギー(ParsevalのIDを保持)または振幅(高さやボルトの測定など)を分析する結果によって異なります。

エネルギーを測定または分析する場合は、1 / Nでスケーリングしないでください。同じ振幅の長い正弦波は、長い信号の大きいエネルギーに比例して、より大きなFFT結果を生成します。

少し一般的ですが、振幅を測定または分析したい場合は、長い正弦波(つまり、まったく同じ振幅で総エネルギーが多い)を得て、短い信号とほぼ同じFFT結果を生成するには、長さに比例する比率によるFFT合計。比率はreference_length / Nになる可能性があります。これは、システムの入力ゲインが、時間間隔の次元を含め、以降の分析で使用することを選択した次元または単位に対して1.0の場合、1 / Nになることがあります。DFTは合計であるため、比例的にスケールダウンする必要があります。同様のアイテムを合計するほど、結果は大きくなります。

そう。エネルギーまたは振幅。どちらがいいですか?

ここで、順方向FFTを縮小する場合、逆数を縮小してIFFT(FFT(x))== xになるようにしないでください。またはその逆。

スケーリングの1 / sqrt(N)は、証明のために形式的な対称性が必要な場合、またはDFTのレイテンシや演算ユニット/ゲートの数またはその両方である種のハードウェアパイプラインを構築する場合のいずれかに当てはまるようです。 IDFTは同一である必要があります。しかし、典型的なタイプのエンジニアリング分析では、エネルギーや振幅を直接測定することはできません。


「エネルギーを測定したい場合は、スケーリングしないでください」... 1 / √でスケーリングする必要はありません。1/N変換が単一であり、エネルギーを保存するように?それとも、信号全体を二乗して1/Nを効果的に得るエネルギーを得るために必要なのでしょうか。しかし、それが真実である場合、スペクトル1/ √でスケーリングされますか1/N1/N実際に私を示していますか?1/N
LCsa 2017

さらに、「したがって、まったく同じ振幅でより多くのエネルギーを持つ」と言うとき...むしろ「周波数」を意味しませんか?
LCsa 2017

7

Matlabで使用されるスケーリング規則はDSPで一般的です。また、DFTとIDFTの両方を1 / 倍にスケーリングしたユニタリDFTを使用することもできます。。DFTには係数1/Nを使用し、IDFTには係数1を使用することもできます。一貫している限り、特に問題はありません(特に、固定小数点の実装を使用する場合は、数値の考慮事項を除きます)。したがって、「より良い」規約はなく、「規約」があります。使用する規約に同意する必要があります。1/N1/N1

コメント

%fftは、データのサンプル数で正規化する必要があります。
%この規則は、ソフトウェア開発者(Mathworks)によって設定されました。

間違っている。FFTの結果を正規化する必要があると言う人はいませ。あなたがしたいなら、あなたはそれをするのは自由です。

また、FFTはサンプリング周期について何も想定していません。DFTは、サンプリングを行わずに本質的に離散しているデータに使用できることに注意してください。データと結果で何をしたいかに応じて、それに応じてTを考慮する必要があります。たとえば、DFT(FFTで実装)を使用して連続時間フーリエ変換を近似する場合、次の式が得られます。TT

(1)X(2πkNT)Tn=0N1x(nT)ej2πkn/N,0k<N

ここで、はサンプリング周期、NはDFT長、x t は連続時間信号、X ω はその連続時間フーリエ変換です。右側1 だけのDFTであるN個のサンプルX T によってスケーリングされた、T我々はの関連部分と仮定し、X tはの範囲内であるT [ 0 N T ]TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]。DFTを使用して連続時間フーリエ変換を近似する方法の詳細については、この回答を参照してください


2
反対票は何ですか?コメントしてください。
Matt L.

1
私は通常秘密投票で投票しますが、今回は例外とします。DFTで何をしているのかに応じて、他の規則よりも確かに「より良い」規則があります。(しかし、どのような慣習も他のどの状況よりも優れています。)
robert bristow-johnson '6/07/20

5

特にこれは規約に関する質問であるため、MATLABのばかげた規約を強化せず、適切かつ適切な規約でのみ回答します。つまり、DFTに対するMATLABのインデックス付けは正しくなく適切ではありませんが、3つの一般的なスケーリング規則のどれがどれであるかについては、かなり理解がありません。

また、私はいない制限0 K < N、彼らは私が離散フーリエ変換の基本的な意味についてかなり多くのファシストをしていますので、任意の整数を指定できますDFTと離散フーリエ級数は1と同じ。DFTは周期的な配列をマップX [ N ]の周期でN別の周期的な配列にX [ K ]の周期でもN及びIDFTは戻ってそれをマッピングします。0n<N0k<Nx[n]NX[k]N

したがって、 X [ K + N ] = X [ K ]

x[n+N]=x[n] nZ
X[k+N]=X[k] kZ

また、「時間領域」x [ n ])または「周波数領域」X [ k ])のいずれかの循環たたみ込みは、すべての規則に従って一貫して定義されます。x[n]X[k]

W [ K ] X [ K ] N - 1 Σ I =

h[n]x[n]i=0N1h[i]x[ni]=i=0N1x[i]h[ni]
W[k]X[k]i=0N1W[i]X[ki]=i=0N1X[i]W[ki]

したがって、一方の規則がもう一方の規則よりも優れている(両方の規則が有効であると仮定した場合)のは、いくつかの定理の表現の単純さに関する場合のみです。


DFTの最も一般的なスケーリング規則:

DFT{x[n]}X[k]n=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

「時間領域」での循環たたみ込みに関する単純さの利点

DFT{h[n]x[n]}=H[k]X[k]

あなたがで畳み込むしている場合は、あなたが持っているスケーリング係数は、心配することはあり、「周波数ドメイン」

iDFT{W[k]X[k]}=1Nw[n]x[n]

パーセバルの定理には、スケーリング係数も心配されます。

n=0N1|x[n]|2=1Nk=0N1|X[k]|2

そして双対定理:

DFT{X[n]}=Nx[k]
iDFT{x[k]}=1NX[n]

DFTの他の一般的なスケーリング規則:

iDFT{X[k]}x[n]k=0N1X[k]e+j2πkn/NDFT{x[n]}X[k]=1Nn=0N1x[n]ej2πkn/N

ejωknej(2πk/N)nX[k]x[n]kNA|X[k]|=|X[k]|=|X[Nk]|=A2

また、周波数領域での循環たたみ込みに関してもより簡単です

iDFT{W[k]X[k]}=w[n]x[n]

しかし、時間領域でたたみ込みをしている場合は、注意しなければならないスケーリング係数があります

DFT{h[n]x[n]}=1NH[k]X[k]

パーセバルの定理には、スケーリング係数も心配されます。

1Nn=0N1|x[n]|2=k=0N1|X[k]|2

そして双対定理:

DFT{X[n]}=1Nx[k]
iDFT{x[k]}=NX[n]

DFT のユニタリスケーリング規則は、その逆のスケーリングと同じであり、変換または逆変換全体でエネルギーを保持します。

DFT{x[n]}X[k]1Nn=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

時間領域または周波数領域でのたたみ込みには、同じスケーリングファクターがあります

DFT{h[n]x[n]}=1NH[k]X[k]

iDFT{W[k]X[k]}=1Nw[n]x[n]

しかし、Parsevalの定理には、心配するスケーリング係数がありません。

n=0N1|x[n]|2=k=0N1|X[k]|2

また、双対定理はありません:

DFT{X[n]}=x[k]
iDFT{x[k]}=X[n]


DFT規則について話すとき、それは通常、スケーリング係数についてのみであり、索引付けの問題以外の問題ではありません。それが一般的なDSPの慣習だと言ったときに、私が索引付けを参照していると思ったなら、それは誤解でした。もちろんスケーリングについて言及しました。索引付けはDFT の定義とは何の関係もない(そしてスケーリングはそうである)ため、まったく無関係です。
Matt L.

これは、MATLABでmax(abs(X))関数を使用してスペクトルピークの場所を見つけ1、返されたインデックスから減算するのを忘れて、それに対して計算を実行する場合は、まったく「問題」ではありません。それは問題です。それに悲しいもの。インデックスの原点は、スケーリングと同様に「DFTの定義」と関係があります。簿記が必要かどうかに関係します。
robert bristow-johnson 2016

私だったかもしれませんが、今回はそうではありません:)それでも、あなたがインデックス付けに付ける重要性に同意しませんが、それは個人的なものであることを感謝します。繰り返しますが、回答に時間を割いていただきありがとうございます。
Matt L.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.