Тюнер для гитары на Delphi, помогите!

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

можно это реализовать ползунком по дорожке частоты как в этой программе
files1.freesoft.ru/...​/guitar_song_ru_tuner.exe

вобщем задача сводиться на то что бы из микрофона получить частоту, а именно её цифру (величину), остальное реализовать я смогу сам

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Блин, к чему эти рассуждения. Всю жизнь прозанимался БД и про*хался с бухгалтерией а теперь мне тоже нужна прогрпмма на базе частотомера. Ткните меня носом в листинг плс на Делфи остальное я сам допишу. Но мне нужна именно программа частотомер (цифры на экране) которая будет получать сигнал с микрофона (датчика) и выводить силу натяжения струны в кг.
Можно конечно прочитать 1000 раз хелпы, написать 300 тонн кода, время убъеш море ради задачи которая никогда в жизни больше не повторится.

Обычно тюнеры для настройки работают следующим образом: издается калиброванный звук определенной частоты (как камертон). Параллельно, ты брынчишь нотой на гитаре и пытаешься на слух уловить биения. И струну подкручиваешь. как только биения пропадают — соответственно, пропал фазовый сдвиг, соответственно, твоя нота настроена правильно.

Чисто играть гитарой, даже через компаратор — уж больно девиация сигнала будет высокая, не настроишь ты так.

Я вас умоляю, коньки изобретать. Cool Edit vs Studio Plug-ins (он же — Adobe Audition) в помощь. Если конечно охота потрахаться — дельфи в помощь, а спектроанализатора лучше чем CE лучше нету.

ИМХО оптимально считать переходы через «0». Это даст наибольшую точность. Если сигнал «чистый» то проблем быть не должно, если «грязный» то фильтровать надо.

На счет БПФ не уверен, если речь идет о настройке гитары то там вроде надо до 0.1Гц точность.

берешь частоту дискретизации в 8Кгц и делаешь 8000*10 = 80000 отсчетов. При захвате звука каждые 100 мсек fftw вполне нормально будет в реалтайме обрабатывать сигнал. Ну или можно для уменьшения нагрузки делать захват и два спектра 0−800 Гц с отсчетом в 0.1 Гц и от 0−8000 с отсчетом 1 Гц. Далее склеить 0−500 + 500−8000.

Только там проблема в другом не всегда частота с максимальной мощностью это нужная частота, нужно смотреть по гармоникам. en.wikipedia.org/...key_frequencies

Реальная гармоника (низкочастотная) может составлять треть сигнала от максимальной частоты.

Во первых что-бы получить «в-лоб» разрешение 0.1Гц нужно наблюдать сигнал в течении > = 10c. Независимо от частоты дискретизации (ну вообще-то для «увеличения» разрешающей способности можно добавить в выборку «0», но это отдельная история).
Во вторых на счет на счет обработки сигнала на разных частотах дискретизации. Вы либо просто крайне небрежно выразились, либо сказали ересь. Т.е. сама мысль об первоначальной обработке на высокой Fd на небольшом интервале для грубой оценки с последующей обработкой на низкой Fd да бОльшем интервале для уточнения результатов правильная, но насчет «склейки спектров» — чушь. Но опять-же минимального времени наблюдения для получения необходимой разрешающей способности никто не отменял.

>> ну вообще-то для «увеличения» разрешающей способности можно добавить в выборку «0», но это отдельная история

Ну так это и не проблема — добить выборку нулями.

Добить не проблема. Достоверную оценку получить проблема.

а в чем причина? Вам же нужно получить не абсолютную мощность, а относительную. Если все захваты по 0.1 сек то относительная мощность будет та же самая.

А общем если автору нужно, могу дать консольную программу (исходники) на С++ с использованием fftw.

