[英]Options for detecting zero cross of audio
我有现场音频输入,我需要检测零交叉。
像这个问题所述的那样,执行此操作的简单算法无法满足我的需求。 该算法通过将当前项与上一项相乘的符号来检测零交叉。
这是此方法失败的一个简单示例:
-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
}
我还需要其他哪些算法选择来检测零交叉?
记录最后一个非零样本的符号,并且仅当当前样本也为非零时才考虑相乘的结果(零样本永远不会相交)。
for (int i=0, previous=sign(data[0]); i<numFrames-1; i++) {
if(int current = sign(data[i])) {
if(sign(previous * current) == -1)
printf("zero cross");
previous = current;
}
}
忽略该值,仅使用符号来检测交叉。
#include <math.h>
for (int i=0; i<numFrames-1; i++) {
if (signbit(data[i+1]) != signbit(data[i])) printf("zero cross");
}
signbit宏报告所有值的符号,包括无穷大,零和NaN。
[编辑]
当且仅当其参数值的符号为负时, signbit()
返回非零值。 因此,两个不同的负值可能会返回不同的非零值。 更好地使用:
if (!signbit(data[i+1]) != !signbit(data[i])) printf("zero cross");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.