Frage

Ich versuche, eine grafische Spektrumanalysator in Python zu erstellen.

ich zur Zeit lese 1024 Bytes eines 16-Bit-Dual-Kanal 44.100 Hz Abtastrate Audiostrom und die Amplitude der 2 Kanäle zusammen gemittelt werden. So, jetzt habe ich ein Array von 256 signierten Shorts. Ich möchte jetzt eine fft auf diesem Array Preform, ein Modul wie numpy verwenden, und das Ergebnis verwenden, um die grafische Spektrumanalysator zu schaffen, das wird beginnen nur 32 bar betragen.

Ich habe den Wikipedia-Artikel auf schnelle Fourier-Transformation und diskrete Fourier-Transformation lesen, aber ich bin immer noch unklar, was die resultierende Anordnung darstellt. Dies ist, was das Array wie folgt aussieht, nachdem ich eine fft auf meinem Array Vorform mit numpy:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

Ich frage mich, was genau diese Zahlen darstellen und wie ich diese Zahlen in einen Prozentsatz einer Höhe für jeden der 32 Takte umwandeln würde. Auch soll ich die 2 Kanäle zusammen im Durchschnitt?

War es hilfreich?

Lösung

Das Array, das Sie zeigt, sind die Fourier-Koeffizienten des Audiosignals zu transformieren. Diese Koeffizienten können verwendet werden, um den Frequenzinhalt des Audio zu bekommen. Die FFT wird für komplexwertige Eingangsfunktionen definiert, so dass der Koeffizienten Sie aussteigen imaginäre Zahlen sein wird, auch wenn Sie Ihre Eingabe alle realen Werte sind. Um die Menge an Energie in jeder Frequenz zu erhalten, müssen Sie die Größe der FFT-Koeffizienten für jede Frequenz berechnen. Dies ist nicht nur die reale Komponente des Koeffizienten, müssen Sie die Quadratwurzel aus der Summe der Quadrate der realen und imaginären Komponenten berechnen. Das heißt, wenn Ihr Koeffizient a + b * j ist, dann seine Größe ist sqrt (a ^ 2 + b ^ 2).

Wenn Sie die Größe jedes FFT-Koeffizienten berechnet haben, müssen Sie die Tonfrequenz jeder FFT-Koeffizienten gehört, um herauszufinden. Ein N-Punkt-FFT werden Sie den Frequenzinhalt des Signals bei N gleich beabstandeten Frequenzen, beginnend bei 0. Da Ihre Abtastfrequenz 44100 Abtastungen / sec ist. und die Anzahl der Punkte in der FFT 256, Ihr Frequenzabstand ist 44100/256 = 172 Hz (ungefähr)

Der erste Koeffizient in Ihrem Array wird der 0 Frequenzkoeffizient sein. Das ist im Grunde der durchschnittliche Leistungspegel für alle Frequenzen. Der Rest Ihrer Koeffizienten bis 0 in Vielfachen von 172 Hz zählen, bis Sie auf 128. In einer FFT erhalten, kann nur Frequenzen misst bis zu einem halben Ihren Abtastpunkte. Lesen Sie diese Links auf der Nyquist-Frequenz und Nyquist-Shannon Abtasttheorem wenn Sie ein Vielfraß für Strafe und muss wissen, warum, aber das grundlegende Ergebnis ist, dass Sie Ihre niedrigeren Frequenzen repliziert werden werden oder in den höheren Frequenz Eimern aliased . So sind die Frequenzen von 0 beginnt, steigt um 172 Hz für jeden Koeffizienten bis zu dem N / 2 Koeffizienten, dann sinken um 172 Hz bis zum N -. 1 Koeffizient

Das sollte genug Informationen werden zum Einstieg. Wenn Sie eine viel zugängliche Einführung in FFTs mögen als auf Wikipedia gegeben ist, könnten Sie versuchen, Grundlegendes zu digitaler Signalverarbeitung:. 2. Aufl . Es war sehr hilfreich für mich.

