[Python] Analysieren Sie Audio mithilfe der Fast-Fourier-Transformation



Answers

Obwohl dieser Thread Jahre alt ist, fand ich es sehr hilfreich. Ich wollte nur meinen Input jedem geben, der das findet und etwas Ähnliches zu schaffen versucht.

Was die Einteilung in Balken betrifft, so sollte dies nicht als antti sugget gemacht werden, indem die Daten auf der Grundlage der Anzahl der Balken gleich aufgeteilt werden. Am nützlichsten wäre es, die Daten in Oktavanteile zu teilen, wobei jede Oktave doppelt so häufig ist wie die vorhergehende. (dh 100 Hz ist eine Oktave über 50 Hz, was eine Oktave über 25 Hz ist).

Je nachdem, wie viele Balken Sie möchten, teilen Sie den gesamten Bereich in 1 / X Oktavbereiche. Basierend auf einer gegebenen Mittenfrequenz von A auf der Leiste, erhalten Sie die obere und untere Grenze der Leiste aus:

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

Um die nächste angrenzende Mittelfrequenz zu berechnen, verwenden Sie eine ähnliche Berechnung:

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

Sie mitteln dann die Daten, die in diese Bereiche passen, um die Amplitude für jeden Balken zu erhalten.

Zum Beispiel: Wir wollen in 1/3 Oktavenbereiche aufteilen 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

Bei 44100Hz und 1024 Samples (43Hz 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 Sie um 30 Balken zwischen ~ 40 Hz und ~ 20 kHz bringen). Wie Sie jetzt herausfinden können, werden wir, wenn wir höher gehen, eine größere Anzahl von Zahlen mitteln. Low-Bars enthalten typischerweise 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 86hz eine Oktave über 43hz ist ... während 10086hz fast genauso klingt wie 10043hz.

Question

Ich versuche einen grafischen Spektrumanalysator in Python zu erstellen.

Ich lese derzeit 1024 Bytes eines 16-Bit-Zweikanal-Audiostreams mit 44.100 Hz Abtastrate und mittle die Amplitude der beiden Kanäle zusammen. So, jetzt habe ich eine Reihe von 256 signierten Shorts. Ich möchte jetzt ein fft auf diesem Array unter Verwendung eines Moduls wie numpy erzeugen und das Ergebnis verwenden, um den graphischen Spektrumanalysator zu erzeugen, der zu Beginn nur 32 Balken hat.

Ich habe die Wikipedia-Artikel über schnelle Fourier-Transformation und diskrete Fourier-Transformation gelesen, aber ich bin immer noch unklar, was das resultierende Array darstellt. So sieht das Array aus, nachdem ich ein fft auf meinem Array mit numpy erzeugt 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 in einen Prozentsatz einer Höhe für jeden der 32 Balken umwandeln würde. Sollte ich auch die 2 Kanäle zusammen berechnen?




Links