Какие-нибудь практические правила, как сгладить спектр БПФ, чтобы предотвратить артефакты при ручной настройке? - PullRequest
2 голосов
/ 30 сентября 2010

У меня есть спектр величин БПФ, и я хочу создать из него фильтр, который избирательно пропускает периодические источники шума (например, синусоидальные колебания) и обнуляет частотные интервалы, связанные со случайным фоновым шумом.Я понимаю, что резкие переходы в домене freq создадут вызывающие артефакты после того, как этот фильтр вернется во временную область ... и поэтому мне интересно, есть ли практические правила, как сгладить переходы в таком фильтре, чтобы избежать такогозвон.

Например, если БПФ имеет частотные интервалы 1 М, и из минимального уровня фонового шума высовывается пять ответвлений, я хотел бы обнулить все приемники, кроме пикового приемника, связанного с каждым из пяти ответвлений.Вопрос в том, как обрабатывать соседние шпоры, чтобы предотвратить появление артефактов во временной области.Например, должен ли бункер на каждой стороне шпоры быть установлен на 50% амплитуды?Следует ли использовать две корзины с каждой стороны отводной корзины (самая близкая - 50%, а следующая ближайшая - 25% и т. Д.)?Любые мысли с благодарностью.Спасибо!

1 Ответ

2 голосов
/ 30 сентября 2010

Мне нравится следующий метод:

  • Создать идеальный спектр величин (не забывая сделать его симметричным относительно постоянного тока)
  • Обратное преобразование во временную область
  • Поворот блока на половину размера блока
  • Применить окно Ханна

Я считаю, что это дает достаточно плавные результаты в частотной области, хотя я никогда не пробовал это на чем-то столь резком, как вы предлагаете. Вероятно, вы можете сделать более четкий фильтр, используя окно Кайзера-Бесселя, но вы должны выбрать параметры соответствующим образом. Более точным, я думаю, вы можете уменьшить боковые лепестки на 6 дБ или около того.

Вот пример кода Matlab / Octave. Для проверки результатов я использовал freqz(h, 1, length(h)*10);.

function [ht, htrot, htwin] = ArbBandPass(N, freqs)
%# N = desired filter length
%# freqs = array of frequencies, normalized by pi, to turn into passbands
%# returns raw, rotated, and rotated+windowed coeffs in time domain

if any(freqs >= 1) || any(freqs <= 0)
    error('0 < passband frequency < 1.0 required to fit within (DC,pi)')
end

hf = zeros(N,1); %# magnitude spectrum from DC to 2*pi is intialized to 0
%# In Matlabs FFT, idx 1 -> DC, idx 2 -> bin 1, idx N/2 -> Fs/2 - 1, idx N/2 + 1 -> Fs/2, idx N -> bin -1
idxs = round(freqs * N/2)+1; %# indeces of passband freqs between DC and pi
hf(idxs) = 1; %# set desired positive frequencies to 1
hf(N - (idxs-2)) = 1; %# make sure 2-sided spectrum is symmetric, guarantees real filter coeffs in time domain
ht = ifft(hf); %# this will have a small imaginary part due to numerical error
if any(abs(imag(ht)) > 2*eps(max(abs(real(ht)))))
    warning('Imaginary part of time domain signal surprisingly large - is the spectrum symmetric?')
end
ht = real(ht); %# discard tiny imag part from numerical error
htrot = [ht((N/2 + 1):end) ; ht(1:(N/2))]; %# circularly rotate time domain block by N/2 points
win = hann(N, 'periodic'); %# might want to use a window with a flatter mainlobe
htwin = htrot .* win;
htwin = htwin .* (N/sum(win)); %# normalize peak amplitude by compensating for width of window lineshape
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...