MATLAB:

10

In MATLAB erfordern die Ausgaben der fftund / oder ifftFunktionen häufig eine zusätzliche Verarbeitung, bevor sie für die Analyse berücksichtigt werden.

Ich habe viele unterschiedliche Meinungen darüber gehört, was richtig ist:

  • Skalieren

    Mathworks gibt an, dass fftund ifftFunktionen auf den folgenden Gleichungen basieren:

    X[k]=11n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
  • Skalierung nach Signallänge

    Meine Kollegen skalieren die Daten normalerweise unmittelbar nach der Verarbeitung von . (Wir berücksichtigen die Rohdaten vor der Skalierung nicht.)1Nfft
    fft

    %% Führe fft aus
    X_f = fft (x, n_sample, 1) / n_sample; % fft muss durch die Anzahl der Proben in den Daten normalisiert werden. % Diese Konvention wurde vom Softwareentwickler (Mathworks) festgelegt.

    Ist das richtig?

    1. Wenn ja, warum erwartet die MATLAB- ifftFunktion, dass wir noch nicht um skaliert haben ?1/N
    2. Gibt es eine MATLAB- ifftFunktion oder eine Funktionsoption, die nicht automatisch um skaliert ?1/N

    Gibt es alternativ eine bessere Konvention, die wir beim Platzieren des ? Zum Beispiel, indem Sie das in das anstatt in das setzen oder ein in beide Gleichungen anstelle eines ?1 / N 1 / 1/N1/Nfftifft 1/N.1/N1/N

  • Skalierung nach Stichprobenzeitraum

    Ich habe gehört, dass die fftund ifft-Funktionen davon ausgehen, dass die Abtastperiode , und dass, damit die Funktionen wahr sind, Folgendes gelten müsste:Tsampling=1/fsampling=1

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

