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


11

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

Dn=1N−n∑k=nN−1|Sk−Sk−n|

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

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

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

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

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

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

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

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


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

как низко ваши частоты? есть ли пример для меня, чтобы слушать?
— ederwander

Ответы:


10

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

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

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

Qx[k,n0]≜1N∑n=0N−1(x[n+n0−⌊N+k2⌋] − x[n+n0−⌊N+k2⌋+k])2

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

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

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

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

где

Rx[0,n0]≜1N∑n=0N−1(x[n+n0−⌊N2⌋])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

Предположим, что в течение минуты является периодическим с периодом P (а P оказывается целым числом), тогда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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.