взглянуть на 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;
}
большое спасибо вам, сэр выглядит как-то, с чем я могу работать, плохо попробуйте это через пару дней. извините за мою позднюю реакцию на это – Slowmo