繁体   English   中英

用于检测音频零交叉的选项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM