Ich versuche, einen grafischen Spektrumanalysator in Python zu erstellen.
Ich lese gerade 1024 Bytes eines 16-Bit-Dual-Channel-Audiostreams mit 44.100 Hz Abtastrate und mittle die Amplitude der beiden Kanäle zusammen. Jetzt habe ich eine Reihe von 256 signierten Shorts. Ich möchte jetzt ein fft auf diesem Array mit einem Modul wie numpy vorformen und das Ergebnis verwenden, um den grafischen Spektrumanalysator zu erstellen, der zu Beginn nur 32 Balken beträgt.
Ich habe die Wikipedia-Artikel über schnelle Fourier-Transformation und diskrete Fourier-Transformation gelesen, bin mir aber immer noch nicht sicher, was das resultierende Array darstellt. So sieht das Array aus, nachdem ich mit numpy ein fft auf meinem Array durchgeführt habe:
[ -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 für jeden der 32 Balken in einen Prozentsatz einer Höhe umwandeln würde. Sollte ich auch die 2 Kanäle zusammen mitteln?
Obwohl dieser Thread Jahre alt ist, fand ich ihn sehr hilfreich. Ich wollte nur meinen Beitrag an jeden richten, der dies findet und versucht, etwas Ähnliches zu schaffen.
Die Unterteilung in Balken sollte nicht wie von Anti vorgeschlagen erfolgen, indem die Daten gleichmäßig auf der Grundlage der Anzahl der Balken aufgeteilt werden. Am nützlichsten wäre es, die Daten in Oktavteile zu unterteilen, wobei jede Oktave doppelt so häufig ist wie die vorherige. (dh 100 Hz sind eine Oktave über 50 Hz, was eine Oktave über 25 Hz ist).
Je nachdem, wie viele Takte Sie möchten, teilen Sie den gesamten Bereich in 1 / X-Oktavbereiche auf. Basierend auf einer bestimmten Mittenfrequenz von A auf dem Balken erhalten Sie die oberen und unteren Grenzen des Balkens aus:
Um die nächste angrenzende Mittenfrequenz zu berechnen, verwenden Sie eine ähnliche Berechnung:
Anschließend mitteln Sie die Daten, die in diese Bereiche passen, um die Amplitude für jeden Balken zu erhalten.
Zum Beispiel: Wir möchten in 1/3 Oktavenbereiche unterteilen und beginnen mit einer Mittenfrequenz von 1 kHz.
Bei 44100 Hz und 1024 Abtastwerten (43 Hz zwischen jedem Datenpunkt) sollten die Werte 21 bis 26 gemittelt werden (890,9 / 43 = 20,72 ~ 21 und 1122,5 / 43 = 26,10 ~ 26).
(1/3 Oktavbalken würden ungefähr 30 Takte zwischen ~ 40 Hz und ~ 20 kHz ergeben). Wie Sie jetzt herausfinden können, werden wir mit zunehmender Höhe einen größeren Zahlenbereich mitteln. Niedrige Balken enthalten normalerweise nur 1 oder eine kleine Anzahl von Datenpunkten. Während die höheren Balken der Durchschnitt von Hunderten von Punkten sein können. Der Grund dafür ist, dass 86 Hz eine Oktave über 43 Hz sind ... während 10086 Hz fast genauso klingen wie 10043 Hz.
quelle
Was Sie haben, ist eine Probe mit einer Zeitdauer von 256/44100 = 0,00580499 Sekunden. Dies bedeutet, dass Ihre Frequenzauflösung 1 / 0,00580499 = 172 Hz beträgt. Die 256 Werte, die Sie von Python erhalten, entsprechen im Grunde den Frequenzen von 86 Hz bis 255 * 172 + 86 Hz = 43946 Hz. Die Zahlen, die Sie herausholen, sind komplexe Zahlen (daher das "j" am Ende jeder zweiten Zahl).
EDITIERT: FESTE FALSCHE INFORMATIONEN
Sie müssen die komplexen Zahlen in Amplitude umwandeln, indem Sie das Quadrat (i 2 + j 2 ) berechnen, wobei i und j der Real- bzw. Imaginärteil sind.
Wenn Sie 32 Takte haben möchten, sollten Sie, soweit ich weiß, den Durchschnitt von vier aufeinanderfolgenden Amplituden nehmen und 256/4 = 32 Takte erhalten, wie Sie möchten.
quelle
FFT gibt N komplexe Werte zurück, die von Ihnen berechnet werden können
module=sqrt(real_part^2+imaginary_part^2)
. Um den Wert für jedes Band zu erhalten, müssen Sie die Module über alle Harmonischen innerhalb des Bandes summieren. Unten sehen Sie ein Beispiel für einen 10-bar-Spektrumanalysator. Der c-Code muss umbrochen werden, um ein pyd python-Modul zu erhalten.Ich habe einen ganzen 10-LED-Balkenspektrumanalysator von Python entworfen und hergestellt. Anstatt die nunmpy-Bibliothek zu verwenden (zu groß und nutzlos, um nur die FFT zu erhalten), wurde ein Python-Pyd-Modul (nur 27 KB) erstellt, um die FFT zu erhalten und das gesamte Audiospektrum in Bänder aufzuteilen.
Zusätzlich wurde zum Lesen des ausgegebenen Audios ein Loopback-WASapi-Portaudio-Pyd-Modul erstellt. Sie können das Projekt (Blockdiagramm) im Bild 10BarsSpectrumAnalyzerWithWASapi.jpg sehen
Ich habe gerade ein Tutorial-Video auf meinem YouTube-Kanal hinzugefügt: Wie man eine sehr intelligente Python Spectrum Analyzer 10-LED-Leiste entwirft und erstellt
quelle