Чи можу я використовувати FFT для розпізнавання музичних нот на фортепіано?


13

Я хочу створити інструмент, який розпізнає кілька музичних нот (я знаю, що це переосмислення колеса). Тому я б грав на середньому C, D і E на фортепіано, і він повинен мати можливість класифікувати ці ноти. Ось як я думаю, що я повинен підійти до цього:

  1. Запишіть зразок мене, що грає ноту
  2. Перетворіть сигнал у частотну область, використовуючи швидке перетворення фур'є
  3. Знайдіть частоту, яка найбільш присутня (в основному аргмакс даних частотної області)
  4. Припустимо, що частота походить від відтвореної ноти і використовуйте її для класифікації ноти

Я ще нічого цього не пробував, тому що не хочу починати неправильний шлях. Тож теоретично це буде працювати?


Було б добре, якби ви могли бути більш конкретними у назві. Я намагався включити трохи про розпізнавання піаніно, але моя (не рідна) англійська мова, мабуть, сьогодні мені не підходить.
труба

1
@pipe ok Я змінив її
michaelsnowden

1
Ваш "зразок" відтворення ноти має бути вже амплітудою та часом хвилі. По суті, пункт 2 є зайвим. Для відносно простої реалізації ваші вищезазначені кроки повинні бути просто чудовими.
користувач2943160

@ user2943160 Я додав це до явного. Звук може бути збережений у багатьох форматах, і зазвичай потрібно деяке маніпулювання, щоб воно з часом отримало приємну амплітуду.
michaelsnowden

y(t)=Asin(ωt)Ay(t)

Відповіді:


23

Концепція хороша, але ви знайдете це не так просто на практиці.

Схил - це не просто переважаючий тон, тому існує проблема №1.

Сенсові частоти FFT не можуть одночасно вражати всі (або навіть декілька) тонів музичної шкали.

Я б запропонував пограти з аудіопрограмою (наприклад, Audacity), яка включає аналізатор FFT і генератор тонів, щоб зрозуміти, що він може (а що не може) зробити перед тим, як спробувати реалізувати певну задачу за допомогою FFT.

Якщо вам потрібно виявити лише декілька конкретних тонів, можливо, алгоритм Ґерцеля буде легшим та швидшим.

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


Якщо ми почнемо з припущення, що зразки є певним інструментом, проблема може бути дещо простішою, чи не так?
mkeith

Це виглядає дійсно добре. Одне наступне запитання: чи може алгоритм Ґерцеля виявити дві ноти, які відтворюються одночасно?
michaelsnowden

Його можна використовувати для виявлення одночасних тонів. Чи достатньо цього для виявлення одночасних нот - це інше питання, і над цим я все ще працюю. У мене є гітарний детектор на основі Ґерцеля, який я мавпував з вимкненим і ввімкненим роками.
JRE

2
@mkeith: Сортування. Ви можете перевірити ноти і побачити, чи виявлення переважного тону є адекватним певному інструменту (а може бути, і лише нотам, що цікавлять). Наскільки я знаю, однак немає загального рішення для виявлення всіх нот з усіх інструментів.
JRE

3

Я б сказав, що краще використовувати мультимодальне вікно спостереження. Щось уздовж лінії вейвлет-розкладу аудіосигналу, що дозволить вам ідентифікувати декілька обертонів всередині ноти. Так, насправді вейвлет, я б сказав, це шлях.

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

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

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

якщо ви хочете дізнатися, як працюють вейвлети, це чудова довідка, яку HP випустила про це :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf та Вступ до вейвлетів

для реалізації, MATLAB має інструмент для вейвлетів, і я впевнений, що існує безліч інших пакетів, доступних для платформ, таких як R тощо.


1

Я думаю, ви думаєте про ноти, відтворені в середині діапазону фортепіано (скажімо, між 200 і 500 Гц), але навіть у цьому діапазоні одна нота матиме багато обертонів, які не є точними кратними основної частоти, а також значна кількість широкосмугового шуму на початку кожної ноти, а можливо, і в кінці.

Для гучних нот у нижньому кінці діапазону нот ви побачите, що дуже мало звукової енергії (менше 1%) насправді знаходиться в основній тонові ноти.

Інша проблема полягає в тому, що наївна інтерпретація FFT передбачає, що сигнал, який ви намагаєтесь виявити, має постійну амплітуду. Це не стосується фортепіанних нот, де амплітуда насправді слідує за декількома накладеними експоненціальними розпадами - початкова частина розпаду має відносно коротку постійну час, але пізніша частина має більш тривалу постійну часову частоту.

Можливо, ви будете краще досліджувати короткочасні методи перетворення Фур'є, наприклад, перетворення Габора або методи, засновані на вейвлетах.

Зауважте, що оскільки основний крок послідовних нот збільшується приблизно на 6% за кожну ноту, вам необов’язково потрібна дуже висока точність визначення ідентифікаційних частот гармонік в аудіо. Правильна ідентифікація музичних нот - це не така сама проблема, як визначення того, чи ноти точно співзвучні з музичною шкалою, де частоти, можливо, потрібно буде виміряти з точністю до 0,1%.


0

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

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

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

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

Якщо ви хочете побудувати пристрій для подібних дій, то це досить складно. Для розрахунків вам знадобиться uC / dsp / fpga / тощо. Більшість популярних пристроїв уже мають FFT-код, тому вам не доведеться кодувати його самостійно (також складно).

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

Математично ідеальна музична нота складається з геометричного ряду «основоположних».

Припустимо, що F0 - основна частота, тоді більшість музичних нот буде наближено до суми F (t) + F0 * (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

A_k - це сила цих високих частот F_k, а F_k - лише кілька кратних F0. Якщо a_k = 0 для всіх k, то маємо чисту синусоїду. Крок цього легко виявити. Просто знайдіть максимум FFT, і ця частота є основою тону = музична нота.

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

Все це порівняно просто.

Деякі проблеми, з якими вам доведеться зіткнутися. Зауважте, що не всі з них "вирішені".

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

  2. Кілька нот - важко визначити групу нот через усі зайві гармоніки. Якщо грати A = 440 Гц і A '= 880 Гц, більшість гармонік будуть перетинатися. Ви можете легко отримати A = 440 Гц, але отримати A '= 880 Гц складніше. Якщо ви думаєте про акорди, швидкі пробіжки тощо, то точно отримати всю інформацію (ноти) може бути дуже важко. Хоча в цілому все можливо математично, самі дані мають помилки та відхилення, а рівняння в деяких випадках є недостатньо визначеними.

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

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