¿Por qué es una mala idea filtrar poniendo a cero los contenedores FFT?


72

Es muy fácil filtrar una señal realizando una FFT en ella, poniendo a cero algunos de los contenedores y luego realizando una IFFT. Por ejemplo:

t = linspace(0, 1, 256, endpoint=False)
x = sin(2 * pi * 3 * t) + cos(2 * pi * 100 * t)
X = fft(x)
X[64:192] = 0
y = ifft(X)

El componente de alta frecuencia se elimina completamente con este filtro FFT "brickwall".

Pero he oído que este no es un buen método para usar.

  • ¿Por qué es generalmente una mala idea?
  • ¿Hay circunstancias en las que es una buena o buena elección?

[ según lo sugerido por pichenettes ]

Respuestas:


74

sin(ωt)/ωt

Estas ondas serán mayores para cualquier contenido espectral que esté "entre contenedores" o periódico no entero en el ancho de apertura FFT. Entonces, si sus datos de entrada FFT originales son una ventana en cualquier dato que es algo no periódico en esa ventana (por ejemplo, la mayoría de las señales del "mundo real" muestreadas de forma no sincronizada), esos artefactos particulares serán producidos por contenedores de cero.

Otra forma de verlo es que cada bin de resultado FFT representa una cierta frecuencia de onda sinusoidal en el dominio del tiempo. Por lo tanto, poner a cero un bin producirá el mismo resultado que restar esa onda sinusoidal o, de manera equivalente, sumar una onda sinusoidal de una frecuencia central exacta del bin FFT pero con la fase opuesta. Tenga en cuenta que si la frecuencia de algún contenido en el dominio del tiempo no es puramente entera en el ancho FFT, entonces tratar de cancelarla agregando el inverso de una onda sinusoidal periódica exactamente entera producirá, no silencio, sino algo que se parece más a una nota de "latido" (onda sinusoidal modulada en AM de una frecuencia diferente). De nuevo, probablemente no sea lo que se quiere.

Por el contrario, si su señal de dominio de tiempo original es solo unas pocas sinusoides puras no moduladas que son exactamente enteras periódicas en el ancho de apertura FFT, entonces los contenedores FFT de cero eliminarán los designados sin artefactos.


3
Esta respuesta tiene buenas cosas, pero preferiría centrarme más en el efecto Gibbs.
Jim Clay

44
Ya se solicitó un intento de obtener una respuesta al efecto Gibbs aquí: dsp.stackexchange.com/questions/1144/…
hotpaw2

@ hotpaw2 Esta es una buena explicación. Sin embargo, necesito una referencia a esto y encuentro algunas dificultades para identificar uno. Es la razón por la que hacemos el filtrado del dominio del tiempo en lugar de trabajar en el dominio de la frecuencia. (Además, el dominio del tiempo puede ser en tiempo real). Sin embargo, ¡nadie parece comenzar diciendo esto!
Hugh

¿Cómo se puede relacionar esto con el método de ventana para el diseño de filtros?
Filipe Pinto

Compare la transformación de una ventana de Von Hann (et.al.) con la de cualquier ventana rectangular. Respuesta de filtro mucho mejor en general, especialmente entre contenedores FFT en la banda de parada. En general, poner a cero abruptamente los contenedores es peor que no poner a cero cerca de las transiciones.
hotpaw2

3

Esta pregunta también me ha confundido durante mucho tiempo. La explicación de @ hotpaw2 es buena. Puede interesarle el experimento simple con matlab.

https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html


información actualizada.

Para verificar este hecho es simple, solo necesitamos observar con cautela el espectro de respuesta al impulso de un filtro de paso de banda ideal (?) Que simplemente pone a cero los contenedores FFT. ¿Por qué necesito agregar el adverbio "con precaución"? Si solo usamos el mismo tamaño de la FFT para observar la respuesta del impulso, seremos engañados como se muestra en la figura 1 . Sin embargo, si agregamos el orden de DFT al observar la salida del filtro, es decir, rellenando con cero la respuesta al impulso, podemos encontrar el llamado fenómeno de Gibbs, ondas en el dominio de la frecuencia, como se muestra en la figura 2 .

De hecho, los resultados provienen del efecto de ventanas. Si desea comprender completamente el problema, consulte el capítulo 7.6 y el capítulo 10.1-10.2 de la biblia de DSP (1). En resumen, aquí se señalan tres puntos clave.

  1. El tamaño de la ventana y el orden de DFT (FFT) son totalmente independientes. No los mezcles juntos.
  2. Las propiedades de la ventana (tipo / tamaño) dominan la forma de DTFT. (por ejemplo, el lóbulo principal más ancho conduce a una banda transitoria más amplia en la respuesta de frecuencia).
  3. DFT es solo el muestreo de DTFT en el dominio de la frecuencia. Además, cuanto mayor es el orden de DFT, más denso es el espectro de DFT.

Entonces, con la ayuda de un espectro más denso en la Fig. 2 , podemos ver a través de la máscara del filtro de paso de banda ideal (falso).

ingrese la descripción de la imagen aquíEngañosamente Freq. Respuesta.

ingrese la descripción de la imagen aquíFenómeno de Gibbs en Freq. Respuesta.

(1) Alan V. Oppenheim y Ronald W. Schafer. 2009. Procesamiento de señal de tiempo discreto (3ª ed.). Prentice Hall Press, Upper Saddle River, NJ, Estados Unidos.

fps = 15;

LPF = 1;
HPF = 2;

n = -511:512;
n0 = 0;
imp = (n==n0);

NyquistF = 1/2*fps;

%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);  
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];

% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];

N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');


N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');

%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)

    N = length(input_signal);
    n = 0:1:N-1;
    freq = ( n .* fs) ./ N;

    filered_signal = zeros(N, 1);

    for i = 1:N
        if freq(i) > w1 & freq(i) < w2
            filered_signal(i) = input_signal(i);
        end

    end
end

¿Se puede convertir esto en un comentario?
endolito

Lo siento, no tengo suficiente reputación. La explicación en la URL también está escrita por mí mismo. Solo quiero proporcionar un código de prueba que pueda visualizar la mala influencia de la ondulación.
Po-wei Huang

1

FFT ofrece una resolución deficiente de tiempo, es decir, no proporciona información a qué hora existe esa frecuencia en particular. Proporciona información sobre los componentes de frecuencia existentes para la duración de la señal dada.

Al poner a cero los contenedores en FFT se obtiene una resolución deficiente después de IFFT en el dominio del tiempo.


sin embargo, existen dificultades de cálculo para que una señal muy larga tome fft y luego ifft. Para evitar zitters / timbres, el filtrado de una señal debe transitar suavemente desde la banda de paso hasta la banda de parada.
Itta Gouthami

"FFT da una resolución de tiempo pobre" FFT no da resolución de tiempo, es una transformación de dominio espectral y, como se dijo después, solo da información sobre los componentes de frecuencia de una señal.
EdParadox

La resolución proporcionada por un FFT es la longitud de su ventana. Cualquier cosa fuera de la ventana de la FFT no se resuelve como si estuviera dentro de la ventana de la FFT.
hotpaw2