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


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.