2016-12-09 4 views
0

Ich versuche, meinen Raspberry-Kram zu bekommen, basierend auf dem Audiopegel eines abgespielten Songs (Tonausgabe). Das Lied sollte nicht unbedingt eine lokale mp3-Datei auf dem Raspberry sein. Lassen Sie es mich so erklären:Analysieren des Audiopegels in Echtzeit mit Python

Wenn (Audiopegel über dem Schwellenwert): etwas tun ..

ich diesen http://freshfoo.com/posts/pulseaudio_monitoring/ gefunden habe was ziemlich viel ist, was im suchen ich denke, aber ich muss sein fähig, einzelne Proben zu lesen, um sie mit Schwellen zu vergleichen, die verwendet werden. Analyze audio using Fast Fourier Transform ist auch ein Thema, das helfen könnte, wenn es einen Code/Erklärung darüber gäbe, wie der Ersteller diese Nummern bekommen hat. Ich hoffe, dass u mir dabei helfen kann, für weitere Informationen einfach auf raspberry-vu project :)

Antwort

0

einen Blick fragen, ist es eine ähnliche Funktion mit den intensiven CPU-Teilen in C geschrieben, die auf einem RPi ziemlich wichtig sind.

können Sie die src/impulse.c und src/test-impulse.c zu tun ändern, was Sie wollen, wenn Sie auch in gsl und cblas (dep von GSL) verknüpfen und umfassen <gsl/gsl_statistics_double.h>. Sie werden feststellen, dass Sie ein Array [256] von im_getSnapshot() zurückbekommen, das die FFT-Magnituden enthält. Übergeben Sie dieses Array an Ihre gewünschte Funktion. für mich ist das sd = gsl_stats_sd(array, 1, 256), und es wird die Standardabweichung als einfaches Doppel zurückgeben. Für Sie verwenden Sie mean = gsl_stats_mean(array, 1, 256), was Ihnen den Durchschnittswert der gesamten spektralen Verteilung gibt. Sie können dann etwas basierend auf dem Wert mean tun.

Ich mache ein ähnliches Projekt, um eine RTP-Quelle basierend auf der Erkennung von weißem Rauschen zu suspendieren/entsperren (SD ist sehr niedrig für weißes Rauschen). Wenn die SD sehr niedrig ist, ist die RTP-Senke gesperrt. Ansonsten ist es aktiviert. Dies bedeutet, dass eine Flut von RTP-Paketen nur dann auftritt, wenn Nicht-Whitenoise gefunden wird.

Dies ist möglicherweise die einfachste Methode, auf ein Audio-Pegelsignal zu reagieren. ich habe hier einen schnipsel gemacht, der sowohl den stddev als auch den mittelwert des audio darstellt, das ich überwache.

#include <unistd.h> 
#include "impulse.h" 
#include <stdio.h> 
#include <gsl/gsl_statistics_double.h> 

int main() { 
     int i; 
     double stddev, stddev_max=0, mean; 

     im_start(); 

     while (1) { 
       usleep(1000000/10); 
       double *array = im_getSnapshot(IM_FFT); 
       for (i = 0; i < 256; i+=16) 
       { 
         printf(" %.3f,", array[ i ]); 
       } 

       stddev = gsl_stats_sd(array, 1, 256); 
       mean = gsl_stats_mean(array, 1, 256); 
       if (stddev > stddev_max) 
        stddev_max = stddev; 

       printf(" = [%.05f, %.05f] %.05f\n", stddev, stddev_max, mean); 
       fflush(stdout); 

       // if (mean > some_value) { do_something(); } 
       // else { do_something_else(); } 
     } 

     im_stop(); 

     return 0; 
} 
+0

Vielen Dank an Sie Herr sieht aus wie etwas, mit dem ich arbeiten kann, krank versuchen Sie es in ein paar Tagen. Entschuldigung für meine späte Reaktion darauf – Slowmo