相关疑难解决方法(0)

使用卷积在连续的声音流中查找参考音频样本

我之前关于在更大的音频样本中找到参考音频样本的问题中,有人建议我应该使用卷积.
使用DSPUtil,我能够做到这一点.我玩了一下,尝试了不同的音频样本组合,看看结果是什么.为了可视化数据,我只是将原始音频作为数字转储到Excel并使用这些数字创建了一个图表.一个高峰可见的,但我真的不知道这对我有什么帮助.我有这些问题:

  • 我不知道,如何从峰值位置推断原始音频样本中匹配的起始位置.
  • 我不知道,我应该如何应用连续的音频流,所以一旦参考音频样本出现,我就能做出反应.
  • 我不明白,为什么图片2和图片4(见下文)差别如此之大,尽管两者都代表了与自身卷积的音频样本......

任何帮助都非常感谢.

以下图片是使用Excel进行分析的结果:

  1. 一个较长的音频样本,附近有参考音频(哔哔声):http: //img801.imageshack.us/img801/976/values1.png
  2. 哔哔声与自己融为一体:http: //img96.imageshack.us/img96/6720/values2i.png
  3. 没有哔哔声的较长音频样本与哔哔声缠绕在一起:http: //img845.imageshack.us/img845/1091/values3.png
  4. 第3点的较长音频样本与其自身融合:http: //img38.imageshack.us/img38/1272/values4.png

更新和解决方案:
感谢Han的广泛帮助,我实现了目标.
在我没有FFT的情况下推出自己的慢速实现后,我发现alglib提供了快速实现.我的问题有一个基本假设:其中一个音频样本完全包含在另一个中.
因此,以下代码返回两个音频样本中较大者中的样本中的偏移量以及该偏移量处的归一化互相关值.1表示完全相关,0表示根本没有相关,-1表示完全负相关:

private void CalcCrossCorrelation(IEnumerable<double> data1, 
                                  IEnumerable<double> data2, 
                                  out int offset, 
                                  out double maximumNormalizedCrossCorrelation)
{
    var data1Array = data1.ToArray();
    var data2Array = data2.ToArray();
    double[] result;
    alglib.corrr1d(data1Array, data1Array.Length, 
                   data2Array, data2Array.Length, out result);

    var max = double.MinValue;
    var index = 0;
    var i = 0;
    // Find the maximum …
Run Code Online (Sandbox Code Playgroud)

.net c# signal-processing convolution cross-correlation

9
推荐指数
1
解决办法
4389
查看次数