So können Sie das Audio mit FFT oder DFT erneut testen

  • Ich bin beim Abtasten von Sprachaudio dran, indem ich zuerst eine FFT durchführe, dann nur die Teile des Ergebnisses nehme, die ich brauche, und dann eine inverse FFT. Es funktioniert jedoch nur einwandfrei, wenn ich Frequenzen verwende, die beide Zweierpotenz sind, z. B. das Downsampling von 32768 auf 8192. Ich führe eine FFT für die 32-KByte-Daten durch, verwerfe die oberen 3/4 der Daten und dann eine inverse FFT für das verbleibende 1/4.

    Wenn ich jedoch versuche, dies mit Daten zu tun, die nicht richtig ausgerichtet sind, passiert eines der beiden folgenden Ereignisse: Die mathematische Bibliothek, die ich (Aforge.Math) verwende, wirft ein passt, weil meine Samples keine Zweierpotenz sind. Wenn ich versuche, die Samples auf Null zu stellen, so dass sie zu Zweiergruppen werden, wird es am anderen Ende schwankend. Ich habe auch versucht, stattdessen eine DFT zu verwenden, aber sie ist wahnsinnig langsam (dies muss in Echtzeit geschehen).

    Wie gehe ich vor, um die FFT auf Null zu setzen Daten richtig, sowohl auf der ursprünglichen FFT als auch der inversen FFT am Ende? Angenommen, ich habe ein Sample bei 44,1 kHz, das auf 16 kHz gebracht werden muss, versuche ich derzeit so etwas, wobei das Sample 1000 groß ist.

    1. Pad-Eingabe Daten bis 1024 am Ende
    2. FFT durchführen
    3. Lesen Sie die ersten 512 Elemente in ein Array (ich brauche nur die ersten 362, aber ^ 2) < / li>
    4. Führt eine inverse FFT durch
    5. Liest die ersten 362 Elemente in den Audioplayer

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

    22 July 2012
