Logarithmische Fourier-Transformation (LFT) auf Audiosignal


9

Ich versuche die Musik so genau wie möglich zu analysieren. Natürlich habe ich FFT ausprobiert, aber einige Probleme bekommen.

Ich fand, dass niedrige Frequenzen eine sehr niedrige Auflösung haben als das menschliche Gehör. Ich habe sehr lange versucht, dieses Problem mit FFT zu lösen, aber selbst bei der Analyse mit 8192 Samples / s bei einer Abtastrate von 44100 Hz (bedeutet mangelnde Zeitauflösung) habe ich bei niedrigen Frequenzen nicht genügend Auflösung erhalten.

Ich habe festgestellt, dass es nur wenige Lösungen gibt.

Erstens eine quadratische Interpolation auf FFT-Bins.
Aber es scheint kein perfekter Weg zu sein. Probleme dieser Methode sind:

1. 'Wenn ich Frequenzen zwischen den Frequenzbins bestimmen möchte, welche drei Bins sollte ich auswählen, um eine Interpolation durchzuführen?'
2. Auch wenn ich dies tue, gibt es keine tatsächlichen zusätzlichen Informationen zum Ergebnis. Ich weiß, dass Interpolationen eine knifflige Methode sind. '

Zweitens, jedes Freq-Bins mit der gewünschten Häufigkeit extrahieren, damit ich die Bins logarithmisch extrahieren kann.
Habe aber ein kritisches Rechenkostenproblem: (vielleicht über) N ^ 2.

Drittens LFT (Logarithmic Fourier Transform).
Dies erfordert logarithmisch beabstandete Abtastwerte und gibt mir mit unglaublich hoher Geschwindigkeit genau das, was ich suche. /programming/1120422/is-there-an-fft-that-uses-a-logarithmic-division-of-frequency

Aber ich habe keine Ahnung mit diesem Algorithmus. Ich habe versucht, das Papier zu verstehen und umzusetzen, aber es war unmöglich, weil ich keine Englisch- und Mathematikkenntnisse hatte.

Ich brauche also Hilfe bei der Implementierung von LFT.

Antworten:


8

Die einfachste und pragmatischste Lösung besteht darin, eine normale FFT mit einer ausreichend großen Größe zu verwenden, damit Sie die erforderliche Auflösung bei der niedrigsten interessierenden Frequenz erhalten. Wenn Sie beispielsweise eine Auflösung von 1 Hz bei der niedrigsten interessierenden Frequenz wünschen, benötigen Sie ein 1-Sekunden-FFT-Fenster, dh die FFT-Größe muss der Abtastrate entsprechen, z. B. 44100.

Beachten Sie, dass selbst wenn Sie eine logarithmische FFT implementieren könnten , diese dennoch an die Gesetze der Physik (Informationstheorie) gebunden wäre und Sie immer noch ein Beispielfenster mit ähnlicher Länge benötigen würden - alles, was Sie gewinnen würden, wäre Bequemlichkeit (ohne Ausgabefächer aggregieren zu müssen) ) auf Kosten der Leistung.


Es ist komisch. Ich weiß, dass es theoretisch keine Daten mehr gibt. Wenn ich eine große FFT verwende, ist es wahr, dass sie nicht in der Lage ist, sehr schnelle Einsätze von Musikinstrumenten zu analysieren. Und es ist auch wahr, dass ich bei niedrigen Frequenzen keine höhere Auflösung erzielen kann. Aber wie wäre es mit einem menschlichen Hörsystem? Wie wird dieses System sowohl zeitlich als auch frequenzmäßig höher aufgelöst?

3
Vielleicht sollten Sie einen hierachischen Ansatz in Betracht ziehen, bei dem Sie jede aufeinanderfolgende Oktave um den Faktor 2 dezimieren, damit Sie kurze Zeitfenster bei höheren Frequenzen und längere Zeitfenster bei niedrigeren Frequenzen verwenden können? Dies wäre etwas analog zu einer Hörfilterbank, bei der die Bandbreite mit der Frequenz zunimmt.
Paul R

Toller Ansatz. Langzeit-Goertzel bei niedrigen Frequenzen, Kurzzeit-Goertzel bei hohen Frequenzen? Macht Sinn. Erfordert aber einen hohen Rechenaufwand.

Es ist wahrscheinlich mehr effizienter als eine große FFT zu tun, auch wenn es komplizierter ist. Für eine 4-Oktaven-Hierarchie möchten Sie beispielsweise 4 x 2048-Punkt-FFTs und 3 Tiefpassfilter für x2-Downsampling. Die Auflösung der niedrigsten FFT ist bei voller Abtastrate so gut wie eine einzelne 16384-Punkt-FFT, aber da die FFT O (n log n) ist, sind die gesamten Rechenkosten viel geringer.
Paul R

aha, FFT 2048, Down-Sample x2, FFT 2048, Down-Sample x2 ... als ich sowohl Zeit- als auch Frequenzauflösung habe, mit viel geringeren Kosten als 16384 FFT. Toll. Und gerade jetzt habe ich eine andere Lösung: Bei einem 16384-Sample Goertzel jedes Mal um 32. Mit der Akkumulation kann ich also sowohl niedrige als auch hohe Frequenzen mit geringeren Kosten extrahieren. Vielen Dank. :)

0

Wenn die Analyse, die Sie durchführen möchten, die Frequenz der Signale in jedem Bin erfordert, können Sie die Kurzzeit-Fourier-Transformation verwenden , um dies zu erreichen.

Jeder Behälter der FFT ergibt eine komplexe Zahl, die die reale und imaginäre Komponente darstellt - oder nach einer gewissen Manipulationsphase und -größe.

Als Frequenz = dPhi / dt (Phi == Phase) können Sie die Frequenz berechnen, indem Sie entsprechende Bins aus Paaren aufeinanderfolgender STFT-Spektren entnehmen.

DSP Dimension hat einen guten Artikel über den Prozess.


Sieht so aus, als würde ich über ein weiteres komplexeres Problem nachdenken. Ich kann FFT verwenden, aber für die Audiosignalanalyse ist es jedoch nicht geeignet.

3
Schauen Sie sich die "konstante Q" -Version der Kurzzeit-Fourier-Transformation an. Diese Anordnung der STFT bietet eine Frequenzauflösung, die sich logarithmisch an die Anforderungen für verschiedene Frequenzbereiche anpasst.
user2718

Ich werde mal schauen. Ich dachte, es sei nur eine einfache Filterbank-Transformationsoperation, die auf das fft-Ergebnis angewendet wird.
Laie
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.