【发布时间】:2015-12-23 19:48:22
【问题描述】:
我有实时音频进来,我需要检测过零。
像this question 所述的更简单的算法不能满足我的需要。该算法通过取当前项与前一项相乘的符号来检测过零。
这是此方法失败的一个简单示例:
-1, -0.5, 0, 0, 0.32, 0.5...
连续两个零,算法将失败。
这个方法是这样实现的:
int sign(float value) {
if (value < 0) {
return -1;
} else if (value > 0) {
return 1;
}
return 0;
}
for (int i=0; i<numFrames-1; i++) {
int signR = sign(data[i+1] * data[i]);
if (signR == 0) printf("zero cross");
// but this will fail for data[i+1] = data[i] = 0, for example
}
我还需要哪些其他算法选项来检测过零?
【问题讨论】:
-
只需跟踪最后一个非零样本的符号即可。如果符号发生变化,则您有过零。
-
请注意,浮点值很少等于零。您应该与 epsilon 或容差值进行比较,例如 1E-06;小于这个值的任何东西都被认为是零。
-
我这样做了,结果是连续出现一堆零,因此无法检测到零交叉。
-
您可能需要考虑使用定点数学来获得更好的准确性。
-
了解为什么您想要检测过零会很有趣。一个原因是这是切换输出路线的好时机,以避免突然的电平变化。如果是这样,则可以在信号接近零时完成,而不是在交叉时完成。