Як боротися з низьким рівнем фундаментальності при використанні 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, щоб боротися з низькою основою?


Психоакустика та сприйняття людини впливають на сприйняття висоти тону та октави. Може знадобитися експериментування, щоб визначити, за яких умов найбільший пік 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

- це floor()функція, і якщо навіть тоді .kk2=k+12=k2

Тепер, розширити площу і розглянути те , що складання виглядати , як (Не те, що є йдуть у нескінченність, але , щоб дати вам уявлення про те , якщо велике). ASDF безпосередньо пов'язаний з автокореляцією. По суті, автокореляція перевернута догори дном. Ці кроки я залишу вам. погляньте на цю відповідь.NN N

Отже, тепер розглянемо цю "автокореляцію" кінцевої довжини (в околиці зразка ), визначену з ASDF:x[n0]

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

де

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

Оскільки і для всіх лагів , то це означає, що для всіх відставань .Qx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Припустимо, на хвилину, що періодично з періодом (а трапляється цілим числом), значитьx[n]PP

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

і і для будь-якого цілого числа періодів ( - ціле число). Таким чином, ви отримуєте пік при і при рівний будь-якому іншому кратному якщо є періодичним. Якщо не є ідеально періодичним, ми можемо очікувати, що найбільший пік при , інший пік (але трохи менший) при (період, який ми шукаємо) і прогресивно менші піки для більших кратних .Qx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]mk=0kPx[n]x[n]k=0k=PP

Тож проблема з октавою виникає через пару причин. Перш за все, не обов'язково є цілим числом. Це проблема інтерполяції, не велика справа. P

Друга причина і більш складна проблема - це субхармонія . Подумайте, що ви слухаєте приємний періодичний тон рівно A-440 Гц, і це звучить як A, що на 9 півтонів вище середнього С. Тепер припустимо, хтось додає до цього тону дуже крихітну амплітуду (наприклад, вниз на 60 дБ) A -220? Як це буде звучати математично і як це "справжній" період?


Вибір "правильного" піку за період.

Скажімо, ви запускаєте ноту через фільтр, що блокує постійний струм, так що середнє значення дорівнює нулю. Виявляється, що приводить також, що середнє значення автокореляції для кожного також дорівнює нулю (або близько до нього, якщо велике). Це означає, що повинен підсумовувати (понад ) приблизно до нуля, а значить, є стільки ж площі вище нуля, як і нижче.x[n]Rx[k,n0]n0NRx[k,n0]k

Гаразд, тому представляє силу поблизу і повинна бути негативною. ніколи не перевищує але може набувати таких великих розмірів, коли є періодичним. якщо . Отже, якщо періодично з періодом і у вас є купа піків, розташованих один від одного і ви маєте уявлення про те, наскільки високими вони повинні бути. І якщо компонент постійного струму дорівнює нулю, це означає, що знаходиться між піками, він повинен мати негативні значення.Rx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n]Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]

Якщо був "квазіперіодичним", один цикл буде багато нагадувати суміжний цикл, але не настільки, як цикл відстає від сигналу в часі. Це означає, що перший пік буде вищим, ніж другий при або третій . Можна використовувати правило, щоб завжди вибирати найвищий пік, і сподіватися, що найвищий пік завжди буде першим. Але, через нечутні субгармонії, іноді це не так. іноді другий або, можливо, третій пік ой-так-трохи вище. Крім того, оскільки період , ймовірно, не ціле число вибірок, а вx[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]PkRx[k,n0]завжди є цілим числом, тому справжній пік, ймовірно, буде між значеннями цілих . Навіть якби ви інтерполювали, де знаходиться гладкий пік (що я рекомендую, і квадратична інтерполяція є досить хорошою), і наскільки вона дійсно висока між цілим , ваша інтерполяційна альга може зробити пік трохи вище або трохи нижче, ніж він є насправді. Тож вибір абсолютно найвищого піку може призвести до помилкового вибору другого над першим піком (або навпаки), коли ви дуже хотіли іншого.kk

Тож якимось чином вам доведеться перешкоджати пікам при збільшенні так що перший пік має невелику перевагу перед другим, а другий над четвертим (наступна октава вниз) тощо. Як це зробити?k

Це можна зробити , що шлях множення з спадною функцією так , що пік при зменшуються на деякому коефіцієнті, по відношенню до ідентичною піку при . Виявляється, що функція живлення (не експоненціальна) робить це. так обчислитиRx[k,n0]kk=2Pk=P

kα Rx[k,n0]

Отже, якщо були ідеально періодичними з періодом , ігноруючи питання інтерполяції для не цілого числа , то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α

Отже, якщо ви хочете надати своєму першому піку збільшення на 1% над другим піком, а це означає, що ви не будете вибирати крок, який буде субгармонічним кроком, якщо тільки автокореляція підгармонічного кроку не буде на щонайменше на 1% більше, ніж перша пік, ви вирішите для зα

2α=0.99

Це послідовний спосіб зважування або знецінення або обмеження піку, що відповідає підгармонічному кроку на одну октаву нижче.

Це все ще залишає вас з питанням визначення порогових значень. Ви повинні вибрати добре. Але це послідовний спосіб підкреслити перший пік над другим, який є октавою нижче, але не настільки, щоб, якщо нота справді була на октаву нижче, але енергія у всіх парних гармонік була сильною, порівняно з непарною гармоніки, це все ще залишить можливість обрання другого піку.α


1
Щоб відповісти на ваше останнє запитання: якщо додати амплітуду 220 Гц, то крок буде 220 Гц, де 440 Гц - перша гармоніка після фундаментальної (математично кажучи). Мій випадок схожий, але є і більш високі гармоніки, тому відсутність фундаментальної проблеми не є проблемою з точки зору сприйняття. Я не розумію, як заміна AMDF на ASDF може вирішити проблему октави
звільнення

але інша половина питання - «як це буде звучати»? відповідайте на це, а потім давайте подивимось, що ви хочете робити з вашим детектором тону.
Роберт Брістоу-Джонсон

спробуйте обчислити та побудувати для того ж відтінку, який ви зробили для AMDF. має виглядати щось на зразок AMDF догори дном. Rx[k,n0]
Роберт Брістоу-Джонсон

Якщо у вас немає інших вищих гармонік, а лише 440 Гц, а тон 220 Гц досить низький, ви почуєте крок 440 Гц. Вище за якийсь рівень (я не знаю, який з них), ви почуєте також сигнал 220 Гц і так високий діапазон 220 Гц.
виїзд

є причина, чому я сказав -60 дБ. тепер, що ви хочете, щоб ваш детектор тону сказав, що це сигнал 220 Гц або 440 Гц або щось інше?
Роберт Брістоу-Джонсон

0

Евристично, основна частота озвученої мови буде лежати в інтервалі [70, 400] Гц. Отже, першим кроком було б застосувати смуговий фільтр, щоб приблизно ізолювати цю смугу.

По-друге, ви можете застосувати зважувальну функцію до спектру потужності. Біля основної, вага повинен бути близько 1, тоді як ближче до кінця смуги, вага повинен бути близько 0. Це зважування нормалізується, звичайно. Я б порекомендував щось суперлінійне: квадратичне, квартичне тощо - щоб справді вбити октави.


Як можна застосувати вагу? Я не знаю, де фундаментальне. Також мій сигнал - нота інструменту, тому діапазон більший
вистріл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.