In MATLAB erfordern die Ausgaben der fft
und / oder ifft
Funktionen 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
fft
undifft
Funktionen auf den folgenden Gleichungen basieren:Skalierung nach Signallänge
Meine Kollegen skalieren die Daten normalerweise unmittelbar nach der Verarbeitung von . (Wir berücksichtigen die Rohdaten vor der Skalierung nicht.)
fft
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?
- Wenn ja, warum erwartet die MATLAB-
ifft
Funktion, dass wir noch nicht um skaliert haben ? - Gibt es eine MATLAB-
ifft
Funktion oder eine Funktionsoption, die nicht automatisch um skaliert ?
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 / √
fft
ifft
1/N.- Wenn ja, warum erwartet die MATLAB-
Skalierung nach Stichprobenzeitraum
Ich habe gehört, dass die
fft
undifft
-Funktionen davon ausgehen, dass die Abtastperiode , und dass, damit die Funktionen wahr sind, Folgendes gelten müsste:
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.
Antworten:
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.
quelle
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 / N.- -- -√ 1 / N. 1
Der Kommentar
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:T. T.
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.T. N. x ( t ) X.( ω ) ( 1 ) N. x ( t ) T. x ( t ) t ∈ [ 0 , N.T.]] . Weitere Einzelheiten zur Verwendung der DFT zur Approximation der zeitkontinuierlichen Fourier-Transformation finden Sie in dieser Antwort .
quelle
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.0 ≤ n < N 0 ≤ k < N x [ n ] N. X.[ k ] N.
also X [ k + N ] = X [ k ]
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 ]
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:
hat den Vorteil der Einfachheit in Bezug auf kreisförmige Faltung in dem „Zeitbereich“
Es gibt jedoch einen Skalierungsfaktor, über den Sie sich Sorgen machen müssen, wenn Sie sich im "Frequenzbereich" zusammenschließen :
Der Satz von Parseval hat auch einen Skalierungsfaktor, über den man sich Sorgen machen muss.
und der Dualitätssatz:
die andere übliche Skalierungskonvention für die DFT:
es hat auch mehr Einfachheit hinsichtlich der kreisförmigen Faltung im Frequenzbereich
Es gibt jedoch einen Skalierungsfaktor, über den Sie sich Sorgen machen müssen, wenn Sie sich im Zeitbereich zusammenschließen :
Der Satz von Parseval hat auch einen Skalierungsfaktor, über den man sich Sorgen machen muss.
und der Dualitätssatz:
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:
Faltung im Zeitbereich oder im Frequenzbereich hat den gleichen Skalierungsfaktor, über den man sich Sorgen machen muss:
Der Satz von Parseval hat jedoch keinen Skalierungsfaktor, über den man sich Sorgen machen muss.
noch der Dualitätssatz:
quelle
max(abs(X))
Funktion verwenden, um herauszufinden, wo sich ein Spektralpeak befindet, und Sie vergessen,1
vom 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.