问题描述
|
我有实现低通滤波器的代码,以检测麦克风是否受到打击。
我不明白如何确定频率并选择自己的ALPHA:
@H_404_0@
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;这应该可以检测到麦克风受到打击。 我想要一个新的ALPHA来实现fc = 1 khz或更高的低通滤波器。 我如何选择另一个ALPHA来做到这一点? 他们采用ALPHA = 0.05,并根据Wikipedia公式,以他们每秒进行30次采样的速率,得出fc为1.2 Hz。 还是应该采用44.1 kHz的采样率?我们以30 Hz采样信号。
解决方法
这是一个简单的递归低通滤波器,仅用于平滑从麦克风测得的(瞬时)功率。通常,您需要较低的截止频率,例如1 Hz,因此您可以滤除所有噪声并获得平滑的功率测量。增加截止频率(增加ALPHA)将使输出响应更快,但会引入更多噪声。相反,降低截止频率(降低ALPHA)将使输出响应更慢,但也将减少噪声量。
请注意,如果仅以30 Hz更新滤波器,则不能将截止频率设置为1 kHz。奈奎斯特速率为15 Hz,因此您只能以低于此频率的频率进行滤波。此外,如果您只想检测麦克风是否吹响,则尝试以如此高的频率进行滤波是没有意义的。
,该页面可能提供了更清晰的公式版本,以及用于选择alpha的代码:
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]));
}
}
请注意,它可以一次在所有采样点上运行,而不是像原始问题那样随时间推移而运行。