Виявлення людських пітчів у реальному часі


11

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

Я натрапив на багато тем, які задають одне і те ж питання, але я все ще зовсім не закінчую це, мабуть, через мій брак досвіду в цій галузі та дрібну математику. Я реалізував алгоритм, заснований на статті зміни зрушення кроку на веб-сайті DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

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

Спасибі заздалегідь,

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

EDIT2: Спасибі всім, я щойно закінчив версію алгоритму, який працює як шарм. Проблема оцінювання з низьким тоном була пов'язана з моїм вхідним тестом. Коли я заспівав ноту, вона відповідала правильно. Також я зараз розглядаю всі гармоніки, а не лише найвищий пік.


У Вікіпедії є деяка інформація.
Емре

Відповіді:


9

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

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

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

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


Ви маєте рацію, я забув згадати, що мене цікавить лише крок класу. Я використовую цей веб-сайт, щоб перевірити свій інструмент: seventhstring.com/tuningfork/tuningfork.html . Для входу A (220 Гц) він повертає E (660 Гц) як знайдений крок класу. Я поглянув на спрект і 220 ГГц насправді є, але з меншою величиною, ніж 660 Гц. Після відфільтрування значень нижче мінімальної величини та частоти закриття в бажаному діапазоні, отримана з цього моменту спрітум має 4 піки. [пік, маг] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Феліпе Ліра

Я просто задумав, що, можливо, я повинен враховувати зміщення фази під час обчислення величини, як я роблю, щоб отримати справжню частоту. Чи має це сенс? Що я маю на увазі, що якщо у мене зсув фази приблизно 90º за відро, "пік" був би на 0 величині, чи не так?
Феліпе Ліра

@elipedrl: Отже, ви по суті пишете гітарний тюнер. :) Як я розумію, вони фільтрують низькі частоти, щоб очистити форму хвилі, а потім рахують піки, щоб отримати висоту. electronicdesign.com/article/articles / ... aboutmicrocontroller.blogspot.com/2008/04 / ... Є ефективніші способи, хоча, якщо ви збираєтеся на точність , а не дешевизна gist.github.com/255291
ендоліти

@elipedrl: Зсув фази для бункера має бути неактуальним для тону. Кожен контейнер - це складне число, і вас цікавить абсолютне значення чи величина цього числа. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith

1
і якщо у вас з якоїсь причини є дві коротші FFT (затримка, кванти часу тощо), обчислення фазового вокодера - це менше обчислень, ніж проведення ще однієї більш тривалої FFT та інтерполяції цього.
hotpaw2

6

Так, використання пікової оцінки частоти для тону невірно. Пітч - це психоакустичні явища, тому виявлення або оцінка висоти тону відрізняється від частотної оцінки. У попередніх відповідях на подібні запитання тут було багато методів оцінки тону. На вибір є більше 1.

Ось один: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 , та інший: Поради щодо покращення виявлення кроку

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


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

@elipedrl: FFT повинна працювати тоді. Отримати декілька вершин, а потім розумно вибрати одну з них, має бути досить хорошим. Пам'ятайте, що дійсні піки будуть близькими (але не зовсім) цілими кратними основними, тоді як помилкові вершини не будуть. Вам слід уникати вибору хибних вершин і уникати вибору третьої гармоніки тощо, які не є октавою від ноти, яку ви шукаєте.
ендоліт

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

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