c++ - 在 C++ 中检测小声音效果

标签 c++ audio compare fft detect

我正在尝试检测非常小(长度为 1-3 秒)的声音效果,目前我正在使用 FMod 使用环回技术捕捉声音(在另一个程序中播放)。

过去几天我一直在研究如何将捕获的音效与我存储的大约 50 个数据库进行比较,我知道比较每个二进制字节不会起作用,因为轻微的干扰会改变它。声音是每次捕获的确切音频文件。因此每次都应该几乎完全消失。

我不能使用任何已经存在的指纹库,因为它们需要录制至少 10-90 秒的音频。

由于声音很小,而且数量很少,我想你们中的一位专家知道一个简单的解决方案,我想尝试使用 FFT 并比较一些频率等,但无法获得 Kiss FFT 库工作,因为绝对没有 DOCS。

我还刚刚创建了一个拆分 channel 的功能。这里

int SeperateChannels(FMOD::Sound *sound)
{
    byte *ptr1, *ptr2;
    unsigned int lenbytes, len1, len2;

    sound->getLength(&lenbytes, FMOD_TIMEUNIT_PCMBYTES);
    sound->lock(0, lenbytes, (void**)&ptr1, (void**)&ptr2, &len1, &len2);

    byte *bufferLeft  = new byte[(lenbytes/2)];
    byte *bufferRight = new byte[(lenbytes/2)];

    for(int i = 0; i < lenbytes; i += 4)
    {
        bufferLeft[i]   = ptr1[i];
        bufferLeft[i+1] = ptr1[i+1];

        bufferRight[i]   = ptr1[i+2];
        bufferRight[i+1] = ptr1[i+3];
    }

    // Kiss FFT????

    return 1;
}

非常感谢任何帮助。 -阙

最佳答案

如果问题是确定录制了一组预定义声音中的哪一个,那么我可以想到两个选项:将录音与数据库中的所有声音“比较”,或者执行基于“查找”的关于声音的一般特征(在音频分析文献中通常称为“描述符”)。对于描述符,我正在考虑类似 spectral centroid 的事情.

对于“比较”情况,您可以使用 correlation 在时域中执行此操作,或通过计算频谱幅度差异在频域中。对于时域比较,您需要在多个偏移处执行相关,因为您不知道声音从哪里开始。对于频域情况,您需要将原始 FFT 数据转换为某种频谱包络——例如取一组(窗口)重叠帧的幅度谱的平均值。

对于“查找”情况,您将计算一组描述符,在您的语料库和候选输入上计算它们,然后在语料库中查找最接近您为输入计算的描述符的元素。您还可以在一系列帧上执行此操作:执行与时域“比较”情况相同的相关分析,但不是计算每个样本的差异,而是计算每个描述符的差异 -这比仅使用单个描述符更适合比较不断变化的声音。

如果您打算使用 FFT,您不仅需要了解如何应用 FFT,还需要了解如何计算幅度谱,并对您正在处理的数据结构有一些了解。获得结果需要许多步骤,而不仅仅是执行 FFT。有很多方法可以优化匹配,特别是如果您的声音设置是固定的(例如,我正在考虑分组测试方法)。

对于更简单的方法,您可以查看 DTMF touch tone 的方式解码完成。通过对源声音进行预分析,您或许能够确定一组非重叠频率,这些频率可用于对每个声音进行指纹识别。

在所有情况下,我都会通过对左右声道求和来在单声道中执行此操作。除非您确定输入与输出具有相同的声相,否则立体声不会给您太多帮助。

关于c++ - 在 C++ 中检测小声音效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157359/

相关文章:

c++ - 如何通过在逗号后打断来制作 clang 格式换行函数?

如果没有 seekg 和 seekp,c++ fstream write 不适用于二进制文件

python - 比较 python 中的变量

ios - 拉动以刷新声音

audio - .wav 文件中的 "type=1"是什么意思?

c - 为什么 2 比较大于 2,5?

python - 如何判断一个日期是否在另外两个日期之间?

c++ - 将包含 2d 指针的结构复制到设备

c++ - 将继承与基于 stdvector 的植绒结合使用

iphone - 让 iPhone 振动 : AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) undeclared