Любые правила большого пальца Как сгладить Spectrum FFT для предотвращения артефактов при настройке рук?
Вопрос
У меня есть Spectrum FFT величины, и я хочу создать фильтр от него, что избирательно проходит периодические источники шума (например, Sounewave Spurs) и нулевые вещества, связанные с случайным фоновым шумом. Я понимаю, что острые переходы в домене Freq создадут артефакты звонков, как только этот фильтр должен вернуться к временной домене ... и поэтому мне интересно, есть ли какие-либо правила, чтобы сгладить переходы в таком фильтре, чтобы избежать таких Звон.
Например, если у FFT имеет 1-е частоты частоты, и есть пять шпоров, выкачивая из фонового уровня шума, я хотел бы нулю всех мусорных веществ, кроме пикового мусора, связанного с каждым из пяти из пяти шпоров. Вопрос в том, как обрабатывать соседние бункеры SPUR для предотвращения артефактов в момент времени. Например, если корзина на каждой стороне бункера SPUR устанавливается до 50% амплитуды? Должны ли использовать два мусора с обеих сторон мусорной корзины (ближайший на 50%, а следующий ближайший на 25% и т. Д.)? Любые мысли очень ценят. Спасибо!
Решение
Мне нравится следующий метод:
- Создайте идеальный спектр величины (запоминание, чтобы сделать его симметричным относительно постоянного тока)
- Обратное преобразование в момент времени
- Поверните блок на половину блокировки
- Примените окно Hann
Я обнаруживаю, что это создает разумно гладкие результаты домена частоты, хотя я никогда не пробовал его на что-то, как вы предлагаете. Возможно, вы можете сделать более острый фильтр, используя окно Kaiser-Bessel, но вы должны выбрать параметры соответствующим образом. Острельным, я предполагаю, что возможно, вы можете уменьшить боковые боковые на 6 дБ или около того.
Вот какой-то выборка MatLab / Octave Code. Чтобы проверить результаты, я использовал 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