Por que devo zerar um sinal antes de tomar a transformação de Fourier?


77

Em resposta a uma pergunta anterior , foi declarado que se deveria

zere os sinais de entrada (adicione zeros no final para que pelo menos metade da onda fique "em branco")

Qual o motivo disso?


Depende do que você está fazendo. Isso poderia ter sido um comentário na minha resposta. Eu adicionei alguma explicação para isso.
endolith

@ endolith: Inicialmente, pensei em colocá-lo como um comentário, mas acho que a pergunta pode ser de interesse geral e que seria uma pena se uma boa resposta a ela fosse enterrada em comentários em algum lugar. Se você não concordar, vou excluir esta pergunta.
Jonas

9
Bem, é uma pergunta muito geral. Você pode zerar o pad para transformar algo em uma potência de 2, pode zerar o pad para fazer com que a transformação circular se comporte como uma transformação não circular, você pode fazer isso para reamostrar um sinal, alterar a resolução de frequência etc. etc.
endolith

Respostas:


82

O preenchimento zero permite usar um FFT mais longo, o que produzirá um vetor de resultado mais longo.

Um resultado mais longo da FFT possui mais compartimentos de frequência com espaçamento mais próximo na frequência. Mas eles fornecerão essencialmente o mesmo resultado que uma interpolação Sinc de alta qualidade de uma FFT mais curta e sem preenchimento de zero dos dados originais.

Isso pode resultar em um espectro de aparência mais suave quando plotado sem interpolação adicional.

Embora essa interpolação não ajude na resolução ou na resolução e / ou entre frequências adjacentes ou próximas, pode ser mais fácil resolver visualmente o pico de uma única frequência isolada que não possui sinais adjacentes significativos ou ruído no espectro . Estatisticamente, a densidade mais alta dos escaninhos de resultados de FFT provavelmente tornará mais provável que o escaninho de magnitude de pico esteja mais próximo da frequência de um sinusóide de frequência de entrada isolada aleatória e sem interpolação adicional (parabólica, et al.).

Mas, essencialmente, o preenchimento zero antes de uma DFT / FFT é um método computacionalmente eficiente de interpolar um grande número de pontos.

O preenchimento zero para filtragem de correlação cruzada, correlação automática ou convolução é usado para não misturar resultados de convolução (devido à convolução circular). O resultado completo de uma convolução linear é maior que qualquer um dos dois vetores de entrada. Se você não fornecer um local para finalizar esse resultado de convolução mais longo, a convolução rápida da FFT apenas o misturará e criará o resultado desejado. O preenchimento zero fornece zeros no qual misturar o resultado mais longo. E é muito mais fácil descompactar algo que só foi misturado / somado com um vetor de zeros.


12
O último parágrafo é a resposta chave para a pergunta original, embora eu ache que poderia ser mais claramente definido. O preenchimento zero no contexto de correlação ou convolução pode ser feito para garantir que a implementação do processo no domínio da frequência produz linear e não convolução / correlação circular . No entanto, isso não é um requisito se você estiver disposto a fazer algum trabalho de contabilidade paralelo, como nos algoritmos de sobreposição para salvar e sobrepor-adicionar.
Jason R #

4
@ Jason R: Na verdade, ambos são convoluções circulares. Uma FFT normal (sem poda) faz todas as multiplicações e adiciona a quebra ao redor de parte do resultado. É que, no caso suficientemente preenchido com zero, todas essas multiplicações e acréscimos são do valor zero, então ninguém se importa com o nada que é calculado e enrolado em volta do círculo.
precisa saber é o seguinte

9
De fato; A multiplicação dos DFTs de dois sinais sempre implementa convolução circular. Eu deveria ter escrito de forma diferente: você coloca zeros no final de um sinal para garantir que o resultado obtido pela convolução circular seja o mesmo que você obtém se os envolver de forma linear (assumindo que convolução linear é o que você deseja, o que é geralmente o caso).
Jason R

27

