So wiederholen Sie Audio mit FFT oder DFT


11

Ich probiere Voice-Audio aus, indem ich zuerst eine FFT durchführe, dann nur die Teile des Ergebnisses nehme, die ich benötige, und dann eine inverse FFT durchführe. Es funktioniert jedoch nur dann richtig, wenn ich Frequenzen verwende, die beide Zweierpotenzen sind, z. B. Downsampling von 32768 auf 8192. Ich führe eine FFT für die 32k-Daten durch, verwerfe die oberen 3/4 der Daten und führe dann eine durch inverse FFT auf dem verbleibenden 1/4.

Wenn ich jedoch versuche, dies mit Daten zu tun, die nicht richtig ausgerichtet sind, geschieht eines von zwei Dingen: Die von mir (Aforge.Math) verwendete Mathematikbibliothek löst eine Anpassung aus, da meine Stichproben keine Zweierpotenz sind. Wenn ich versuche, die Samples auf Null zu setzen, damit sie zu zweit werden, kommt es am anderen Ende zu Kauderwelsch. Ich habe auch versucht, stattdessen eine DFT zu verwenden, aber diese ist wahnsinnig langsam (dies muss in Echtzeit erfolgen).

Wie würde ich vorgehen, um die FFT-Daten richtig aufzufüllen, sowohl bei der anfänglichen FFT als auch bei der inversen FFT am Ende? Angenommen, ich habe eine Probe mit 44,1 kHz, die 16 kHz erreichen muss, dann versuche ich derzeit so etwas, wobei die Probe 1000 groß ist.

  1. Füllen Sie die Eingabedaten am Ende auf 1024
  2. FFT durchführen
  3. Lesen Sie die ersten 512 Elemente in ein Array (ich brauche nur die ersten 362, aber ^ 2)
  4. Führen Sie eine inverse FFT durch
  5. Lesen Sie die ersten 362 Elemente in den Audiowiedergabepuffer

Dadurch bekomme ich am Ende Müll raus. Wenn Sie dasselbe tun, ohne jedoch in Schritt 1 und 3 auffüllen zu müssen, da die Samples bereits ^ 2 sind, erhalten Sie ein korrektes Ergebnis.

c#  audio 

9
FFT ist wirklich nicht der richtige Weg, dies zu tun. Sie möchten eine mehrphasige Filterbank für maximale Effizienz, aber wenn Sie das Problem nur lösen möchten, führen Sie zuerst ein Upsampling zum GCD, dann einen Tiefpass und dann ein Downsample durch.
Björn Roche

Hallo Björn: Was ist "GCD"?
SpeedCoder5

Antworten:


16

Der erste Schritt besteht darin, zu überprüfen, ob sowohl Ihre Startabtastrate als auch Ihre Zielabtastrate rationale Zahlen sind . Da sie ganze Zahlen sind, sind sie automatisch rationale Zahlen. Wenn eine von ihnen keine rationale Zahl wäre, wäre es immer noch möglich, die Abtastrate zu ändern, aber es ist ein ganz anderer Prozess und schwieriger.

2232527227533272255

Die vorherigen Schritte müssen ausgeführt werden, unabhängig davon, wie Sie die Daten erneut abtasten möchten. Lassen Sie uns nun darüber sprechen, wie es mit FFTs gemacht wird. Der Trick beim Resampling mit FFTs besteht darin, FFT-Längen auszuwählen, mit denen alles gut funktioniert. Dies bedeutet, dass eine FFT-Länge ausgewählt wird, die ein Vielfaches der Dezimierungsrate ist (in diesem Fall 441). Für das Beispiel wählen wir eine FFT-Länge von 441, obwohl wir 882 oder 1323 oder ein anderes positives Vielfaches von 441 hätten wählen können.

Um zu verstehen, wie dies funktioniert, ist es hilfreich, es zu visualisieren. Sie beginnen mit einem Audiosignal, das im Frequenzbereich ungefähr so ​​aussieht wie in der folgenden Abbildung. Abtastrate von 44,1 kHz

Wenn Sie mit Ihrer Verarbeitung fertig sind, möchten Sie die Abtastrate auf 16 kHz verringern, aber Sie möchten so wenig Verzerrungen wie möglich. Mit anderen Worten, Sie möchten einfach alles aus dem obigen Bild von -8 kHz bis +8 kHz behalten und alles andere fallen lassen. Das ergibt das Bild unten. Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie, dass die Abtastraten nicht maßstabsgetreu sind, sondern nur zur Veranschaulichung der Konzepte dienen.

255

Wie Sie vielleicht vermuten, gibt es einige potenzielle Probleme. Ich werde jeden einzelnen durchgehen und erklären, wie Sie sie überwinden können.

  1. Was tun Sie, wenn Ihre Daten kein schönes Vielfaches des Dezimierungsfaktors sind? Sie können dies leicht überwinden, indem Sie das Ende Ihrer Daten mit genügend Nullen auffüllen, um ein Vielfaches des Dezimierungsfaktors daraus zu machen. Die Daten werden aufgefüllt, bevor sie mit der FFT versehen werden.

  2. ll- -1Nullen (bitte beachten Sie, dass die Anzahl der Datenabtastwerte und die Anzahl der Auffüllabtastwerte BEIDE ein positives Vielfaches des Dezimierungsfaktors sein müssen - Sie können die Auffüllungslänge erhöhen, um diese Einschränkung zu erfüllen), FFT'-Auffüllen der aufgefüllten Daten und Multiplizieren des Frequenzbereichs Daten und Filter, und dann Aliasing der Hochfrequenzergebnisse (> 8 kHz) in die Niederfrequenzergebnisse (<8 kHz), bevor die Hochfrequenzergebnisse gelöscht werden. Da das Filtern im Frequenzbereich für sich genommen ein großes Thema ist, kann ich in dieser Antwort leider nicht näher darauf eingehen. Ich werde jedoch sagen, dass Sie, wenn Sie die Daten in mehr als einem Block filtern und verarbeiten, Overlap-and-Add oder Overlap-and-Save implementieren müssen , um die Filterung kontinuierlich zu gestalten.

