Идея заключается в том чтобы проверить на сходство одну аудио дорожку с другой. Обе записаны с помощью микрофона. Для этого с помощью С# и библиотеки NAudio я снял значения с микрофона. Получил WAV файл. Далее загнал значения в массив байтов (byte a []). И получил 1,2 миллиона значений для дорожки длиной 9с. Пытался сравнивать их в "тупую" миллион значений с милионом и получал откровенный бред. На руках имею книгу в которой описаны музыкальные ноты в ггц, пример Ля 1 актавы (A1) = 440 ГГц. Теперь вопрос сколько значений отвечают за эту ноту ля (частота дискретизации у меня = 44100 и 2 канала). Как мне понять что в этот момент времени амплитуда 440, а в другую секунду предположим 330. Из этого массива. Мне советовали использовать БПФ ОПФ (быстрое преобразование фурье или оконное преобразование фурье) но откровенно говоря я не до конца понимаю как они работают м что могут мне дать. Прошу о помощи, кому не жалко своего времени - объясните.
В wav сигнал пишется во временной области, т.е. как он снимается с микрофона и преобразуется в цифру в таком виде и попадает в wav (ну это упрощенный вариант). Во временной области частот нет. Частоты это синусоиды. Временная область представляет собой сумму всех синусоид составляющих сигнал.
Чтобы перейти к частотам (герцам) вам нужно выполнить дискретное преобразование Фурье (в матлабе - fft() ).
На выходе fft вы получите массив частот. В первой половине массива будет то что вам нужно, берете элемент с индексом 440 (частота 440 Гц) значение этого элемента будет амплитуда частоты 440 Гц.
А во второй половине тогда что будет? И как мне понять что допустим в эту секунду была сыграна Ля, а через 3 секунды была сыграла Ми при этом продлилась она 5с. И тд?
И еще. В результате ДПФ будут комплексные числа. Чтобы посчитать амплитуду нужно найти модуль комплексного числа: sqrt(Re(x)^2 + Im(x)^2)
Во второй половине массива содержится сопряжение первой половины (это свойство ДПФ). Обычно вторую половину отбрасывают, т.к. ее можно получить из первой (если понадобится сделать обратный ДПФ).
И последний вопрос, в том массиве который я имею на данный момент числа больше чем 255 по сути нет. От 0 до 255 все. В этом массиве находятся не герцы?
Zvercheg, Видимо каждый элемент массива занимает 1 байт. Для беззнакового значения длиной 1 байт 255 - максимально возможное значение. Это значит, что у вас 8 битное АЦП.
Вообще это мало практически для всего. Для нормального звука и егообработки нужно хотя бы 2 байта, т.е. АЦП на 16 бит.
Если вы писали звук просто со звуковой карты компа, то я думаю, это можно отрегулировать настройками вашей библиотеки NAudio.
Если массив получен чтением из wav, то нет в нем находятся амплитуды сигнала с микрофона.
Герцы появятся только после ДПФ.
И еще нюанс.
У вас частота дискретизации 44100, если делать ДПФ на массиве размерностью меньше частоты дискретизации, то интерпретация результат немного меняется. Получается что в элементе массива результата ДПФ будет не 1 Гц, а 44100/len Гц (где len - длина массива на котором делался ДПФ).
Ну и соответственно индекс для 440 Гц будет другим.
Поэтому, возможно, проще делать ДПФ кусками по 1 сек.