Я беру блоки входящих данных и пропускаю их через fftw, чтобы получить спектральную информацию. Кажется, все работает, но я думаю, что у меня возникают некоторые проблемы с наложением.
Я пытался понять, как реализовать окно Hann для моих блоков данных. Google подвел меня для примеров. Любые идеи или ссылки, на которые я должен смотреть?
double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]
Обновление
Спасибо Оли за то, что он указал на проблему, которую я на самом деле пытаюсь решить, это спектральную утечку, а не наложение ...
http://en.wikipedia.org/wiki/Hann_function . Реализация следует из определения довольно просто. Просто используйте функцию w (n)
в качестве множителя, прокрутите все ваши семплы (изменяя n
по ходу), и все.
for (int i = 0; i < 2048; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/2047));
dataOut[i] = multiplier * dataIn[i];
}
Не ответ на ваш вопрос, а отступление от вашей проблемы. Использование окон помогает решить проблемы спектральной утечки , а не проблемы алиасинга .
Эффекты спектральной утечки возникают, когда частотные компоненты вашей формы волны не являются точными целыми частями вашей частоты дискретизации.
Если у вас есть алиасинг, вы в корне облажались. Вам нужно либо увеличить частоту дискретизации, либо установить (лучший) фильтр сглаживания перед сэмплированием.
Википедия - ваш друг: Окно Хеннинга
Неужто ваш поиск в Google придумал википедию ?! В любом случае просто создайте функцию, которая возвращает массив длины N с коэффициентами Хеннинга, и умножьте этот массив на ваш dataIn [2048]
.