Поради щодо поліпшення виявлення кроку


21

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

Отже, мені вдалося отримати основну частоту за допомогою алгоритму FFT, і в цей момент додаток якимось чином функціональний. Однак є місце для вдосконалення, зараз я надсилаю необроблений pcm алгоритму FFT, але я думав, що, можливо, є кілька алгоритмів / фільтрів до / пост, які можуть покращити виявлення. Можете запропонувати будь-які?

Моя основна проблема полягає в тому, що коли він виявляє певну частоту, він показує, що частота на 1-2 сек, а потім переходить на інші випадкові частоти і повертається знову і так далі, навіть якщо звук є безперервним.

Мене також цікавить будь-який інший тип оптимізації, якщо хтось має досвід таких речей.

Відповіді:


20

Я здогадуюсь, що інші частоти, які він отримує, є основоположними гармоніками? Наче ви граєте 100 Гц, і він замість цього вибирає 200 Гц або 300 Гц? По-перше, вам слід обмежити пошуковий простір частотами, якими може бути гітара. Знайдіть найвищий фундаментальний ви, ймовірно, вам знадобиться, і обмежтесь цим.

Автокореляція буде працювати краще, ніж FFT при пошуку основи, якщо основна меншою амплітудою, ніж гармоніки (або взагалі відсутня, але це не проблема з гітарою):

введіть тут опис зображення

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

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

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

Ось мій приклад Python-коду для всього цього .


Це те, що я шукав, дуже гарна відповідь, дякую!
Валентин Раду

2
Помноження на вікову функцію, яка конута, фактично намаже будь-які спектральні лінії у вашому сигналі, тим самим зробивши їх ширшими. Однак це може вам придбати динамічний діапазон, який дозволяє визначити, наприклад, спектральну лінію дуже малої потужності за наявності перешкодоподібного тону великої потужності.
Джейсон R

@JasonR, враховуючи той факт, що це розроблено для роботи в умовах, коли ймовірність високих потужностей (ів), що перешкоджають підвищенню потужності, дійсно низька, ви припускаєте, що краще не використовувати вікно Хеммінга?
Валентин Раду

1
Я можу підтвердити, що використання вікна Хеммінга наблизило мене до своєї мети збереження показань. Зараз, коли я граю на А4, більшість часу я отримую 440 Гц, і лише дуже рідко я отримую ретельне читання, як 650 Гц або близько того. Я здогадуюсь, що це гармоніки? Крім того, я не міг не помітити, що для більшої частоти додаток працює бездоганно, а для нижчих він починає виходити з ладу. Можливо, тому, що я використовую FTT для виявлення пікових частот величини частоти і для нижчих частот, які не завжди є основними?
Валентин Раду

1
@mindnoise: 660 Гц не є гармонікою 440 Гц, але це гармоніка 220 Гц або досконала п’ята частина вище 440. Можливо, це ще одна струна, що резонує або спотворює чи щось таке? Набагато простіше розібратися в таких питаннях, якщо ви зможете побудувати FFT і подивитися на це. Так, низькі частоти можуть бути відфільтровані та зменшені відносно більш високих, або за механічним впливом, або за вашою аналоговою схемою.
ендоліт

12

Крок не такий, як бік частоти пікової величини FFT. Пітч - це психоакустичні явища людини. Звуковий настрій може мати відсутність або дуже слабкий фундаментальний характер (поширений у деяких голосах, звуках на фортепіано та гітарі) та / або безліч потужних обертонів у своєму спектрі, які переповнюють частоту тону (але все ще чути людину як цю ноту звучання) . Отже, будь-який детектор пікової частоти FFT (навіть з урахуванням деяких вікон та інтерполяції) не буде надійним методом оцінки тону.

Це запитання про stackoverflow включає перелік деяких альтернативних методів оцінки висоти, які можуть дати кращі результати.

ДОБАВЛЕНО: Якщо ви робите це для звуків на гітарі, зауважте, що найнижчі гітарні струни можуть насправді створювати трохи негармонічні обертони, що робить оцінку тону ще складніше, оскільки людське вухо може почути частоту кроку, більш тісно пов’язану з підмножинами обертонів , а не до фактичної основної частоти вібрації струни.

ДОБАВЛЕНО №2: Про це запитують так часто, що я писав довше повідомлення в блозі на тему: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


щойно відвідав (і прокоментував) блог, про який ви тільки що переслали нас.
Роберт Брістоу-Джонсон

5

Я багато років досліджував розпізнавання кроку на поліфонічній музиці - як виявлення нот гітарного соло в межах запису mp3. Я також написав розділ у Вікіпедії, в якому дається короткий опис процесу (дивіться підрозділ "Визначення нахилу" за посиланням нижче).