Há algumas coisas a considerar antes de decidir zerar seu sinal no domínio do tempo. Você pode não precisar zerar o sinal!

1) Aumente os dados do domínio do tempo (não o preenchimento zero) para obter uma melhor resolução no domínio da frequência.

2) Aumente o número de pontos da FFT além do comprimento do sinal no domínio do tempo (preenchimento zero) se desejar obter uma melhor definição dos compartimentos da FFT, apesar de não comprar uma resolução mais verdadeira. Você também pode pressionar para obter uma potência de 2 pontos FFT.

3) Ao mexer nos pontos FFT (no ponto anterior), verifique se os pontos de frequência acabam onde você deseja. O espaçamento dos pontos é , onde é a frequência de amostragem e é o número de pontos FFT.fs/NfsN

Existem algumas figuras legais ilustrando esses pontos em http://www.bitweenie.com/listings/fft-zero-padding/

Uma última coisa a mencionar: se você zerar o sinal no domínio do tempo e quiser usar uma função de janelas, certifique-se de exibir o sinal antes de zerar o teclado. Se você aplicar a função window após o preenchimento zero, não realizará o que a janela deve realizar. Mais especificamente, você ainda terá uma transição nítida do sinal para zero, em vez de uma transição suave para zero.


8

Em geral, o preenchimento zero antes da DFT é equivalente a interpolação ou amostragem com mais frequência no domínio transformado.

Aqui está uma rápida visualização de como o oposto funciona. Se você amostrar um sinal de banda ilimitada no tempo a uma taxa mais alta, obterá um espectro mais 'esmagado', ou seja, um espectro com mais zeros nas duas extremidades. Em outras palavras, você pode obter mais amostras no tempo simplesmente preenchendo o zero com frequência após DFT'ing e, em seguida, IDFT'ing com o resultado do preenchimento zero.

O mesmo efeito ocorre ao contrário quando o preenchimento zero ocorre com o tempo. Tudo isso porque a reconstrução perfeita do sinal é possível desde que o sinal seja ilimitado por banda e amostrado pelo menos na taxa de Nyquist.

O termo 'resolução' depende de como você o define. Para mim, significa quão bem os dois pontos de observação adjacentes no tempo ou na frequência podem ser discriminados de forma confiável (estatisticamente). Nesse caso, a resolução realmente depende do tamanho da DFT devido a vazamentos espectrais. Ou seja, menor o tamanho da janela, mais embaçado ou manchado o sinal transformado e vice-versa. É diferente da frequência com que você experimenta ou do que eu chamo de 'definição'. Por exemplo, você pode ter uma imagem muito borrada amostrada em alta taxa (alta definição), mas ainda não pode obter mais informações do que a amostragem em menor taxa. Portanto, em resumo, o preenchimento zero não melhora a resolução, pois você não obtém mais informações do que antes.


6

Se alguém tiver algum interesse no espectro da função de janelas usada para isolar a amostra no domínio do tempo, o preenchimento zero aumentará a resolução de frequência da função de janelas.

Se o sinal de tempo for , onde é a função de janelas, o espectro geral é , onde inidica a convolução. w ( t ) X ( f ) W ( f ) x(t)w(t)w(t)X(f)W(f)

Se sua função de janelas é um retângulo simples (uma extração de algum conjunto de valores de . Então é a função de sincronização. Por exemplo, se Nfft for igual à largura do seu retângulo, e você tinha um sinusóide precisamente em uma das frequências da caixa, então as amostras da função de sincronização que apareceriam centralizadas nessa caixa caem exatamente nos cruzamentos de zero fora do pico e você não vê a forma da sincronização em Se você agora zerar os dados que entram na FFTX ( f )x(t)X(f), você verá algumas amostras em outros lugares além do pico e do cruzamento de zero, revelando o formato da função de sincronização no espectro resultante. Então, para que serve o preenchimento zero? Certamente é de utilidade educacional revelar a natureza da transformação discreta de sinais em janelas, como é o caso usual. Em um sentido prático, pode ser útil em qualquer caso em que você esteja interessado na forma espectral de um envelope isolado montado em uma onda portadora.


4

Pode haver diferentes razões para isso, dependendo de qualquer processo realizado antes e depois da transformação de Fourier. O motivo mais comum é obter maior resolução de frequência em qualquer transformação resultante. Ou seja, quanto maior o número de amostras usadas em sua transformação, menor a largura de caixa no espectro de potência resultante. Lembre-se: binwidth = sample_frequency / transform_size (geralmente chamado de tamanho da janela). Você pode imaginar disso, à medida que aumenta o tamanho da transformação, a largura da bin reduz (= melhor resolução de frequência). O preenchimento zero é uma maneira de aumentar o tamanho da transformação sem introduzir novas informações no sinal.

Então, por que não fazer uma transformação maior sem preenchimento zero? Isso não alcançaria o mesmo efeito? Boa pergunta. Em muitos casos, convém analisar um fluxo de dados no domínio do tempo, para o qual você pode estar usando uma transformação de Fourier (stft) de curta duração. Isso envolve a transformação de cada N amostras de acordo com a resolução de tempo necessária para caracterizar alterações no espectro de frequências. Aqui reside o problema. Uma janela muito grande e você perderá a resolução do tempo, uma janela muito pequena e a resolução da frequência. A solução é usar janelas de domínio de tempo pequenas, oferecendo uma boa resolução de tempo e, em seguida, zerá-las para fornecer uma boa resolução de frequência. Espero que isso seja útil para você

Atualização
Eu não expliquei isso bem. Eu deveria ter esclarecido melhor. Referindo-se a uma transformação em janela, na verdade você não obtém uma resolução de frequência maior "real", mas para fins de visualização (lendo o espectro de potência com o olho), ela pode fornecer resultados mais claros. Usando a taxa de amostragem crítica, cada lóbulo lateral ocupa um único compartimento, o que, dependendo da técnica gráfica, pode ser enganoso. O preenchimento zero fornece um espectro de frequência interpolado que pode ser mais revelador. Além disso, se você estiver usando um método simples de seleção de pico para estimativa de frequência, o efeito de interpolação espectral do preenchimento zero fornecerá uma amostra espectral mais próxima do pico real do lobo principal. Este link fornece alguns diagramas úteis: http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html


9
Esta resposta não está correta. O preenchimento zero não melhora a resolução da frequência; apenas interpola entre as saídas da transformação menor. Você pode pensar em preenchimento zero como adicionar mais compartimentos de frequência com a mesma largura de banda da transformação menor; portanto, da perspectiva de um banco de filtros, suas bandas de passagem se sobrepõem.
Jason R

1
Se isso ajuda a entender: Você também pode fazer o oposto: pegue a FFT de um sinal, depois zere o resultado e inverta a FFT. Isso terá o efeito de interpolar o sinal original. Mas é claro que o sinal ainda será o mesmo sinal, com a mesma largura de banda Nyquist. A interpolação não fornecerá mais informações sobre frequências mais altas do que as que estavam originalmente lá.
endolith

1
@ Jason R - Você está certo, minha resposta foi enganosa, tentei esclarecer acima no post original. Eu não deveria ter declarado que o preenchimento zero aumenta a resolução da frequência.
Dan Barry

2

Não os vi mencionados nas boas respostas anteriores, portanto adicionarei os seguintes motivos importantes adicionais para o preenchimento zero:

Os algoritmos Radix-2 são mais eficientes, portanto, o preenchimento zero para a próxima potência de 2 (ou potência de 4 em alguns casos para a Radix-4), ou evitar significativamente os fatores primos grandes, pode melhorar o desempenho em tempo real. Além disso, ao usar a FFT para análise, o preenchimento zero geralmente é feito para calcular amostras da DTFT, como determinar a resposta de frequência de uma FIR: compare fft ([1 1 1 1]) com fft ([1 1 1 1], 512) que é idêntico ao freqz ([1 1 1 1]).

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.