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.
- Füllen Sie die Eingabedaten am Ende auf 1024
- FFT durchführen
- Lesen Sie die ersten 512 Elemente in ein Array (ich brauche nur die ersten 362, aber ^ 2)
- Führen Sie eine inverse FFT durch
- 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.
Antworten:
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.
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.
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.
Bitte beachten Sie, dass die Abtastraten nicht maßstabsgetreu sind, sondern nur zur Veranschaulichung der Konzepte dienen.
Wie Sie vielleicht vermuten, gibt es einige potenzielle Probleme. Ich werde jeden einzelnen durchgehen und erklären, wie Sie sie überwinden können.
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.
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.
quelle
Während die obige Antwort wirklich vollständig ist:
Hier ist der Kern davon:
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.
quelle
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.
quelle