Коли на піаніно натискається одна клавіша, ми чуємо не просто одну частоту звукової вібрації, а композит з декількох звукових коливань, що виникають на різних математично пов'язаних частотах. Елементи цього композиту вібрацій з різною частотою називаються гармоніками або частками. Наприклад, якщо натиснути клавішу Середнього С на піаніно, окремі частоти гармонік композиту починатимуться від 261,6 Гц як основної частоти, 523 Гц - 2-ї гармонічної, 785 Гц - 3-ї гармонійної, 1046 Гц - бути четвертою гармонією тощо. Пізніші гармоніки - це цілі кратні основні частоти, 261,6 Гц (напр .: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).

Я використовую модифіковану логарифмічну трансформацію DFT, щоб спочатку виявити можливі гармоніки, шукаючи частоти з піковими рівнями (див. Схему нижче). Через те, що я збираю дані для свого зміненого журналу DFT, я НЕ повинен застосовувати функцію вікна до сигналу, а також не додавати та перекриватись . І я створив DFT, щоб його частотні канали були логарифмічно розташовані для того, щоб безпосередньо вирівняти частоти, де гармоніки створюються нотами на гітарі, саксофоні тощо.

Тепер, виходячи на пенсію, я вирішив випустити вихідний код для моєї системи виявлення кроків у безкоштовній демонстраційній програмі під назвою PitchScope Player . Програвач PitchScope доступний в Інтернеті, і ви можете завантажити виконувану програму для Windows, щоб побачити мій алгоритм на роботі на mp3-файл, який ви обрали. Нижченаведене посилання на GitHub.com приведе вас до мого повного вихідного коду, де ви можете переглянути, як я виявляю гармоніки за допомогою спеціального логарифмічного перетворення DFT, а потім шукати частки (гармоніки), частоти яких задовольняють правильному цілочисленному співвідношенню, яке визначає ' крок '.

Мого алгоритму виявлення шахів - це насправді двоступеневий процес: a) Спочатку виявляється масштаб ScalePitch ('ScalePitch' має 12 можливих значень тону: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) і після визначення масштабу ScalePitch обчислюється Октава , вивчаючи всі гармоніки для 4 можливих нот Октави-Кандидата. Алгоритм призначений для виявлення найбільш домінуючого кроку (музичної ноти) в будь-який момент часу в поліфонічному MP3-файлі. Зазвичай це відповідає нотам інструментального соло. Тим, хто цікавиться вихідним кодом C ++ для мого алгоритму виявлення 2-ступінчатого шагу, можливо, потрібно запустити функцію Estimate_ScalePitch () у файлі SPitchCalc.cpp на GitHub.com.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

Нижче зображено логарифмічний DFT (створений моїм програмним забезпеченням C ++) протягом 3 секунд гітарного соло на поліфонічному записі mp3. Він показує, як гармоніки з’являються для окремих нот на гітарі під час гри в соло. Для кожної ноти цього логарифмічного DFT ми бачимо, що його множинні гармоніки проходять вертикально, оскільки кожна гармоніка матиме однакову ширину часу. Після того, як буде визначена Октава ноти, тоді ми знаємо частоту Основи.

введіть тут опис зображення

На наведеній нижче схемі показаний алгоритм виявлення Octave, який я розробив, щоб вибрати правильну примітку Octave-Candidate (тобто правильну основу), як тільки ScalePitch для цієї ноти буде визначений. Бажаючі побачити цей метод у C ++, повинні перейти до функції Calc_Best_Octave_Candidate () всередині файлу під назвою FundCandidCalcer.cpp, який міститься у моєму вихідному коді на GitHub.

введіть тут опис зображення


Джеймсе, чи детектор тону DFT виявляє нотатки з відсутньою (або слабкою) основою?
Роберт Брістоу-Джонсон

Так, мій алгоритм 2-ступінчастого виявлення виявить ноти, навіть якщо сигнал має "відсутність (або слабкий) фундаментальний" - це велика сила цього двоступеневого процесу. Фундаментальність визначається на другому етапі, коли виявлення октави виконується на часових ширинах, які ви бачите для приміток на логарифмічній діаграмі DFT. Оскільки ця функція Pitch Detection працює в змішанні поліфонічного сигналу mp3, вона виявить ноти, яким не вистачає багатьох гармонік, включаючи Fundamental. Я щойно додав до цього відповіді другу схему, яка пояснює мій алгоритм виявлення Octave.
Джеймс Пол Міллард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.