2011-05-23 123 views
1

我的代码实现了一个低通滤波器,以检测麦克风的击球。 我不明白如何确定的频率,并挑选我自己的ALPHA:iPhone中的低通滤波器

lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 

这应该检测的麦克风打击。

我想获得一个新的ALPHA来实现fc = 1 khz或更高的低通滤波器。

我如何挑选另一个ALPHA来做到这一点?

他们花了ALPHA = 0.05,根据维基百科公式,他们所做的每秒采样率为30次,我得到1.2 Hz的fc。

或者我应该采取44.1 kHz的采样率?我们在30赫兹采样信号。

+0

我不知道我必须接受答案!我只是提到现在.. :) – Curnelious 2011-05-23 16:02:26

回答

5

这是一个简单的递归低通滤波器,它只是用来平滑麦克风的测量(瞬时)功率。通常你需要一个低截止频率,例如1 Hz,以便滤除所有噪音并获得平滑的功率测量。增加截止频率(增加ALPHA)会使输出响应更快,但会引入更多噪声。反过来,降低截止频率(降低ALPHA)会使输出反应更慢,但也会减少噪音量。

请注意,如果您只更新30 Hz的滤波器,则无法将截止频率设置为1 kHz。 Nyquist rate是15赫兹,因此您只能在低于此频率的频率下进行滤波。另外,如果您想要做的只是检测麦克风吹气,那么在如此高的频率下尝试和过滤是没有意义的。

+0

感谢您的答案,我不想检测到一击。最后的目标是通过SUB在2个低通滤波器之间检测一定的频率,并得到一个带通滤波器。对你来说似乎是逻辑?他们是如何在30Hz采样?他们需要检测低于400赫兹?这里是链接:http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/ – Curnelious 2011-05-23 15:01:18

+0

好吧 - 那么你应该真的重新考虑你的方法然后 - 使用FFT来获得一个功率谱,然后检查感兴趣的频率范围的垃圾箱 - 有很多SO的帖子已经涵盖了如何做到这一点。 – 2011-05-23 15:31:42

+0

FFT很棒,但我找不到这样简单的东西。 aurioTouch并不那么简单。你可以指示我发布一篇文章,我可以带我的代码并使用它实现一个fft?谢谢。 – Curnelious 2011-05-23 15:37:52

0

This page或许给出了公式的更清晰的版本,代码选择阿尔法:

void lowPassFrequency(double* input, double* output, int points) 
{ 
    double RC = 1.0/(CUTOFF*2*3.14); 
    double dt = 1.0/SAMPLE_RATE; 
    double alpha = dt/(RC+dt); 
    output[0] = input[0] 
    for(int i = 1; i < points; ++i) 
    { 
     output[i] = output[i-1] + (alpha*(input[i] - output[i-1])); 
    } 
}  

注意,它适用于所有的样本点一次,而不是随着时间的推移在原来的问题。