raspberry-vu projectを見てください。それはRPi上でかなり重要なcpu集中部分と同様の機能です。
あなたもgsl
とcblas
(GSLのDEP)にリンクし、<gsl/gsl_statistics_double.h>
が含まれている場合、あなたがやりたいsrc/impulse.c
とsrc/test-impulse.c
を変更することができます。 FFTの大きさを保持するim_getSnapshot()
から配列[256]を取得していることに気付くでしょう。その配列を目的の関数に渡します。私にとってはsd = gsl_stats_sd(array, 1, 256)
だから、標準偏差を単純な二重として返すでしょう。あなたのために、すべてのスペクトル分布の平均値を与えるmean = gsl_stats_mean(array, 1, 256)
を使用したいと思うでしょう。 mean
の値に基づいて何かを行うことができます。
ホワイトノイズ検出に基づいてRTPソースをサスペンド/サスペンド解除する同様のプロジェクトを行っています(SDはホワイトノイズに対して非常に低い)。 SDが非常に低い場合、RTPシンクは中断されます。それ以外の場合は有効になります。これは、RTPパケットの洪水は、ホワイトニングなしが見つかった場合にのみ発生することを意味します。
これは、オーディオレベルの信号に反応する最も簡単な方法です。私はここでスニペットを作成しました。これは、監視しているオーディオの標準と平均の両方を表しています。
#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;
}
あなたに大きなおかげで、私は何かのように見えますが、病気は2,3日後にこれを試してみてください。私の後半の反応には申し訳ありません – Slowmo