Siehe Links:

  • Link 1 (siehe Kommentar zu Matt Szelistowski von Dr. Seis)
  • Link 2 (siehe Antwort von Rick Rosson gegen die von Dr. Seis)
  • Link 3 (siehe Kommentar von Matt (Nachricht: 7/16) und Kommentar von Poorya (14/16)
  • Link 4 (siehe S. 10, Folie [1,1])
  • Link 5 (siehe S. 8 + 9) [anscheinend verwendet er die inverse Konvention für fft und ifft].

Ist das wahr?

Ich bin besonders verärgert, weil ich auf Wikipedia keine DFT- oder DTFT-Gleichungen finde, die den Stichprobenzeitraum enthalten.

kando
quelle
2
Übrigens, kando sagt es nur so wie es ist (mit MATLAB): aber ich muss sagen, dass diese festverdrahtete Konvention von MATLAB, DC in Bin # 1 zu setzen (oder die Amplitude der Frequenzkomponentekin Bink+1), mich verdammt nutz treibt !!!!
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

Antworten:

6

Ob die Vorwärts-FFT um 1 / N skaliert werden soll oder nicht, hängt davon ab, welches Ergebnis Sie für die weitere Analyse benötigen: Energie (Wahrung der Identität von Parseval) oder Amplitude (Messung von Höhe oder Volt usw.).

Wenn Sie Energie messen oder analysieren möchten, skalieren Sie nicht um 1 / N, und eine längere Sinuskurve mit derselben Amplitude führt zu einem größeren FFT-Ergebnis, proportional zur größeren Energie eines längeren Signals.

Etwas häufiger, wenn Sie Amplituden messen oder analysieren möchten, um eine längere Sinuskurve (also mit mehr Gesamtenergie bei genau derselben Amplitude) zu erhalten, die ungefähr das gleiche FFT-Ergebnis wie ein kürzeres Signal erzeugt, müssen Sie die Amplitude verkleinern FFT-Summierung durch ein Verhältnis proportional zur Länge. Das Verhältnis kann reference_length / N sein, was manchmal 1 / N ist, wenn die Systemeingangsverstärkung für alle Dimensionen oder Einheiten, einschließlich der Zeitintervalldimensionen, die Sie für Ihre weitere Analyse verwenden, 1,0 beträgt. Sie müssen proportional verkleinern, da eine DFT eine Summe ist: Je mehr Sie ähnliche Elemente zusammenfassen, desto größer ist das Ergebnis.

Damit. Energie oder Amplitude. Welche willst du?

Wenn Sie nun die Vorwärts-FFT verkleinern, sollten Sie die Inverse nicht so skalieren, dass IFFT (FFT (x)) == x. Oder umgekehrt.

Das 1 / sqrt (N) für die Skalierung scheint mir entweder zu sein, wenn man eine formale Symmetrie für einen Beweis benötigt, oder wenn man eine Art Hardware-Pipeline erstellt, in der die Latenz und / oder die Anzahl der arithmetischen Einheiten / Gates für die DFT und denn die IDFT muss identisch sein. Für eine typische Art der technischen Analyse erhalten Sie jedoch weder eine gute direkte Messung der Energie noch der Amplitude.

hotpaw2
quelle
Wenn Sie sagen "Wenn Sie Energie messen möchten, dann skalieren Sie nicht um " ... müsste ich nicht um 1 / skalieren1/N damit die Transformation einheitlich ist und Energie spart? Oder liegt es daran, dass ich das gesamte Signal quadrieren muss, um die Energie zu erhalten, dieeffektiv1/Nergibt? Wenn dies jedoch zutrifft, wie hochistdas mit1/ skalierte Spektrum ?1/N1/N zeigt es mir dann tatsächlich? 1/N
LCsa
Wenn Sie außerdem "also mit mehr Energie bei genau derselben Amplitude" sagen ... würden Sie nicht lieber "Frequenz" meinen?
LCsa
7

Die von Matlab verwendete Skalierungskonvention ist in DSP üblich. Sie können auch die einheitliche DFT verwenden, bei der sowohl die DFT als auch die IDFT um den Faktor 1 / skaliert werden . Sie können auch den Faktor1/Nfür die DFT und den Faktor1für die IDFT verwenden. Solange Sie konsistent sind, spielt es keine Rolle (abgesehen von numerischen Überlegungen, insbesondere bei der Verwendung von Festkomma-Implementierungen). Es gibt also keine "besseren" Konventionen, es gibt nur "Konventionen", und Sie müssen sich nur darauf einigen, welche Sie verwenden.1/N1/N1

Der Kommentar

% fft muss durch die Anzahl der Proben in den Daten normalisiert werden.
% Diese Konvention wurde vom Softwareentwickler (Mathworks) festgelegt.

ist falsch. Niemand sagt, dass Sie das Ergebnis der FFT normalisieren müssen . Wenn du willst, kannst du es tun.

Außerdem nimmt die FFT nichts über die Abtastperiode . Beachten Sie, dass die DFT für Daten verwendet werden kann, die von Natur aus diskret sind, ohne dass eine Stichprobe erforderlich ist. Abhängig von Ihren Daten und davon, was Sie mit dem Ergebnis machen möchten, müssen Sie T entsprechend berücksichtigen. Wenn Sie beispielsweise die DFT (von der FFT implementiert) verwenden möchten, um die zeitkontinuierliche Fourier-Transformation zu approximieren, erhalten Sie den folgenden Ausdruck:TT

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

wobei die Abtastperiode ist, N die DFT-Länge ist, x ( t ) das zeitkontinuierliche Signal ist und X ( ω ) seine zeitkontinuierliche Fourier-Transformation ist. Die rechte Seite von ( 1 ) ist nur die DFT von N Abtastwerten von x ( t ) , skaliert mit T , wobei wir annehmen, dass der relevante Teil von x ( t ) im Bereich t [ 0 , N T ] liegt.TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]. Weitere Einzelheiten zur Verwendung der DFT zur Approximation der zeitkontinuierlichen Fourier-Transformation finden Sie in dieser Antwort .

Matt L.
quelle
2
Wofür ist die Ablehnung? Bitte kommentieren.
Matt L.
1
Normalerweise stimme ich in geheimer Abstimmung ab, aber diesmal mache ich eine Ausnahme. Je nachdem, was man mit der DFT macht, gibt es sicherlich "bessere" Konventionen als andere. (aber keine Konvention ist unter allen Umständen besser als die anderen .)
Robert Bristow-Johnson
5

