Це те, що ми називаємо в тоні виявлення тону, " проблемою октави ".
Перш за все, я б змінив 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
⌊⋅⌋ - це floor()
функція, і якщо навіть тоді .k⌊k2⌋=⌊k+12⌋=k2
Тепер, розширити площу і розглянути те , що складання виглядати , як (Не те, що є йдуть у нескінченність, але , щоб дати вам уявлення про те , якщо велике). 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
Оскільки і для всіх лагів , то це означає, що для всіх відставань .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
Це послідовний спосіб зважування або знецінення або обмеження піку, що відповідає підгармонічному кроку на одну октаву нижче.
Це все ще залишає вас з питанням визначення порогових значень. Ви повинні вибрати добре. Але це послідовний спосіб підкреслити перший пік над другим, який є октавою нижче, але не настільки, щоб, якщо нота справді була на октаву нижче, але енергія у всіх парних гармонік була сильною, порівняно з непарною гармоніки, це все ще залишить можливість обрання другого піку.α