Cualquier regla de oro para suavizar la forma de espectro FFT para evitar artefactos cuando la mano-pellizcar?

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

  •  26-09-2019
  •  | 
  •  

Pregunta

Tengo un espectro de magnitud FFT y quiero crear un filtro de ella que pasa selectivamente las fuentes de ruido periódicas (por ejemplo sinusoidal Spurs) y cero fuera de los contenedores de frecuencia asociadas con el ruido de fondo aleatorio. Entiendo transiciones bruscas en el dominio frec crearán artefactos de llamada una vez este filtro está de vuelta IFFT al dominio del tiempo ... y así me pregunto si hay reglas de oro el modo de suavizar las transiciones en un filtro tal de evitar tales El sonar.

Por ejemplo, si la FFT tiene intervalos de frecuencia 1M, y hay cinco espuelas que sobresalía del suelo de ruido de fondo, me gustaría poner a cero todos los bins, excepto la bandeja pico asociado con cada uno de los cinco espolones. La cuestión es cómo manejar los contenedores cilíndricos vecinos para evitar artefactos en el dominio del tiempo. Por ejemplo, si el el bin a cada lado de un cubo de espolón se establece en 50% de amplitud? Si dos contenedores a ambos lados de un cubo de espolón ser utilizado (el más cercano al 50%, y el siguiente más cercano al 25%, etc.)? Cualquier pensamiento apreciado considerablemente. Gracias!

¿Fue útil?

Solución

I como el método siguiente:

  • Crea el espectro ideales magnitud (recordar para que sea simétrica con respecto a DC)
  • transformada inversa al dominio del tiempo
  • Rotar el bloque por medio la blocksize
  • Aplicar una ventana Hann

Me parece que crea razonablemente suave resultados dominio de la frecuencia, aunque nunca he probado en algo tan agudo como usted sugiere. Es probable que pueda realizar un filtro más nítida mediante el uso de una ventana de Kaiser-Bessel, pero hay que elegir los parámetros de forma apropiada. Por más nítida, supongo que tal vez puede reducir los lóbulos laterales en 6 dB o menos.

Aquí hay un código Matlab / Octave muestra. Para comprobar los resultados, me freqz(h, 1, length(h)*10); usado.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top