Zumal dies eine Frage zur Konvention ist, werde ich die lächerliche Konvention von MATLAB nicht verstärken und nur mit der richtigen und richtigen Konvention oder Konventionen antworten . dh MATLABs Indizierung für die DFT ist nicht richtig und richtig, aber ich bin ziemlich agnostisch in Bezug auf die drei gängigen Skalierungskonventionen.

Außerdem beschränke ich weder noch 0 k < N , sie können beliebige ganze Zahlen sein, weil ich ziemlich faschistisch über die grundlegende Bedeutung der diskreten Fourier-Transformation bin: Die DFT und die diskrete Fourier-Reihe sind eins und die gleich. Die DFT bildet eine periodische Sequenz x [ n ] mit der Periode N auf eine andere periodische Sequenz X [ k ] ebenfalls mit der Periode N ab, und die iDFT bildet sie zurück.0n<N0k<Nx[n]NX[k]N

also X [ k + N ] = X [ k ]

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

Außerdem wird die zirkuläre Faltung entweder im "Zeitbereich" ( ) oder im "Frequenzbereich" ( X [ k ] ) in Übereinstimmung mit allen Konventionen definiert:x[n]X[k]

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]

Der einzige Vorteil einer Konvention gegenüber der anderen (vorausgesetzt, beide Konventionen sind gültig) kann in der Einfachheit des Ausdrucks einiger Theoreme bestehen.


die gebräuchlichste Skalierungskonvention für die DFT:

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

hat den Vorteil der Einfachheit in Bezug auf kreisförmige Faltung in dem „Zeitbereich“

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

Es gibt jedoch einen Skalierungsfaktor, über den Sie sich Sorgen machen müssen, wenn Sie sich im "Frequenzbereich" zusammenschließen :

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

Der Satz von Parseval hat auch einen Skalierungsfaktor, über den man sich Sorgen machen muss.

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

und der Dualitätssatz:

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

die andere übliche Skalierungskonvention für die 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

es hat auch mehr Einfachheit hinsichtlich der kreisförmigen Faltung im Frequenzbereich

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

Es gibt jedoch einen Skalierungsfaktor, über den Sie sich Sorgen machen müssen, wenn Sie sich im Zeitbereich zusammenschließen :

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

Der Satz von Parseval hat auch einen Skalierungsfaktor, über den man sich Sorgen machen muss.

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

und der Dualitätssatz:

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

Die einheitliche Skalierungskonvention für die DFT ist in der Skalierung mit ihrer Inversen identisch und bewahrt die Energie über die Transformation oder die inverse Transformation hinweg:

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

Faltung im Zeitbereich oder im Frequenzbereich hat den gleichen Skalierungsfaktor, über den man sich Sorgen machen muss:

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

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

Der Satz von Parseval hat jedoch keinen Skalierungsfaktor, über den man sich Sorgen machen muss.

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

noch der Dualitätssatz:

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

robert bristow-johnson
quelle
Wenn es um DFT-Konventionen geht, geht es normalerweise nur um die Skalierungsfaktoren, nicht um die Nicht-Indizierung. Wenn Sie dachten, dass ich mich auf die Indizierung beziehe, als ich sagte, dass dies die übliche DSP-Konvention ist, dann war es ein Missverständnis. Natürlich habe ich mich auf die Skalierung bezogen; Die Indizierung ist völlig irrelevant, da sie nichts mit der Definition der DFT zu tun hat (und die Skalierung hat).
Matt L.
Es ist kein verdammtes "Nicht-Problem", wenn Sie in MATLAB die max(abs(X))Funktion verwenden, um herauszufinden, wo sich ein Spektralpeak befindet, und Sie vergessen, 1vom zurückgegebenen Index zu subtrahieren, und Sie werden damit rechnen. Es ist ein Problem. und eine traurige noch dazu. Der Indexierungsursprung hat ebenso viel mit der " Definition der DFT" zu tun wie die Skalierung. es hat damit zu tun, welche Buchhaltung erforderlich ist oder nicht.
Robert Bristow-Johnson
Ich hätte es sein können, aber diesmal ist es nicht :) Trotzdem stimme ich der Bedeutung, die Sie der Indizierung beimessen, nicht zu, aber ich weiß zu schätzen, dass dies persönlich ist. Wieder keine Ablehnung, weil ich die Zeit schätze, die Sie in die Antwort gesteckt haben.
Matt L.