Как я могу получить выходные частоты DFT/FFT в герцах?

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

Затем я написал код для ДПФ - он дает мне результат в виде комплексного числа, где одна из осей (действительная/мнимая) представляет собой амплитуду/величину, а другая - фазу.

Теперь вопрос, на который я хочу получить ответ в частоте (в герцах, а не в векторе), чтобы я мог проверить, дает ли мой ДПФ правильный результат или нет. Как я могу преобразовать свой вывод DFT в частоту?

Я должен закодировать это на языке C, и я не хочу использовать встроенную библиотеку.


person mossad    schedule 30.06.2013    source источник
comment
Когда вы говорите, что действительная ось — это амплитуда, а воображаемая — фаза, вы сами это вычисляете? Или просто вытащить это прямо из ДПФ? Когда вы получаете сложный результат из ДПФ, амплитуда является абсолютным значением этого результата, а фаза — это угол (также известный как аргумент) результата.   -  person Drew McGowen    schedule 30.06.2013
comment
Да, я сам вычисляю ДПФ, значит, я получил формулу сигмы от k=0 -> N-1, для всех f(x)* WN, здесь WN=e^(- i 2 PI/N) вот так... Я просто конвертирую эту формулу в свою программу на C.   -  person mossad    schedule 01.07.2013
comment
Частота бина при пиковой величине БПФ очень часто не соответствует высоте ноты в музыкальном аудио.   -  person hotpaw2    schedule 01.07.2013
comment
@ hotpaw2, я научился этому на собственном горьком опыте. Каков же правильный подход к поиску доминирующей высоты звука в аудиоклипе?   -  person yati sagade    schedule 19.01.2014


Ответы (1)


Вам нужно найти пиковую величину, а затем вычислить соответствующую частоту:

  • вычислить величину каждого выходного бина ДПФ: magnitude = sqrt(re*re+im*im)
  • найдите бин с наибольшей величиной, назовите его индекс i_max.
  • вычислить эквивалентную частоту этого бина: freq = i_max * Fs / N, здесь Fs = частота дискретизации (Гц) и N = количество точек в БПФ.

См. этот ответ для более подробного объяснения того, как индексы бина и частота связаны.

person Paul R    schedule 30.06.2013
comment
Извините, Пол Р, но я этого не понял. Я также рассчитал величину по результату ДПФ. Теперь вопрос в том, что мне нужно найти i_max для каждого окна (1024 выборки)? И согласно тому, что я читал о ДПФ, я просто нахожу ту величину на выборке 512, которая равна N/2, где я получаю максимум. м я правильно.значит я хочу asj dat ..И еще большое спасибо..:) - person mossad; 01.07.2013