In den meisten Beispielen und im FFT-Code, die ich gesehen habe, wird die Ausgabe (Frequenzgrößen) der Vorwärts-DFT-Operation mit N skaliert - dh anstatt Ihnen die Größe jedes Frequenzbereichs anzugeben, erhalten Sie das N-fache der Größe.
Im Betrieb liegt dies einfach daran, dass die DFT berechnet wird, indem das innere Produkt des Signals mit jedem Basissinus (dh nicht normalisierte Korrelation) genommen wird. Dies beantwortet jedoch nicht die philosophische Frage, warum wir nicht einfach durch N dividieren, bevor wir die Ausgabe zurückgeben.
Stattdessen teilen sich die meisten Algorithmen bei der Neusynthese durch N.
Dies scheint mir kontraintuitiv zu sein und (sofern ich nichts vermisse) macht es alle Erklärungen der DFT sehr verwirrend.
In jedem Szenario, das ich mir vorstellen kann, ist die tatsächliche Größe (nicht die Größe * N) der Wert, den ich aus einer DFT-Operation benötige, und die normalisierte Größe ist der Wert, den ich in eine IDFT-Operation eingeben möchte.
Warum ist die DFT nicht als DFT / N und die IDFT nicht als einfache Summe von Sinuskurven normalisierter Größe definiert?
quelle
Antworten:
Ob Sie die Ausgabe Ihrer DFT skalieren, vorwärts oder rückwärts, hat nichts mit Konvention oder dem, was mathematisch sinnvoll ist, zu tun. Es hat alles mit der Eingabe in die DFT zu tun. Lassen Sie mich einige Beispiele zeigen, bei denen die Skalierung sowohl für die Vorwärts- als auch für die Rücktransformation erforderlich ist oder nicht.
Muss eine Vorwärtstransformation um 1 / N skalieren.
Zunächst sollte klar sein, dass für die Analyse einer einfachen Sinuswelle die Länge der Transformation mathematisch gesehen irrelevant sein sollte. Angenommen, N = 1024, Freq = 100 und Ihr Signal ist:
f (n) = cos (Freq * 2 * Pi * n / N)
Wenn Sie eine DFT von 1024 Punkten von f (n) nehmen, werden Sie feststellen, dass bin [100] = 512. Dies ist jedoch kein aussagekräftiger Wert, bis Sie ihn auf N skalieren. 512/1024 = 1/2 und natürlich Die andere Hälfte liegt im negativen Spektrum von bin [924].
Wenn Sie die Länge der DFT verdoppeln, N = 2048, sind die Ausgabewerte doppelt so groß wie die der 1024-Punkt-DFT, was die Ergebnisse wiederum bedeutungslos macht, es sei denn, wir skalieren mit 1 / N. Die Länge der DFT sollte bei solchen Analysen keine Rolle spielen. In diesem Beispiel müssen Sie die DFT also um 1 / N skalieren.
Darf keine Vorwärtstransformation skalieren.
Angenommen, Sie haben die Impulsantwort eines FIR-Filters mit 32 Abgriffen und möchten dessen Frequenzgang kennen. Der Einfachheit halber wird ein Tiefpassfilter mit einer Verstärkung von 1 angenommen. Wir wissen, dass für dieses Filter die Gleichstromkomponente der DFT 1 sein muss. Und es sollte klar sein, dass dies unabhängig von der Größe des Filters der Fall ist DFT, weil die Gleichstromkomponente einfach die Summe der Eingangswerte ist (dh die Summe der FIR-Koeffizienten).
Daher wird für diese Eingabe die DFT nicht mit 1 / N skaliert, um eine aussagekräftige Antwort zu erhalten. Aus diesem Grund können Sie eine Impulsantwort so weit auf Null setzen, wie Sie möchten, ohne das Ergebnis der Transformation zu beeinflussen.
Was ist der grundlegende Unterschied zwischen diesen beiden Beispielen?
Die Antwort ist einfach. Im ersten Fall haben wir für jede Eingangsprobe Energie geliefert. Mit anderen Worten, die Sinuswelle war für alle 1024 Samples vorhanden, daher mussten wir die Ausgabe der DFT auf 1/1024 skalieren.
Im zweiten Beispiel haben wir per Definition nur für 1 Probe Energie geliefert (der Impuls bei n = 0). Es dauerte 32 Abtastungen, bis der Impuls den 32-Stufen-Filter durchlaufen hatte, aber diese Verzögerung ist irrelevant. Da wir für 1 Probe Energie geliefert haben, skalieren wir die Ausgabe der DFT auf 1. Wenn ein Impuls mit 2 Energieeinheiten anstelle von 1 definiert würde, würden wir die Ausgabe auf 1/2 skalieren.
Eine inverse Transformation darf nicht skaliert werden.
Betrachten wir nun eine inverse DFT. Wie bei der Forward-DFT müssen wir die Anzahl der Proben berücksichtigen, die wir mit Energie versorgen. Natürlich müssen wir hier etwas vorsichtiger sein, da wir sowohl die positiven als auch die negativen Frequenzbereiche entsprechend füllen müssen. Wenn wir jedoch einen Impuls (dh eine 1) in zwei entsprechende Bins platzieren, ist das resultierende Ausgangssignal der inversen DFT eine Kosinuswelle mit einer Amplitude von 2, unabhängig davon, wie viele Punkte wir in der inversen DFT verwenden.
Daher skalieren wir wie bei der Vorwärts-DFT die Ausgabe der inversen DFT nicht, wenn die Eingabe ein Impuls ist.
Eine inverse Transformation muss skaliert werden.
Betrachten Sie nun den Fall, in dem Sie den Frequenzgang eines Tiefpassfilters kennen und eine inverse DFT durchführen möchten, um dessen Impulsantwort zu erhalten. Da wir in diesem Fall an allen Punkten Energie liefern, müssen wir die Leistung der DFT um 1 / N skalieren, um eine aussagekräftige Antwort zu erhalten. Dies ist nicht ganz so offensichtlich, da die Eingabewerte komplex sind. Wenn Sie jedoch ein Beispiel durcharbeiten, werden Sie feststellen, dass dies zutrifft. Wenn Sie nicht mit 1 / N skalieren, haben Sie Spitzenimpulsantwortwerte in der Größenordnung von N, was bei einer Verstärkung von 1 nicht der Fall sein kann.
Die vier Situationen, die ich gerade beschrieben habe, sind Endpunktbeispiele, bei denen klar ist, wie die Ausgabe der DFT skaliert wird. Zwischen den Endpunkten befindet sich jedoch viel Grauzone. Betrachten wir also ein weiteres einfaches Beispiel.
Angenommen, wir haben das folgende Signal mit N = 1024, Freq = 100:
Beachten Sie die Unterschiede in Amplitude, Frequenz und Dauer für die drei Komponenten. Leider zeigt die DFT dieses Signals alle drei Komponenten auf dem gleichen Leistungspegel an, obwohl die 2. Komponente 1/36 des Leistungspegels der anderen beiden hat.
Die Tatsache, dass alle drei Komponenten dieselbe Energiemenge liefern, ist offensichtlich, was die DFT-Ergebnisse erklärt, aber hier muss ein wichtiger Punkt beachtet werden.
Wenn wir die Dauer für die verschiedenen Frequenzkomponenten kennen, können wir die verschiedenen Frequenzbereiche entsprechend skalieren. In diesem Fall würden wir dies tun, um die Ausgabe der DFT genau zu skalieren: bin [100] / = 128; bin [200] / = 768; bin [400] / = 128;
Was mich zu meinem letzten Punkt bringt; Im Allgemeinen wissen wir nicht, wie lange eine bestimmte Frequenzkomponente am Eingang unserer DFT vorhanden ist, daher können wir diese Art der Skalierung möglicherweise nicht durchführen. Im Allgemeinen liefern wir jedoch Energie für jeden Abtastpunkt, weshalb wir die Vorwärts-DFT bei der Analyse eines Signals um 1 / N skalieren sollten.
Um die Sache zu komplizieren, würden wir mit ziemlicher Sicherheit ein Fenster auf dieses Signal anwenden, um die spektrale Auflösung der DFT zu verbessern. Da sich die erste und dritte Frequenzkomponente am Anfang und Ende des Signals befinden, werden sie um 27 dB gedämpft, während die mittlere Komponente nur um 4 dB gedämpft wird (Hanning-Fenster).
Um klar zu sein, der Ausgang der DFT kann eine ziemlich schlechte Darstellung des Eingangs, skaliert oder nicht.
Bei der inversen DFT, bei der es sich normalerweise um ein rein mathematisches Problem handelt, ist die Eingabe in die DFT im Gegensatz zur Analyse eines unbekannten Signals klar definiert, sodass Sie wissen, wie die Ausgabe skaliert wird.
Bei der Analyse eines Signals mit einem Spektrumanalysator (analog oder FFT) sind die Probleme ähnlich. Sie kennen die Leistung des angezeigten Signals nur, wenn Sie auch den Arbeitszyklus kennen. Aber auch dann wirken sich die Fensterung, die Spanne, die Abtastraten, die Filterung, der Detektortyp und andere Faktoren auf das Ergebnis aus.
Letztendlich muss man beim Wechsel zwischen den Zeit- und Frequenzbereichen sehr vorsichtig sein. Die Frage, die Sie bezüglich der Skalierung gestellt haben, ist wichtig. Ich hoffe, Sie müssen die Eingabe für die DFT verstehen, um die Ausgabe skalieren zu können. Wenn der Input nicht klar definiert ist, muss der Output der DFT mit großer Skepsis betrachtet werden, egal ob Sie ihn skalieren oder nicht.
quelle
Ich kann mir mehrere Gründe vorstellen, die Probleme mit der Rechengenauigkeit betreffen, aber das würde wahrscheinlich nicht gerecht werden, da wir sie mathematisch auf die gleiche Weise definieren, egal was passiert, und die Mathematik keine Präzisionsprobleme kennt.
Hier ist meine Meinung dazu. Überlegen wir uns konzeptionell, was DFT im Sinne der Signalverarbeitung bedeutet, und nicht nur als reine Transformation. In diesem Fall scheint mir die Anwendung von DFT auf ein Signal und auf ein System den Wunsch nach unterschiedlichen Ergebnissen zu wecken.
Wenden wir zum Beispiel die DFT auf ein konstantes Signal mit dem Wert 1 an. Nehmen wir auch an, dass dieses Signal eine endliche Länge und eine Länge von 16 Taps hat. Was wollen wir in diesem Fall von DFT? Offensichtlich möchten wir, dass es uns sagt, welche Amplitude jede Frequenzkomponente des Signals hat. Es ist klar, dass unser Signal eine einzelne Komponente aus Frequenz 0 und Amplitude 1 hat. Die DFT gibt uns jedoch eine einzelne Spitze bei Bin 0 und Höhe 16! In diesem Fall ist Ihre Frustration über die Definition der DFT durchaus sinnvoll. Wir sollten die Analysekoeffizienten skalieren, nicht die Synthesekoeffizienten.
Okay, jetzt analysieren wir dasselbe Zahlenarray, nämlich unsere Folge von 16, aber in diesem Fall als System. Was soll der Frequenzgang eines Systems konzeptionell bedeuten? Die meisten Leute werden sagen, dass es die Amplitude des Ausgangs im Vergleich zu der des Eingangs ist, dh die Übertragungsfunktion. Nehmen wir in diesem Fall an, wir speisen ein Gleichstromsignal mit einer Amplitude von eins in unser System ein und untersuchen die Amplitude der stationären Reaktion. Wenn Sie zwei konstante 16-Tap-Signale zusammenfalten, erhalten Sie eine Übergangsrampe, gefolgt von einem stationären Ausgang, der ein Gleichstromsignal mit Amplitude ist (check-this-out!) 16! In diesem Fall ist unsere Definition der nicht skalierenden Analysetransformation sinnvoller als sonst.
Letztendlich geht es darum, was Sie darstellen wollen. Es gibt viele Gründe, diese systemzentrierte Definition der DFT in Betracht zu ziehen.
Betrachten wir die Transformation jedoch aus einer rein mathematischen Perspektive, ist keine davon am sinnvollsten, da wir diese Transformation orthonormal und einheitlich machen können, indem wir sowohl Analyse- als auch Synthesetransformationen mit1(N)√ . Dies wird auch die Potenz sowohl der Zeit- als auch der Frequenzrepräsentation bewahren, so dass der Parseval-Satz immer gilt.
quelle
Tatsächlich gibt es in verschiedenen und unterschiedlichen FFT / IFFT-Implementierungen drei Möglichkeiten, die Skalierungsfaktoren zu setzen: 1,0 vorwärts und 1,0 / N rückwärts, 1,0 / N vorwärts und 1,0 rückwärts und 1,0 / sqrt (N) vorwärts und rückwärts.
Diese 3 Skalierungsvarianten ermöglichen es, dass eine IFFT (FFT (x)) -Rundreise unter Verwendung generischer nicht skalierter sin () - und cos () - Triggerfunktionen für die Twiddle-Faktoren eine Identitätstransformation darstellt.
Es ist zu beachten, dass die Beibehaltung der sinusförmigen Größe in der Vorwärts-FFT nicht die Gesamtenergie bewahrt (wie im Parseval-Theorem). Wählen Sie diejenige aus, die Sie bevorzugen.
quelle