Ich hoffe das hilft.

BEARBEITEN: Der Unterschied zwischen der Startanzahl der Frequenzbereichsabtastwerte und der Zielanzahl der Frequenzbereichsabtastwerte muss gleichmäßig sein, damit Sie die gleiche Anzahl von Abtastwerten von der positiven Seite der Ergebnisse wie von der negativen Seite der Ergebnisse entfernen können. In unserem Beispiel war die Startanzahl der Abtastwerte die Dezimierungsrate oder 441, und die Zielanzahl der Abtastwerte war die Interpolationsrate oder 160. Die Differenz beträgt 279, was nicht gerade ist. Die Lösung besteht darin, die FFT-Länge auf 882 zu verdoppeln, wodurch sich die Zielanzahl der Abtastwerte ebenfalls auf 320 verdoppelt. Jetzt ist der Unterschied gerade und Sie können die entsprechenden Frequenzbereichsabtastungen ohne Probleme löschen.


Sehr schön. Wie machst du so schöne Figuren im Flug, Jim?
Spacey

@Mohammad Ich benutze normalerweise Powerpoint. In diesem Fall habe ich die Libre Office-Version von Powerpoint verwendet, die meiner Meinung nach "Impress" heißt.
Jim Clay

Hallo, ich habe eine Frage zu Ihrem Punkt (2). Was genau meinen Sie in diesem Schritt: "... und dann das Aliasing der Hochfrequenzergebnisse (> 8 kHz) in die Niederfrequenzergebnisse (<8 kHz), bevor die Hochfrequenzergebnisse gelöscht werden." Ich verstehe die Schritte davor. Was passiert, nachdem ich meine F-Domain-Daten mit der F-Domain meines Filters multipliziert habe? Funktioniert diese Methode auch, wenn Sie auch Ihre Daten aktualisieren möchten? Vielen Dank.
TheGrapeBeyond

@TheGrapeBeyond Wenn Sie im Zeitbereich einen Alias ​​verwenden, addieren Sie alle Nyquist-Zonen. Die ersten Elemente aller Nyquist-Zonen werden addiert und zum neuen ersten Element der ersten Nyquist-Zone. Das zweite Element aller Nyquist-Zonen wird addiert und wird das neue zweite Element der ersten Nyquist-Zone usw.
Jim Clay

Hmm, ich bin mir nicht sicher, ob ich verstehe, wie Sie das FFT-basierte Resampling durchführen, denn wenn ich es hier versuche, erhalte ich sehr seltsame Ergebnisse. Ich werde eine Frage dazu stellen.
TheGrapeBeyond

3

Während die obige Antwort wirklich vollständig ist:

Hier ist der Kern davon:

  1. Um ein Signal herunterzusampeln, muss es eine ganze Zahl sein. Vor dem Down-Sampling eines Signals müssen Sie das Signal filtern.
  2. Sie können ein rationales Downsampling von Zahlen erreichen, indem Sie zuerst das Signal hochabtasten / interpolieren.
  3. Beim Upsampling werden einfach Nullen eingefügt und dann das Signal gefiltert.
  4. um 3/4 Abtastrate zu erreichen. Upsampling des Signals durch Einfügen von 4 Nullen zwischen jedem Signalabtastwert. Wenden Sie einen Filter an. Filtern Sie dann das Signal und löschen Sie alle 3 von 4 Signalabtastungen.

Details dazu:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

Außerdem: Wenn dies nicht unbedingt erforderlich ist, computerisieren Sie die FFT NICHT, um die IFFT zu berechnen. Es ist ein unglaublich langsamer Prozess und wird für die meisten Signalverarbeitungsaufgaben als ungeeignet angesehen. Die FFT wird normalerweise zur Analyse eines Problems oder zur Anwendung der Signalverarbeitung nur im Frequenzbereich verwendet.


1

Wie Björn Roche sagte, wäre die Verwendung von FFT dafür furchtbar unzulänglich. Aber hier geht es auf sehr sehr einfache Weise mit der Methode des Upsample-Filters und des Downsamples im Frequenzbereich.

1 - Nehmen Sie das gewünschte Vektorsignal der Länge N.

2 - N-Punkt-FFT durchführen.

3 - Nullen Sie die FFT mit 160 * N Nullen in der Mitte des FFT-Vektors auf.

4 - IFFT durchführen

5 - Wählen Sie eine von 441 Proben aus und verwerfen Sie die anderen 440.

Sie erhalten einen Vektor der Länge N * 160/441, der Ihr neu abgetastetes Signal ist.

Wie Sie sehen, führen Sie viele sinnlose Berechnungen durch, da die meisten Ergebnisse dann weggeworfen werden. Wenn Sie jedoch Zugriff auf den Code haben, der die FFT ausführt, können Sie ihn tatsächlich ein wenig optimieren, sodass nur die IFFT-Ergebnisse berechnet werden, die Sie am Ende erhalten, und nicht die, die Sie wegwerfen.

Ich hoffe es hilft.

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.