Das ist also, was diese Zahlen repräsentieren. Umwandlung auf einen Prozentsatz der Höhe konnte durch die Summe aller Komponentengrößen durch Skalierung jede Frequenzkomponentengröße erfolgen. Obwohl, dass Sie würde nur geben eine Darstellung der relativen Häufigkeitsverteilung, und nicht die tatsächliche Leistung für jede Frequenz. Sie könnten versuchen, durch die maximale Größe möglich, dass eine Frequenzkomponente Skalierung, aber ich bin mir nicht sicher, dass das wäre sehr gut an. Der schnellste Weg, um einen praktikable Skalierungsfaktor finden würde lauten und leisen Audiosignale zu experimentieren, die richtige Einstellung zu finden.

Schließlich sollten Sie die beiden Kanäle werden im Durchschnitt zusammen, wenn Sie den Frequenzinhalt des gesamten Audiosignals als Ganzes zeigen wollen. Sie mischen die Stereo-Audio in Mono-Audio und die kombinierten Frequenzen zeigt. Wenn Sie zwei separate Displays für rechte und linke Frequenzen wollen, dann müssen Sie die Fourier-Transformation an jeden Kanal separat Transformation auszuführen.

Andere Tipps

Obwohl dieses Thema Jahre alt ist, fand ich es sehr hilfreich. Ich wollte nur meinen Input zu jedermann geben, die dies findet und versuchen, etwas Ähnliches zu schaffen.

Wie für die Aufteilung in Bars sollte dies nicht geschehen, wie antti vorschlagen, indem Sie die Daten über die Anzahl der Balken gleich basierend geteilt wird. Die nützlichste wäre, die Daten in Oktaven Teile zu unterteilen, jede Oktave doppelte Frequenz des vorhergehenden ist. (Dh. 100Hz ist eine Oktave über 50 Hz, die eine Oktave über 25 Hz ist).

Je nachdem, wie viele Bars Sie möchten, teilen Sie das gesamte Spektrum in 1 / X Oktavbereiche. Basierend auf einer gegebenen Mittenfrequenz von A auf der Bar erhalten Sie die obere und untere Grenze des Balkens aus:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

die nächste benachbarte Mittenfrequenz Sie eine ähnliche Berechnung verwenden zu berechnen:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

Sie Durchschnitt dann die Daten, die in diesen Bereichen passt die Amplitude für jede bar zu erhalten.

Zum Beispiel: Wir wollen in 1/3 Oktaven Bereiche teilen und wir beginnen mit einer Mittenfrequenz von 1 kHz.

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

Da 44100Hz und 1024 Proben (43hz zwischen jedem Datenpunkt) sollten wir auszumitteln Werte 21 bis 26. (890,9 / 43 = 20,72 ~ 21 und 1122,5 / 43 = 26,10 ~ 26)

(1/3 Oktave Bars läuft man ca. 30 bar zwischen ~ 40Hz bekommen und ~ 20kHz). Wie Sie jetzt herausfinden, wie wir höher gehen wir einen größeren Bereich von Zahlen mitteln. Niedrige Bars umfassen typischerweise nur 1 oder eine kleine Anzahl von Datenpunkten. Während die höheren Stäbe können die durchschnittlich Hunderte von Punkten sein. Der Grund dafür ist, dass 86hz ist eine Oktave über 43hz ... während 10086hz fast die gleichen wie 10043hz klingt.

, was Sie haben, ist eine Probe, deren Länge in der Zeit 256/44100 = 0,00580499 Sekunden. Dies bedeutet, dass die Frequenzauflösung beträgt 1 / 0,00580499 = 172 Hz. Die 256 Werte, die Sie von Python aussteigen entsprechen die Frequenzen, im Grunde von 86 Hz bis 255 * 172 + 86 Hz = 43946 Hz. Die Zahlen, die Sie raus sind komplexe Zahlen (daher die „j“ am Ende jeder zweiten Zahl).

EDITED: FIXED Falsche Informationen

Sie müssen die komplexen Zahlen in Amplitude konvertieren, indem die sqrt Berechnung (i 2 + j 2 ), wobei i und j sind die realen und imaginären Teile, resp.

Wenn Sie wollen, 32 Bars haben, sollten Sie so weit wie ich nehme verstehen den Durchschnitt von vier aufeinanderfolgenden Amplituden, immer 256/4 = 32 Takte, wie Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top