Реализация окна Ханна

Я беру блоки входящих данных и пропускаю их через fftw, чтобы получить спектральную информацию. Кажется, все работает, но я думаю, что у меня возникают некоторые проблемы с наложением.

Я пытался понять, как реализовать окно Hann для моих блоков данных. Google подвел меня для примеров. Любые идеи или ссылки, на которые я должен смотреть?

double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]

Обновление

Спасибо Оли за то, что он указал на проблему, которую я на самом деле пытаюсь решить, это спектральную утечку, а не наложение ...

7
задан devsnd 20 June 2012 в 23:04
поделиться

3 ответа

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];
}
18
ответ дан 6 December 2019 в 06:02
поделиться

Не ответ на ваш вопрос, а отступление от вашей проблемы. Использование окон помогает решить проблемы спектральной утечки , а не проблемы алиасинга .

Эффекты спектральной утечки возникают, когда частотные компоненты вашей формы волны не являются точными целыми частями вашей частоты дискретизации.

Если у вас есть алиасинг, вы в корне облажались. Вам нужно либо увеличить частоту дискретизации, либо установить (лучший) фильтр сглаживания перед сэмплированием.

3
ответ дан 6 December 2019 в 06:02
поделиться

Википедия - ваш друг: Окно Хеннинга

Неужто ваш поиск в Google придумал википедию ?! В любом случае просто создайте функцию, которая возвращает массив длины N с коэффициентами Хеннинга, и умножьте этот массив на ваш dataIn [2048] .

2
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: