Por que é uma má idéia filtrar zerando as caixas de FFT?


72

É muito fácil filtrar um sinal executando uma FFT, zerando alguns dos compartimentos e executando um IFFT. Por exemplo:

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)

O componente de alta frequência é completamente removido por este filtro FFT "brickwall".

Mas ouvi dizer que esse não é um bom método para usar.

  • Por que geralmente é uma má idéia?
  • Existem circunstâncias em que é uma boa ou boa escolha?

[ como sugerido por pichenettes ]

Respostas:


74

Zerar posições no domínio da frequência é o mesmo que multiplicar por uma janela retangular no domínio da frequência. Multiplicar por uma janela no domínio da frequência é o mesmo que convolução circular pela transformação dessa janela no domínio do tempo. A transformação de uma janela retangular é a função Sinc ( ). Observe que a função Sinc possui muitas ondulações grandes e ondulações que estendem toda a largura da abertura no domínio do tempo. Se um filtro no domínio do tempo que pode gerar todas essas ondulações (toque) é uma "má ideia", o mesmo ocorre com o zeramento de posições.sin(ωt)/ωt

Essas ondulações serão maiores para qualquer conteúdo espectral "entre caixas" ou periódico não inteiro na largura da abertura da FFT. Portanto, se os dados de entrada originais da FFT forem uma janela em qualquer dado que seja um pouco não periódico nessa janela (por exemplo, a maioria dos sinais do "mundo real" com amostragem não síncrona), esses artefatos específicos serão produzidos por caixas com entrada em zero.

Outra maneira de analisar é que cada compartimento de resultado da FFT representa uma certa frequência de onda senoidal no domínio do tempo. Assim, zerar um compartimento produzirá o mesmo resultado que subtrair essa onda senoidal ou, equivalentemente, adicionar uma onda senoidal de uma freqüência central exata do compartimento FFT, mas com a fase oposta. Observe que, se a frequência de algum conteúdo no domínio do tempo não for periódica puramente inteira na largura da FFT, tentar cancelá-la adicionando o inverso de uma onda senoidal periódica exatamente inteira produzirá, não silêncio, mas algo que se parece mais uma nota de "batida" (onda senoidal modulada AM de frequência diferente). Novamente, provavelmente não é o que se deseja.

Por outro lado, se o seu sinal no domínio do tempo original for apenas alguns sinusoides puros não modulados que sejam exatamente inteiros periódicos na largura da abertura da FFT, os compartimentos da FFT com zeragem zero removerão os designados sem artefatos.


3
Essa resposta tem coisas boas, mas eu preferiria focar mais no efeito Gibbs.
Jim Clay

4
Uma tentativa de obter uma resposta para o efeito Gibbs já foi solicitada aqui: dsp.stackexchange.com/questions/1144/…
hotpaw2

@ hotpaw2 Esta é uma boa explicação. No entanto, preciso de uma referência a isso e estou encontrando alguma dificuldade em identificar uma. É a razão pela qual fazemos a filtragem no domínio do tempo, em vez de trabalhar no domínio da frequência. (Além disso, o domínio do tempo pode ser em tempo real.) No entanto, ninguém parece começar afirmando isso!
Hugh

Como isso pode ser relacionado ao método da janela para o design do filtro?
Filipe Pinto

Compare a transformação de uma janela de Von Hann (et.al.) com a de qualquer janela retangular. Resposta de filtro muito melhor em geral, especialmente entre caixas de FFT na faixa de parada. Em geral, zerar abruptamente os compartimentos é pior do que não zerar perto das transições.
hotpaw2 17/05

3

Esta questão também me confundiu por um longo tempo. A explicação de @ hotpaw2 é boa. Você pode estar interessado no experimento simples usando o matlab.

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


informação atualizada.

Para verificar se esse fato é simples, basta observar com cautela o espectro da resposta ao impulso de um filtro de passagem de banda ideal (?) Que apenas zera os compartimentos FFT. Por que preciso adicionar o advérbio "com cautela"? Se apenas usarmos o mesmo tamanho da FFT para observar a resposta do impulso, seremos enganados, como mostra a Figura 1 . No entanto, se adicionarmos a ordem do DFT ao observar a saída do filtro, ou seja, preenchendo zero a resposta ao impulso, podemos encontrar o chamado fenômeno de Gibbs, ondulações no domínio da frequência, como mostrado na Fig . 2 .

Os resultados vêm de fato do efeito de janelas. Se você deseja entender completamente o problema, consulte o capítulo 7.6 e o ​​capítulo 10.1-10.2 da Bíblia do DSP (1). Para resumir, três pontos principais são anotados aqui.

  1. O tamanho da janela e a ordem da DFT (FFT) são totalmente independentes. Não os misture.
  2. As propriedades da janela (tipo / tamanho) dominam a forma do DTFT. (por exemplo, o lobo principal mais largo leva a uma faixa transitória mais ampla na resposta de frequência.)
  3. DFT é apenas a amostragem de DTFT no domínio da frequência. Além disso, quanto maior a ordem da DFT, mais denso é o espectro da DFT.

Assim, com a ajuda do espectro mais denso na Fig. 2 , podemos ver através da máscara do filtro de passa-banda ideal (falso).

insira a descrição da imagem aquiEnganosamente Freq. Resposta.

insira a descrição da imagem aquiFenômeno de Gibbs em Freq. Resposta.

(1) Alan V. Oppenheim e Ronald W. Schafer. 2009. Processamento de Sinais em Tempo Discreto (3ª ed.). Prentice Hall Press, Upper Saddle River, NJ, EUA.

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

Isso pode ser convertido em um comentário?
endolith 22/04

Desculpe, não tenho reputação suficiente. A explicação no URL é escrita por mim também. Eu só quero fornecer um código de teste que possa visualizar a má influência do ripple.
Po-wei Huang

1

A FFT fornece uma resolução de tempo ruim, ou seja, não fornece informações a que horas essa frequência específica existe. Ele fornece informações sobre os componentes de frequência existentes para uma determinada duração do sinal.

Ao zerar caixas no FFT, a resolução é baixa após o IFFT no domínio do tempo.


no entanto, existem dificuldades computacionais para um sinal muito longo tomar fft e depois ifft. Para evitar zitters / toques, a filtragem de um sinal deve ser transmitida suavemente da faixa de passagem para a banda de parada.
Itta Gouthami

"FFT fornece baixa resolução de tempo" A FFT não fornece resolução de tempo, é uma transformação de domínio espectral e, como dito posteriormente, fornece apenas informações sobre os componentes de frequência de um sinal.
EdParadox

A resolução fornecida por uma FFT é o comprimento da sua janela. Qualquer coisa fora da janela da FFT não é resolvida como estando dentro da janela da FFT.
hotpaw2
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.