Потому что добавление нулей это, по сути интерполяция. А результаты интерполяции напрямую зависят от точности исходных данных на которые влияют шумы дискретизации, шумы в усилителях, наложение спекторов от ВЧ составляющих сигнала, погрешности округления итд. В общем раза в 4 разрешение повысить можно, в 10 возможно можно в 100 раз однозначно нет. А при времени наблюдения 0.1с разрешение нужно увеличить именно в 100 раз.

Зависит от частоты. Например для 27 Гц (от этой частоты начинаются обертоны) нужно 0.1 Гц, в вот уже на 500 Гц и выше там уже и 1 Гц нормально, а выше и 2−3 Гц особой разницы не сделают.

Просто слух человека дифференциальный по частоте.

А при отсчёте в 0.1 сек можно получить полное колебание в 27Гц. Так что интерполяция в 100 раз вполне возможна этих частотах.

Не могу сказать, что слышит человек (сам музыкальным слухом не наделен). Но в таблицах частоты нот задаются с точностью до 4-го знака.

На сечет определения частоты сигнала ~27Гц с точностью до 0.3% за время наблюдения 0.1сек с помощью БПФ. Могу сказать одно — попробуйте.

Зачем пробовать, я так делал. Так все гитарные тюнеры работают, как софтовые так и хардварные — отклик 0.1 сек, точность 0.1 Гц.

Используя оригинальную технологию определения высоты тона, программа точно определяет ноты с задержкой, не превышающей 50 миллисекунд.

www.muzbazar.ru/...s/71/index.html

Речь идет не о принципиальной невозможности, а именно о БПФ.
Измерить то как раз не сложно. Пропускаешь сигнал через полосовой фильтр (БИХ 2-го порядка вполне достаточно) чтоб отсечь гармоники/шумы и считаешь переходы через 0. Частоту получаешь по формуле f = ((N/n) *fd) /2. (N-кол-во отсчетов, n — число переходов через 0). При частоте дискретизации 44кГц и времени измерения ~0.1с получаем погрешность ~0.023%. Это конечно в теории, в реальности похуже будет.
Кстати программа по ссылке дает погрешность 0.14% на частоте 440Гц на практически идеальном sin сигнале, Что для софтового частотомера весьма неплохо, но сомневаюсь что там FFT используется.

ЗЫ Забыл пароль. Искренне Ваш Вася Петечкин.:)

Как реализовать полосовой фильтр без БПФ программно?

В любом случае БПФ для решения этой конкретной задачи предпочтительнее, так как все равно нужно будет сделать фильтр для 88 диапазонов ну библиотека fftw уже оптимизирована для использования мультимедийных команд процессора. Тоесть особый выигрыш в скорости не получим, скорее всего получим даже проигрыш и усложнение программы.

Кроме того для БПФ есть готовые библиотеки использующие CUDA (тоесть задача упрощается до вызова одной функции), а для фильтров необходимо будет самому считать коэффициенты.

В общем не всегда идеальное математическое решение задачи эффективно в реальном проекте.

Да, еще, никто не настраивает инструменты в лабораториях до тысячных герца, а настраивают на слух. Так что здесь можно учитывать особенности человеческого слуха.

Коментар порушує правила спільноти і видалений модераторами.

Захват звука на Delphi

www.delphisources.ru/..._win32_api.html

Алгоритм
1.хватаешь одним каналом,
2.достраиваешь отсчеты (нулями) ну нужного интервала частоты дискретизации (кратно 4 вроде).
3. Переводишь полученные комплексные значения в спектр (там идет сложение векторов, мнимого и реального) корень из квадратов мнимого и реального значений.

4. Рисуешь график, по оси х отсчеты частоты, по оси у мощность определенной частоты.

Imho, проще купить тюнер. Например, www.youtube.com/watch v=WGh4n_T4bDo. В Киеве стоит около 170 грн.
Ну или, как сказали, FFT en.wikipedia.org/...rier_transform

Для Linux есть gtkguitune, можно глянуть исходники.

Підписатись на коментарі