我的代码实现了低通滤波器,以便检测麦克风上的一击。 我无法理解如何确定频率并选择我自己的ALPHA:
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
这应该可以检测到麦克风受到的打击。
我想获得一个新的ALPHA来实现fc = 1 khz或更高的低通滤波器。
我如何选择其他ALPHA来做到这一点?
他们服用ALPHA = 0.05并且根据维基百科公式,他们的采样率为每秒30次,我的fc为1.2 Hz。
或者我应该采用44.1 kHz的采样率?我们以30 Hz的频率对信号进行采样。
答案 0 :(得分:5)
这是一个简单的递归低通滤波器,仅用于平滑麦克风的测量(瞬时)功率。通常,您需要一个低截止频率,例如1 Hz,这样您就可以滤除所有噪声,并获得平滑的功率测量。增加截止频率(增加ALPHA)将使输出响应更快但会引入更多噪声。相反,降低截止频率(减少ALPHA)将使输出响应更慢,但也会减少噪声量。
请注意,如果您仅以30 Hz更新滤波器,则无法将截止频率设置为1 kHz。 Nyquist rate为15 Hz,因此您只能以低于此值的频率进行过滤。此外,如果您想要做的就是检测麦克风上的吹气,那么尝试以如此高的频率进行过滤是没有意义的。
答案 1 :(得分:0)
This page可能会给出一个更清晰的公式版本,其中包含选择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]));
}
}
请注意,它可以同时适用于所有采样点,而不是像原始问题那样随时间推移。