Искажение амплитуд спектральных составляющих после применения оконной функции

Евгений
Сообщения: 4
Зарегистрирован: 20 окт 2016, 15:04

Искажение амплитуд спектральных составляющих после применения оконной функции

Сообщение Евгений »

Привет!
После того, как домножаю исходный сигнал на окно искажаются амплитуды спектральных составляющих после БПФ.
Есть ли возможность скорректировать влияние окна?


Евгений
Сообщения: 4
Зарегистрирован: 20 окт 2016, 15:04

Re: Искажение амплитуд спектральных составляющих после применения оконной функции

Сообщение Евгений »

Написал скрипт для демонстрации:

Код: Выделить всё

FFTSIZE = 1024;

fs = 16384;
fsine = 512;
n = 0:1:FFTSIZE;
A = 120;
phase = 0;

xx = A * cos(n * 2 * pi * fsine / fs + phase); 

mm = fftshift(fft(xx));
mag = abs(mm) ./ FFTSIZE;
mag = mag .* 2;

close all;
figure; stem(mag); title('Без окна');

xx = (hamming(length(xx)).') .* xx;
mm = fftshift(fft(xx));
mag = abs(mm) ./ FFTSIZE;
mag = mag .* 2;

figure; stem(mag); title('С окном');
Без окна амплитуда получается правильная (120 едениц).
С окном - ~2 раза меньше (но вблизи пиков на 512 Гц почти отсутствуют боковые лепестки).
Вложения
without window.png
without window.png (2.87 КБ) 4430 просмотров
hamming window.png
hamming window.png (2.94 КБ) 4430 просмотров

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Искажение амплитуд спектральных составляющих после применения оконной функции

Сообщение Бахурин Сергей »

Это происходит потому что сумма отсчетов окна неравна меньше FFTSIZE. Необходима нормировка

Евгений
Сообщения: 4
Зарегистрирован: 20 окт 2016, 15:04

Re: Искажение амплитуд спектральных составляющих после применения оконной функции

Сообщение Евгений »

Ага! Всё просто оказалось. Сделал такую нормировку и амплитуды получились одинаковые:

Код: Выделить всё

wnd = hamming(length(xx)).';
k = length(xx) / sum(wnd);
...
mag = mag .* k;

Ответить