我试图让我的覆盆子根据播放歌曲的音频级别(声音输出)做一些事情。这首歌不一定是 Raspberry 上的本地 mp3 文件。让我这样解释:
如果(音频电平高于阈值):
做点什么..
我找到了 http://freshfoo.com/posts/pulseaudio_monitoring/我猜这几乎就是我要寻找的东西,但我必须能够读取单个样本,以便将其与将使用的阈值进行比较。 Analyze audio using Fast Fourier Transform如果有关于创建者如何获得这些数字的代码/解释,这也是一个可以提供帮助的主题。
我希望你能帮我解决这个问题,更多信息请询问:)
最佳答案
看看raspberry-vu project ,它与用 C 编写的 cpu 密集部分类似的功能。这在 RPi 上相当重要。
你可以修改src/impulse.c
和 src/test-impulse.c
如果您还链接到 gsl
,则可以做您想做的事和 cblas
(gsl 的部门)并包括 <gsl/gsl_statistics_double.h>
.您会注意到您从 im_getSnapshot()
返回了一个数组 [256]其中包含 FFT 幅度。将该数组传递给您想要的函数。对我来说是sd = gsl_stats_sd(array, 1, 256)
,它会将标准差作为简单的 double 值传回。对你来说,你会想要使用 mean = gsl_stats_mean(array, 1, 256)
这将为您提供所有光谱分布的平均值。然后你可以根据 mean
的值做一些事情.
我正在做一个类似的项目来暂停/取消暂停基于白噪声检测的 RTP 源(白噪声的 SD 非常低)。如果 SD 非常低,RTP 接收器被挂起。否则它被启用。这意味着只有在发现非白噪声时才会发生大量 RTP 数据包。
这可能是您对音频电平信号使用react的最简单方法。我在这里制作了一个片段,代表我正在监视的音频的标准差和平均值。
#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;
}
关于python - 使用 Python 实时分析音频电平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057570/