Как бороться с низким фундаментальным при использовании AMDF для извлечения смолы?

11

Я использую функцию разности средних величин для оценки основной частоты квазипериодического аудиосигнала. AMDF определяется как

Dn=1Nnk=nN1|SkSkn|

где N - длина сигнала. Эта функция демонстрирует минимум, когда сигнал сдвинут на величину, равную его периоду.

Это код, который я использую для извлечения высоты тона (в Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Однако я имею дело со звуковым сигналом, где основная частота очень низкая:

спектр звукового сигнала

Как следствие, возникает проблема удвоения основного тона: обнаруженный минимум соответствует половине периода сигнала (то есть второй гармонике):

AMDF сигнала выше

Я пытался извлечь самый большой пик и не только первый, но иногда эта проблема остается. Как я могу улучшить свой код и / или функцию AMDF, чтобы справиться с низким фундаментальным?

firion
источник
Психоакустика и восприятие человека влияют на воспринимаемую высоту и октавную неопределенность. Может потребоваться экспериментирование, чтобы определить, при каких условиях наибольший пик AMDF дает ощутимую разницу.
hotpaw2
как низко ваши частоты? есть ли пример для меня, чтобы слушать?
ederwander

Ответы:

10

Это то, что мы называем в бизнесе по определению высоты тона, « проблема октав ».

Прежде всего, я бы поменял AMDF на ASDF. И я бы не стал уменьшать размер окна по мере увеличения лага. (Кроме того, я меняю обозначение на то, что считаю более условным. " x[n] " - это сигнал с дискретным временем.)

Среднеквадратичная разностная функция (ASDF) для x[n] в окрестности выборки x[n0] равна:

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

-функция, и если k четное, тоkfloor()k .k2=k+12=k2

Теперь, расширить площадь и рассмотреть то , что сложения выглядеть , как (не то, что N является уходящим в бесконечность, но , чтобы дать вам представление о том , если N велико). ASDF напрямую связан с автокорреляцией. Это по сути автокорреляция перевернутая с ног на голову. Эти шаги я оставлю вам. взгляните на этот ответ.NN N

Итак, теперь рассмотрим эту «автокорреляцию» конечной длины (в окрестности выборки ), определенную из ASDF:x[n0]

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

где

Rx[0,n0]1Nn=0N1(x[n+n0N2])2

Поскольку и Q x [ k , n 0 ] 0 для всех лагов k , это означает, что R x [ k , n 0 ] R x [ 0 , n 0 ] для всех лагов к .Qx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Предположим, что в течение минуты является периодическим с периодом PP оказывается целым числом), тогдаx[n]PP

x[n+P]=x[n]n

и и R x [ m P , n 0 ] = R x [ 0 , n 0 ] R x [ k , n 0 ] для любого целого числа периодов ( m представляет собой целое число). Таким образом, вы получите пик при k = 0 и при k, равный любому другому кратному P, если xQx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]mk=0kP является периодическим. Если x [ n ] неявляетсяидеально периодическим, мы можем ожидать, что это самый большой пик при k = 0 , другой пик (но немного меньший) при k = P (период, который мы ищем) и прогрессивно меньшие пики для больших кратных значений. P .x[n]x[n]k=0k=PP

Таким образом, проблема октавы возникает по нескольким причинам. Прежде всего, не обязательно является целым числом. Это проблема интерполяции, а не проблема. 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]n0NRx[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=n0Rx[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]PPRx[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 . Даже если бы вам пришлось интерполировать, где находится гладкий пик (который я рекомендую, и квадратичная интерполяция достаточно хороша), и насколько он на самом деле высокий между целыми числами kPkRx[k,n0]kkВаш интерполяционный алгоритм может сделать пик немного выше или немного ниже, чем он есть на самом деле. Таким образом, выбор абсолютного максимума может привести к тому, что второй пик окажется выше первого (или наоборот), когда вы действительно захотите другой.

Так что каким-то образом вы должны гандикапить пики при увеличении чтобы первый пик имел небольшое преимущество перед вторым, а второй - над четвертым (следующая октава вниз) и т. Д. Как вы это делаете?k

Это можно сделать , что путем умножения с убывающей функцией к так , что пик при K = 2 , P уменьшается на некоторый коэффициент, по отношению к идентичным пика при к = Р . Оказывается, что степенная функция (не экспоненциальная) делает это. так посчитатьRx[k,n0]kk=2Pk=P

kα Rx[k,n0]

Таким образом, если были идеально периодическими с периодом P и игнорировали вопросы интерполяции для нецелого P , тоx[n]PP

Rx[2P,n0]=Rx[P,n0]

но

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

Коэффициент, на который уменьшается пик на одну октаву ниже, является отношением

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

α

2α=0.99

Это последовательный способ взвесить или ослабить или ослабить пик, соответствующий субгармонической высоте на одну октаву ниже.

α

Роберт Бристоу-Джонсон
источник
1
Чтобы ответить на ваш последний вопрос: если вы добавите амплитуду 220 Гц, то высота звука будет 220 Гц, где 440 Гц - первая гармоника после основной (математически говоря). Мой случай похож, но есть и высшие гармоники, поэтому пропущенный фундаментал не является проблемой с точки зрения восприятия. Я не понимаю, как замена AMDF на ASDF могла бы решить проблему октавы
firion
но другая половина вопроса * как это будет звучать? ответьте, а затем посмотрим, что вы хотите, чтобы ваш детектор высоты тона делал.
Роберт Бристоу-Джонсон
Rx[k,n0]
Если у вас нет других высших гармоник, а только 440 Гц, а тон 220 Гц достаточно низкий, вы услышите частоту 440 Гц. Выше некоторого уровня (я не знаю, какой) вы услышите также тон 220 Гц и, таким образом, высоту 220 Гц.
Фирион
есть причина, почему я сказал -60 дБ. Теперь, что вы хотите, чтобы ваш детектор основного тона говорил, что это нота 220 Гц или 440 Гц или что-то еще?
Роберт Бристоу-Джонсон
0

Эвристически, основная частота голосовой речи будет лежать в интервале [70, 400] Гц. Итак, первым шагом будет применение полосового фильтра, чтобы приблизительно изолировать эту полосу.

Во-вторых, вы можете применить весовую функцию к спектру мощности. Вблизи основного значения вес должен быть около 1, а ближе к концу полосы вес должен быть около 0. Это взвешивание, конечно, нормализовано. Я бы порекомендовал что-то суперлинейное: квадратичное, квартическое и т. Д. - чтобы действительно убить октавы.

Чувак
источник
Как я могу применить вес? Я не знаю, где фундаментальный. Кроме того, мой сигнал - нота инструмента, поэтому диапазон больше
Firion