eventuali regole pratiche come liscia spettro FFT di evitare artefatti quando la mano-tweaking?

StackOverflow https://stackoverflow.com/questions/3827346

  •  26-09-2019
  •  | 
  •  

Domanda

Ho uno spettro FFT grandezza e voglio creare un filtro da essa che passa selettivamente sorgenti di rumore periodici (ad esempio sinusoidale Spurs) e zero di fuori i bidoni di frequenza associate al rumore di fondo casuale. Capisco taglienti transizioni nel dominio freq creeranno manufatti di chiamata una volta che questo filtro è IFFT indietro al dominio del tempo ... e così mi chiedo se ci sono delle regole pratiche come per lisciare le transizioni in un tale filtro per evitare tale squillare.

Per esempio, se la FFT ha bin di frequenza 1M, e ci sono cinque speroni che spuntano dalla terra rumore di fondo, mi piacerebbe a zero tutti i contenitori tranne il bidone di picco associata a ciascuno dei cinque speroni. La domanda è: come gestire i vicini cassonetti cilindrici per evitare artefatti nel dominio del tempo. Ad esempio, qualora il bidone su ciascun lato di un bidone sperone essere impostato al 50% dell'ampiezza? Qualora due cassonetti su entrambi i lati di un bidone sperone essere utilizzato (quello più vicino al 50%, e il prossimo più vicino al 25%, etc.)? Ogni pensiero molto apprezzato. Grazie!

È stato utile?

Soluzione

Mi piace il seguente metodo:

  • Crea lo spettro ideale grandezza (ricordando di renderlo simmetrico rispetto DC)
  • Inversa trasformare nel dominio del tempo
  • Ruota il blocco della metà la dimensione del blocco
  • Applicare una finestra Hann

Lo trovo crea ragionevolmente liscia risultati nel dominio della frequenza, anche se non ho mai provato su qualcosa di tagliente come si sta suggerendo. Probabilmente si può fare un filtro più nitide utilizzando una finestra Kaiser-Bessel, ma è necessario scegliere i parametri in modo appropriato. Con più nitida, sto cercando di indovinare forse è possibile ridurre i lobi di 6 dB o giù di lì.

Ecco un po 'di codice Matlab / Octave campione. Per testare i risultati, ho freqz(h, 1, length(h)*10); utilizzato.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top