Я использую функцию разности средних величин для оценки основной частоты квазипериодического аудиосигнала. AMDF определяется как
где - длина сигнала. Эта функция демонстрирует минимум, когда сигнал сдвинут на величину, равную его периоду.
Это код, который я использую для извлечения высоты тона (в Matlab):
a = amdf(f);
a = a/max(a);
[p l] = findpeaks(-a, 'minpeakprominence', 0.6);
pitch = round(sample_freq/l(1);
Однако я имею дело со звуковым сигналом, где основная частота очень низкая:
Как следствие, возникает проблема удвоения основного тона: обнаруженный минимум соответствует половине периода сигнала (то есть второй гармонике):
Я пытался извлечь самый большой пик и не только первый, но иногда эта проблема остается. Как я могу улучшить свой код и / или функцию AMDF, чтобы справиться с низким фундаментальным?
audio
pitch
fundamental-frequency
firion
источник
источник
Ответы:
Это то, что мы называем в бизнесе по определению высоты тона, « проблема октав ».
Прежде всего, я бы поменял AMDF на ASDF. И я бы не стал уменьшать размер окна по мере увеличения лага. (Кроме того, я меняю обозначение на то, что считаю более условным. "x[n] " - это сигнал с дискретным временем.)
Среднеквадратичная разностная функция (ASDF) дляx[n] в окрестности выборки x[n0] равна:
-функция, и если k четное, то ⌊ k⌊⋅⌋ k .⌊k2⌋=⌊k+12⌋=k2
floor()
Теперь, расширить площадь и рассмотреть то , что сложения выглядеть , как (не то, что N является уходящим в бесконечность, но , чтобы дать вам представление о том , если N велико). ASDF напрямую связан с автокорреляцией. Это по сути автокорреляция перевернутая с ног на голову. Эти шаги я оставлю вам. взгляните на этот ответ.N→∞ N N
Итак, теперь рассмотрим эту «автокорреляцию» конечной длины (в окрестности выборки ), определенную из ASDF:x[n0]
где
Поскольку и Q x [ k , n 0 ] ≥ 0 для всех лагов k , это означает, что R x [ k , n 0 ] ≤ R x [ 0 , n 0 ] для всех лагов к .Qx[0,n0]=0 Qx[k,n0]≥0 k Rx[k,n0]≤Rx[0,n0] k
Предположим, что в течение минуты является периодическим с периодом P (а P оказывается целым числом), тогдаx[n] P P
и и R x [ m P , n 0 ] = R x [ 0 , n 0 ] ≥ R x [ k , n 0 ] для любого целого числа периодов ( m представляет собой целое число). Таким образом, вы получите пик при k = 0 и при k, равный любому другому кратному P, если xQx[mP,n0]=0 Rx[mP,n0]=Rx[0,n0]≥Rx[k,n0] m k=0 k P является периодическим. Если x [ n ] неявляетсяидеально периодическим, мы можем ожидать, что это самый большой пик при k = 0 , другой пик (но немного меньший) при k = P (период, который мы ищем) и прогрессивно меньшие пики для больших кратных значений. P .x[n] x[n] k=0 k=P P
Таким образом, проблема октавы возникает по нескольким причинам. Прежде всего, не обязательно является целым числом. Это проблема интерполяции, а не проблема.P
Вторая причина и более сложная проблема - проблема субгармоник . Предположим, что вы слушаете хороший периодический тон с частотой A-440 Гц, и он звучит как A, который на 9 полутонов выше среднего C. Теперь предположим, что кто-то добавляет к этому тону очень малую амплитуду (например, до 60 дБ) A -220? Как это будет звучать и математически, что такое «истинный» период?
Выбор «правильного» пика за период.
Допустим, вы пропустили заметку через фильтр блокировки постоянного тока, так что среднее значение равно нулю. Оказывается, что среднее значение автокорреляции R x [ k , n 0 ] для каждого n 0 также становится равным нулю (или близко к нему, если N большое). Это означает, что R x [ k , n 0 ] должно суммироваться (через k ), чтобы быть около нуля, что означает, что область выше нуля такая же, как и нижеx[n] Rx[k,n0] n0 N Rx[k,n0] k
Итак, представляет степень x [ n ] в окрестности вокруг n = n 0 и должна быть неотрицательной. R x [ k , n 0 ] никогда не превышает R x [ 0 , n 0 ], но может быть таким же большим, как оно, когда x [ n ] является периодическим. R x [ P , n 0 ]Rx[0,n0] x[n] n=n0 Rx[k,n0] Rx[0,n0] x[n] если x [ n + P ] = x [ n ] . Поэтому, если x [ n ] является периодическим с периодом P, и у вас есть группа пиков, разнесенных на P, и у вас есть представление о том, насколько высокими должны быть эти пики. И если постоянная составляющая R x [ k , n 0 ] равна нулю, это означает, что между пиками онадолжнаиметь отрицательные значения.Rx[P,n0]=Rx[0,n0] x[n+P]=x[n] x[n] P P Rx[k,n0]
Если был «квазипериодическим», один цикл x [ n ] будет очень похож на соседний цикл, но не так, как цикл x [ n ] дальше вниз по сигналу во времени. Это означает, что первый пик R x [ P , n 0 ] будет выше, чем второй при R x [ 2 P , n 0 ] или третьем R x [ 3 P , n 0 ]x[n] x[n] x[n] Rx[P,n0] Rx[2P,n0] Rx[3P,n0] , Можно использовать правило, чтобы всегда выбирать самый высокий пик и ожидать, что самый высокий пик всегда будет первым. Но из-за неразборчивых субгармоник иногда это не так. иногда второй или, возможно, третий пик немного выше. Кроме того, поскольку период , скорее всего, не является целым числом выборок, а k в R x [ k , n 0 ] всегда является целым числом, поэтому истинный пик, вероятно, будет находиться между целочисленными значениями k . Даже если бы вам пришлось интерполировать, где находится гладкий пик (который я рекомендую, и квадратичная интерполяция достаточно хороша), и насколько он на самом деле высокий между целыми числами kP k Rx[k,n0] k k Ваш интерполяционный алгоритм может сделать пик немного выше или немного ниже, чем он есть на самом деле. Таким образом, выбор абсолютного максимума может привести к тому, что второй пик окажется выше первого (или наоборот), когда вы действительно захотите другой.
Так что каким-то образом вы должны гандикапить пики при увеличении чтобы первый пик имел небольшое преимущество перед вторым, а второй - над четвертым (следующая октава вниз) и т. Д. Как вы это делаете?k
Это можно сделать , что путем умножения с убывающей функцией к так , что пик при K = 2 , P уменьшается на некоторый коэффициент, по отношению к идентичным пика при к = Р . Оказывается, что степенная функция (не экспоненциальная) делает это. так посчитатьRx[k,n0] k k=2P k=P
Таким образом, если были идеально периодическими с периодом P и игнорировали вопросы интерполяции для нецелого P , тоx[n] P P
но
Коэффициент, на который уменьшается пик на одну октаву ниже, является отношением
Это последовательный способ взвесить или ослабить или ослабить пик, соответствующий субгармонической высоте на одну октаву ниже.
источник
Эвристически, основная частота голосовой речи будет лежать в интервале [70, 400] Гц. Итак, первым шагом будет применение полосового фильтра, чтобы приблизительно изолировать эту полосу.
Во-вторых, вы можете применить весовую функцию к спектру мощности. Вблизи основного значения вес должен быть около 1, а ближе к концу полосы вес должен быть около 0. Это взвешивание, конечно, нормализовано. Я бы порекомендовал что-то суперлинейное: квадратичное, квартическое и т. Д. - чтобы действительно убить октавы.
источник