alle Faustregeln, wie FFT-Spektrum zu glätten Artefakte, wenn Hand-Tweaking zu verhindern?

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

  •  26-09-2019
  •  | 
  •  

Frage

Ich habe ein FFT Größenspektrum, und ich mag einen Filter aus, es zu schaffen, dass selektiv periodische Rauschquellen geht (zum Beispiel Sinus-Sporen) und Nullen aus der Frequenzbins mit den Hintergrundgeräuschen verbunden. Ich verstehe scharfe Übergänge im freq Domain wird Ringing-Artefakte erstellen, sobald dieser Filter ist in den Zeitbereich IFFT zurück ... und so frage ich mich, ob es irgendwelche Faustregeln sind wie die Übergänge in ein solcher Filter zu glätten solche zu vermeiden Klingeln.

Zum Beispiel, wenn die FFT-1 M Frequenz-Bins hat, und es gibt fünf Sporen des Hintergrundrauschens herausragten, würde Ich mag alle Fächer außer der Spitze ist mit jedem der fünf Sporen zugeordnet auf Null. Die Frage ist, wie der benachbarten Sporn Bins behandeln Artefakte im Zeitbereich zu verhindern. So soll beispielsweise auf 50% der Amplitude des Behälter auf jeder Seite eines Stirn ist eingestellt werden? Sollte zwei Bins auf jeder Seite einer Stirn ist verwendet werden (die nächstgelegene auf 50%, und die nächste am nächsten bei 25%, etc.)? Irgendwelche Gedanken sehr geschätzt. Dank!

War es hilfreich?

Lösung

Ich mag die folgende Methode:

  • Erstellen Sie die ideale Größe Spektrum (Erinnerung an sie über DC symmetrisch zu machen)
  • Inverse in die Zeitdomäne-Transformation
  • Drehen Sie den Block um die Hälfte der Blockgröße
  • Tragen Sie ein Hann-Fenster

Ich finde es schafft maßen Frequenzbereich Ergebnisse glättet, obwohl ich es nie auf etwas so scharf versucht habe, wie Sie vorschlagen. Sie können sich wahrscheinlich einen schärferen Filter, indem Sie ein Kaiser-Bessel-Fenster, aber Sie müssen in geeigneter Weise die Parameter wählen. Durch schärfere, ich vermute, vielleicht können Sie die Nebenkeulen um 6 dB reduzieren oder so.

Hier ist ein Beispielcode Octave Matlab /. Um die Ergebnisse zu testen, habe ich 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top