Используйте свертку, чтобы найти справочную аудио -образец в непрерывном потоке звука

StackOverflow https://stackoverflow.com/questions/5847570

Вопрос

в Мой предыдущий вопрос Найдя справочную образец аудио в более широком аудио -образе, было предложено, что я должен использовать свертку.
С использованием Dsputil, Я смог сделать это. Я немного сыграл с этим и попробовал различные комбинации образцов аудио, чтобы увидеть, каков был результат. Чтобы визуализировать данные, я только что сбросил необработанное аудио в качестве чисел, чтобы Excel и создал диаграмму, используя эти числа. Пик является Видимо, но я не знаю, как это мне помогает. У меня есть эти проблемы:

  • Я не знаю, как сделать вывод о начальном положении матча в оригинальной аудио -образец из местоположения пика.
  • Я не знаю, как я должен применить это с непрерывным потоком звука, чтобы я мог отреагировать, как только произойдет образец справочной аудио.
  • Я не понимаю, почему изображение 2 и изображение 4 (см. Ниже) очень сильно отличаются, хотя оба представляют собой образец звука, свернутой с самим собой ...

Любая помощь высоко ценится.

Следующие изображения являются результатом анализа с использованием Excel:

  1. Более длинная аудио образец с эталонным звуком (звуковой сигнал) ближе к концу:
  2. Звонок свернулся с самим собой:
  3. Более длинная аудио образец без звукового сигнала, свернувшегося с звуковым сигналом:
  4. Более длинная образец аудио точки 3 свернулась с самим собой:

Обновление и решение:
Благодаря обширной помощи Хана, я смог достичь своей цели.
После того, как я свернул собственную медленную реализацию без БПФ, я нашел Альглиб который обеспечивает быструю реализацию. В моей проблеме есть одно основное предположение: один из образцов аудио содержится полностью в другом.
Таким образом, следующий код возвращает смещение в образцах в большем из двух образцов аудио и нормализованного поперечного корреляционного значения при этом смещении. 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 cross correlation value and its index
    foreach (var d in result)
    {
        if (d > max)
        {
            index = i;
            max = d;
        }
        ++i;
    }
    // if the index is bigger than the length of the first array, it has to be
    // interpreted as a negative index
    if (index >= data1Array.Length)
    {
        index *= -1;
    }

    var matchingData1 = data1;
    var matchingData2 = data2;
    var biggerSequenceCount = Math.Max(data1Array.Length, data2Array.Length);
    var smallerSequenceCount = Math.Min(data1Array.Length, data2Array.Length);
    offset = index;
    if (index > 0)
        matchingData1 = data1.Skip(offset).Take(smallerSequenceCount).ToList();
    else if (index < 0)
    {
        offset = biggerSequenceCount + smallerSequenceCount + index;
        matchingData2 = data2.Skip(offset).Take(smallerSequenceCount).ToList();
        matchingData1 = data1.Take(smallerSequenceCount).ToList();
    }
    var mx = matchingData1.Average();
    var my = matchingData2.Average();
    var denom1 = Math.Sqrt(matchingData1.Sum(x => (x - mx) * (x - mx)));
    var denom2 = Math.Sqrt(matchingData2.Sum(y => (y - my) * (y - my)));
    maximumNormalizedCrossCorrelation = max / (denom1 * denom2);
}

НАГРАДА:
Не требуется новых ответов! Я начал награду, чтобы наградить его Хану за его постоянные усилия с этим вопросом!

Это было полезно?

Решение

Здесь мы идем на щедрость :)

Чтобы найти конкретный эталонный сигнал в более крупном фрагменте аудио, вам необходимо использовать алгоритм межреляции. Основные формулы можно найти в этом Википедия статья.

Кросс-корреляция-это процесс, с помощью которого сравниваются 2 сигнала. Это делается путем умножения оба сигналов и суммирования результатов для всех образцов. Затем один из сигналов смещается (обычно на 1 образец), и расчет повторяется. Если вы попытаетесь визуализировать это для очень простых сигналов, таких как один импульс (например, образец 1 имеет определенное значение, в то время как оставшиеся образцы равны нулю) или чистая синусоидальная волна, вы увидите, что результат кросс-корреляции-это действительно Мера для того, сколько оба сигнала одинаковы и задержки между ними. Другая статья, которая может дать больше понимания, можно найти здесь.

Этот Статья Пола Бурка Также содержит исходный код для простой реализации временной области. Обратите внимание, что статья записана для общего сигнала. Audio обладает специальной собственностью, что давнее среднее значение является обычным 0. Это означает, что средние значения, используемые в формуле Пола Буркс (MX и My), могут быть оставлены. Существуют также быстрые реализации межкорреляции на основе БПФ (см. Альглиб).

(Максимальное) значение корреляции зависит от значений выборки в аудиосигналах. Однако в алгоритме Пола Бурка максимум масштабируется до 1,0. В тех случаях, когда один из сигналов содержится исключительно в пределах другого сигнала, максимальное значение достигнет 1. В более общем случае максимальное будет ниже, а пороговое значение должно быть определено, чтобы решить, являются ли сигналы достаточно одинаковыми.

Другие советы

Вместо свертки вы должны использовать корреляцию. Размер пика корреляции сообщает вам, сколько оба сигнала одинаковы, положение пика их относительного положения во времени или задержку между обоими сигналами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top