Я довольно долго работал над 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?Похоже, что нужно сделать больше, чем просто изменить битовую глубину, чтобы сделать эту работу.
Спасибо