2016-12-09 10 views
0

Я пытаюсь заставить мою малину сделать что-то на основе уровня звука воспроизводимой песни (выход звука). Песня не обязательно должна быть локальным mp3-файлом на Малине. Позвольте мне объяснить это так:Анализ уровня звука в реальном времени с использованием Python

Если (уровень звука выше порога): сделать что-то ..

Я нашел http://freshfoo.com/posts/pulseaudio_monitoring/ что довольно много, что им ищет я думаю, но я должен быть способный считывать отдельные образцы, чтобы сравнить его с пороговыми значениями, которые следует использовать. Analyze audio using Fast Fourier Transform также является темой, которая могла бы помочь, если бы был код/​​объяснение того, как создатель получил эти числа. Я надеюсь, что и может помочь мне с этим, для Дополнительной информацией просто спросить :)

ответ

0

взглянуть на raspberry-vu project, это аналогичная функция с ресурсоемкими частями, написанных на языке C. Это довольно важно, на RPi.

вы можете модифицировать src/impulse.c и src/test-impulse.c делать то, что вы хотите, если вы также компоновать gsl и cblas (отд из GSL) и включают в себя <gsl/gsl_statistics_double.h>. вы заметите, что вы получите массив [256] назад от im_getSnapshot(), который содержит величины FFT. передайте этот массив на нужную вам функцию. для меня это sd = gsl_stats_sd(array, 1, 256), и оно вернет стандартное отклонение как простой двойной. для вас вы захотите использовать mean = gsl_stats_mean(array, 1, 256), который даст вам среднее значение всего спектрального распределения. вы можете сделать что-то, основанное на значении mean.

Я делаю аналогичный проект для приостановки/отказа от источника RTP на основе обнаружения белого шума (SD очень низкий для белого шума). если SD очень низкий, приемник RTP приостанавливается. в противном случае он включен. это означает, что поток RTP-пакетов происходит только при обнаружении не-whitenoise.

Это может быть ваш самый простой способ реагирования на сигнал уровня звука. Я сделал фрагмент здесь, который представляет собой stddev и значение звука, который я контролирую.

#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

большое спасибо вам, сэр выглядит как-то, с чем я могу работать, плохо попробуйте это через пару дней. извините за мою позднюю реакцию на это – Slowmo