FFT der Größe keine Potenz von 2


9

Meine Frage bezieht sich auf die Eingangsgröße eines Signals, das keine Potenz von 2 ist, und wir müssen die fft davon nehmen. Einige Lösungen besagen, dass wir, wenn wir das fft von 1800 nehmen wollen, es bis zur Länge von 2048 auf Null setzen sollten, um die Potenz 2 zu erreichen, und dann den Radix 2-Algorithmus anwenden sollten. Es gibt aber auch andere Lösungen, die eine Kombination verschiedener Algorithmen ohne Null-Auffüllung anwenden und dann die erforderliche FFT berechnen. Meine Frage ist: Macht das Auffüllen eines Signals mit einer Länge von 2048 für den Fall, dass wir fft von 1800 nehmen müssen, einen Unterschied in den Ergebnissen, wenn wir eine Kombination verschiedener Algorithmen verwenden, um den fft der Größe 1800 zu berechnen. Gibt es einen Unterschied oder den Ergebnis wäre das gleiche.


Die resultierende FFT ist unterschiedlich: Anstatt die FFT bei den Frequenzen für zu berechnen, berechnen Sie sie bei für . Es gibt jedoch keine Verschlechterung der Informationen. 2πn/.1800n=017992πn/.2048n=02047
Peter K.

Es bedeutet also, dass beide Ansätze korrekt sind? Aber welches empfehlen Sie, um in Bezug auf die Praktikabilität besser zu sein?
DX

Ja, beide Ansätze sind korrekt. Ich würde die "Lösung mit minimaler Energie" verwenden (dh die einfachste, die faulste Lösung). Dies würde normalerweise die 2048-Längen-Transformation verwenden.
Peter K.

Ich habe in der Literatur und in den Büchern gesehen, dass die Leute empfehlen, das Null-Pad zu verwenden, um die Potenz 2 zu erreichen. Warum sie niemals darauf bestehen, eine Kombination anderer Algorithmen zu implementieren, um gute Ergebnisse zu erzielen.
DX

2
Angenommen, Ihre Daten sind in x. Form X = fft(x,123456);(oder eine andere seltsame Länge). Finden xx = ifft(X);. Sehen Sie, was sum(abs(x-xx(1:length(x))));ist.
Peter K.

Antworten:


6

Die resultierende FFT ist anders: anstatt die FFT bei den Frequenzen zu berechnen 2πn/.1800   zum n=01799  , Sie werden sie bei berechnen 2πn/.2048   zum n=02047  . Es gibt jedoch keine Verschlechterung der Informationen.

Beide Ansätze sind richtig: mit 1800 oder 2048. Ich würde die "Lösung mit minimaler Energie" verwenden (dh die einfachste, die faulste Lösung). Dies würde normalerweise die 2048-Längen-Transformation verwenden.

Menschen neigen dazu, Radix-2-Transformationen zu verwenden, weil sie es nicht besser wissen. Es scheint viele Fehlinformationen über FFTs zu geben, die Power-of-2 sein müssen. Es gibt keine solche Einschränkung. Außerdem wissen sie wahrscheinlich nichts über anständige Nicht-Radix-2-Algorithmen, wie sie in FFTW und anderen Bibliotheken verfügbar sind .

Um zu sehen, dass die FFT beliebiger Länge informationserhaltend ist:

Angenommen, Ihre Daten mit einer Länge von 1800 sind in x. Form X = fft(x,2048);(oder eine andere Länge als 1800).
Finden xx = ifft(X);.
Sehen Sie, was sum(abs(x-xx(1:1800)));ist.

Siehe auch diese Frage und ihre Antworten.


Wenn ich es mache ... gibt es mir nur eine Zahl, aber keinen Vergleich durch Grafiken. Es tut mir leid, aber ich bin nicht sehr gut in Matlab, weil ich alles in C implementiert habe
DX

0

Man muss verstehen, dass FFT, da das Ergebnis (und die Quelle) diskret sind, nicht wirklich eine Fourier-Transformation ist, sondern in Wirklichkeit eine Fourier-Reihen-Entwicklung. Dies bedeutet, dass das Ergebnis einer FFT nicht die Transformation eines einzelnen Datenblocks ist, sondern die Transformation eines periodischen Signals, das aus einer unendlichen Verkettung desselben Datenblocks mit oder ohne Trennung besteht, die aus der Auffülllänge besteht . (Unter der Annahme, dass meine analysierten Daten wie «m» aussehen, wird die Transformation die Entwicklung von «... mmmmm ...» oder «... mmmmm ...» sein, die nicht dasselbe Signal sind.)

Infolgedessen bedeutet das Fehlen einer Auffüllung, dass implizit der Hochfrequenzfehler in den Quelldaten hinzugefügt oder entfernt wird, der aus der Diskontinuität beim Verbinden des Endes eines Blocks und des Beginns des nächsten Blocks (der derselbe ist) stammt. Das extreme Beispiel wäre, einen Block zu analysieren, der denselben Wert enthält. Das Auffüllen ohne Auffüllen macht den Unterschied zwischen einem kontinuierlichen und einem rechteckigen Signal.

Die andere Konsequenz daraus ist, dass je länger die Auffüllung ist, desto näher das Ergebnis der Transformation eines einzelnen Datenbursts ist und desto höher ist die Auflösung der Transformation. Es ist nicht ganz richtig zu sagen, dass es unabhängig von der Übergabe zu keiner Verschlechterung der Informationen kommen wird. Es wird (in begrenztem Umfang) aufgrund der Rundungsfehler und der Verwendung eines längeren Puffers helfen, dies zu verhindern (wiederum in sehr begrenzter Weise).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.