3 answers
  • Der erste Schritt besteht darin, zu überprüfen, ob sowohl Ihre Start-Sample-Rate als auch Ihre Ziel-Sample-Rate rational sind Zahlen . Da sie ganze Zahlen sind, sind sie automatisch rationale Zahlen. Wenn einer von ihnen keine vernünftige Zahl ist, ist es immer noch möglich, die Abtastrate zu ändern, aber es ist ein anderer Prozess und schwieriger.

    Der nächste Schritt ist die zwei Abtastraten zu faktorisieren. Die Start-Sample-Rate beträgt in diesem Fall 44100, was zu $ ​​2 ^ 2 * 3 ^ 2 * 5 ^ 2 * 7 ^ 2 $ führt. Die Ziel-Abtastrate von 16000 ist $ 2 ^ 7 * 5 ^ 3 $. Um von der Start-Sample-Rate in die Zielrate umzuwandeln, müssen wir um $ 3 ^ 2 * 7 ^ 2 $ dezimieren und um $ 2 ^ 5 * 5 $ interpolieren.

    Der vorherige Schritte müssen unabhängig davon durchgeführt werden, wie Sie die Daten neu berechnen möchten. Lass uns jetzt darüber sprechen, wie es mit FFT's geht. Der Trick beim Resampling mit FFTs ist die Auswahl von FFT-Längen, 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). Lassen Sie uns für das Beispiel eine FFT-Länge von 441 auswählen, obwohl wir 882 oder 1323 oder ein anderes positives Vielfaches von 441 gewählt haben könnten.

    Um zu verstehen, wie das geht funktioniert es hilft es zu visualisieren. Sie beginnen mit einem Audiosignal, das im Frequenzbereich in etwa der folgenden Abbildung ähnelt: So können Sie das Audio mit FFT oder DFT erneut testen

    Wenn Sie mit der Verarbeitung fertig sind, möchten Sie dies tun um die Abtastrate auf 16 kHz zu verringern, aber Sie möchten so wenig Verzerrung wie möglich. Mit anderen Worten, Sie möchten einfach alles von dem obigen Bild von -8 kHz bis +8 kHz behalten und alles andere fallen lassen. Daraus ergibt sich das Bild unten. So können Sie das Audio mit FFT oder DFT erneut testen

    Bitte beachten Sie, dass die Abtastraten nicht maßstabsgerecht sind, sie dienen lediglich der Veranschaulichung der Konzepte.

    Wenn Sie eine FFT-Länge auswählen, die ein Vielfaches des Dezimierungsfaktors ist, können Sie einfach die Bildpunkte neu berechnen, indem Sie Teile o löschenf das FFT-Ergebnis und dann inverse FFT, was übrig bleibt. In unserem Beispiel fFTen Sie 441 Abtastwerte von Daten, wodurch Sie 441 komplexe Abtastwerte im Frequenzbereich erhalten. Wir wollen um 441 dezimieren und um 160 interpolieren ($ 2 ^ 5 * 5 $), also behalten wir die 160 Samples bei, die die Frequenzen von -8 kHz bis +8 kHz darstellen. Wir invertieren dann diese Samples und Presto! Es gibt 160 Zeit-Domain-Samples, die mit 16 kHz abgetastet werden.

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

    1. Was tun Sie, wenn Ihre Daten kein nettes Vielfaches der Dezimationsfaktor Sie können dies leicht überwinden, indem Sie das Ende Ihrer Daten mit ausreichend Nullen auffüllen, um ein Vielfaches des Dezimierungsfaktors zu erhalten. Die Daten werden vor der FFT aufgefüllt.

    2. Auch wenn die von mir erläuterte Methode sehr einfach ist, ist sie auch nicht ideal, da sie ein Klingeln verursachen kann und andere böse Artefakte im Zeitbereich. Sie können dies vermeiden, indem Sie die Frequenzbereichsdaten filtern, bevor Sie die Hochfrequenzdaten löschen. Sie tun dies, indem Sie Ihren Filter der Länge $ l $ mit einem FFT-Filter versehen und Ihre Daten (vor dem FFT-Vorgang) mit mindestens $ l-1 $ -Nullen auffüllen (beachten Sie, dass die Anzahl der Datenmuster und die Anzahl der Auffüllmuster erforderlich ist) BOTH ist ein positives Vielfaches des Dezimierungsfaktors - Sie können die Auffülllänge erhöhen, um diese Einschränkung zu erfüllen), FFT-Auffüllen der aufgefüllten Daten, Multiplizieren der Frequenzbereichsdaten und des Filters und Aliasing der Ergebnisse der hohen Frequenz (& gt; 8 kHz) nach unten in die Niederfrequenz (& lt; 8 kHz), bevor die Hochfrequenzergebnisse fallen gelassen werden. Da das Filtern im Frequenzbereich ein großes Thema für sich ist, kann ich in dieser Antwort leider nicht näher darauf eingehen. Ich werde jedoch sagen, dass, wenn Sie die Daten in mehr als einem Block filtern und verarbeiten, Sie

01 August 2012
Colin Pickard
  • Wie Björn Roche sagte, die Verwendung von FFT wäre furchtbar unbefriedigend. Hier geht es jedoch auf sehr einfache Weise mit der Methode des Upsampling-Filters und Downsample im Frequenzbereich vor.

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

    2 - Führen Sie eine N-Punkt-FFT durch.

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

    4 - IFFT durchführen

    5 - Wählen Sie einen von 441 Samples aus, wobei der andere 440 verworfen wird.

    Sie werden mit einem Vektor der Länge N * 160/441 übrig bleiben, der Ihr neu abgetastetes Signal ist.

    Wie Sie sehen, tun Sie viel sinnlos Berechnungen, weil die meisten Ergebnisse dann weggeworfen werden. Wenn Sie jedoch Zugriff auf den Code haben, der die FFT durchführt, könnten Sie ihn möglicherweise ein wenig anpassen, sodass nur die IFFT-Ergebnisse berechnet werden, mit denen Sie enden, und nicht die, die Sie wegwerfen.

    Hoffe, es hilft.

    18 January 2014
    bone