Несоответствия ввода аудио Java - PullRequest
3 голосов
/ 10 февраля 2012

Я довольно долго работал над Java-приложением для гитарного тюнера, и, наконец, мне удалось получить определение основного тона (основной частоты), чтобы точно определить основную частоту входного сигнала, используя FFT и Harmonic Product Spectrum.Это прекрасно работает, когда я использую микрофон по умолчанию в моем MacBook Pro, несмотря на то, что сигнал немного шумный, но в идеале я хотел бы использовать свой внешний звуковой звуковой интерфейс USB (Lexicon Lambda) с подключенной электрической гитарой. У меня естьпопробовал это с точно таким же кодом, который отлично работает для входа микрофона, но обнаруженная высота тона отличается.Вот мои результаты определения основных параметров для каждой струны (гитара уже настроена).

Частота дискретизации = 8000Взятых образцов = 16000Разрешение по частоте = 0,5 Гц

E - Микрофон: 82,5 Гц - Лексикон Лямбда: 124,5 ГцA - Микрофон: 110,0 Гц - Лексикон Лямбда: 165,5 ГцD - Микрофон: 147,0 Гц - Лексикон Лямбда: 221,5 ГцG - Микрофон: 196,0 Гц - Лексикон Лямбда: 293,5 ГцB - Микрофон: 247,0 Гц - Лексикон Лямбда: 371,0 ГцE - Mic: 329,5 Гц - Lexicon Lambda: 495,0 Гц

Я немного запутался с этими числами, и кажется, что результат, полученный с использованием Lexicon Lambda, обычно примерно в 1,5 раза больше точного результата.Но вместо того, чтобы просто добавить это дополнительное вычисление, чтобы получить правильное число, я хотел бы сделать так, чтобы оба метода получения аудиоданных возвращали точные результаты.

Кто-нибудь знает, какова причина этой несоответствиябыть?

Редактировать

Так что я почти уверен, что проблема в том, что лямбда использует битовую глубину 24, в то время как моя программа (и микрофонный вход)работает с битовой глубиной 16. Вместо того, чтобы просто изменять его для работы с 24-битными данными, кто-нибудь знает способ определения доступной битовой глубины текущего аудиоустройства?

Использование лямбдыявляется приоритетом, так как сигнал менее шумный;Тем не менее, я только что пытался заставить вещи работать с заданной битовой глубиной 24, и я получаю IllegalArgumentException "Нет соответствия строк интерфейсаподдерживается."Я также попытался использовать 44,1 кГц, и у меня возникла та же ошибка, которая говорит о том, что Lambda на самом деле не работает с 24-битным звуком или, возможно, есть другая проблема.У кого-нибудь есть опыт работы с 24-битным звуком в Java Sound?Похоже, что нужно сделать больше, чем просто изменить битовую глубину, чтобы сделать эту работу.

Спасибо

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Значения микрофона составляют 66% от лексикона лямбда, например, E - Mic: 329,5 Гц, деленная на лексикон Лямбда: 495,0 Гц = около 0,66. Интересно, значимо ли это?

Одинаковы ли частота дискретизации от микрофона и скорость от Lexicon Lambda?

Является ли глубина в битах одинаковой? Интересно, отличаются ли они, например один 16 бит, а другой 24 бит? Это может объяснить значение 66% в расчетах, как ...

2 голосов
/ 10 февраля 2012

1-я идея


Образец битрейта может быть ключевым !!Профессиональный аудиоинтерфейс по умолчанию будет использовать 24 бита, 16 бит - это стандарт 80-х годов, который до сих пор широко используется в бытовой электронике.

Если ваш FFT ожидает 16-битные значения, а вы передаете 24-битные, ваш звук будет "растянут".(Вообразите синусоидальную волну, чтобы прояснить ее)

Это прекрасно объясняет сдвиг частоты !!Поэтому вам следует либо преобразовать 24 бита в 16, либо переписать БПФ.

2-я идея


Я узнал на веб-сайте Lexikon, что интерфейс просто поддерживает44,1 кГц и 48 кГц.Так что я думаю, что лямбда по умолчанию установлена ​​на 48 кГц.Если вы запрашиваете частоту дискретизации 8 кГц, интерфейс не может справиться с этим и остается на 48 кГц, я полагаю.

Так что просто попробуйте общую частоту дискретизации на обоих устройствах и сравните снова.

0 голосов
/ 12 февраля 2012

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

У меня есть приложение для настройки тюнера на Android, и я перепутал оптимизацию с фиксированной точкой в ​​FFT, но результаты были ужасными. С другой стороны, приложение прекрасно работает, даже если вы находитесь далеко от телефона и на дрянном оборудовании микрофона, поэтому я думаю, что вам не нужны все 24 бита от вашего Lexicon, просто убедитесь, что вы используете столько разрешения, сколько возможно (дважды, предпочтительно) для умножения и сложения БПФ.

...