FFT de tamanho, não uma potência de 2


9

Minha pergunta é sobre o tamanho de entrada de um sinal que não é uma potência de 2 e temos que tomar o fft dele. Algumas soluções dizem que, se quisermos tirar o fft de 1800, devemos zerá-lo até o comprimento de 2048 para torná-lo 2 e depois aplicar o algoritmo radix 2. Mas também existem outras soluções que aplicam uma combinação de algoritmos diferentes, sem preenchimento zero e calculando a FFT necessária. Minha pergunta é: zero preenchendo um sinal com comprimento de 2048, caso tenhamos que tomar ftft de 1800, faça alguma diferença nos resultados, se usarmos uma combinação de algoritmos diferentes para calcular a ftft de tamanho 1800. Haveria alguma diferença ou a resultado seria o mesmo.


A FFT resultante será diferente: em vez de calcular a FFT nas frequências para , você as calculará em para . No entanto, não há degradação das informações. 2πn/1800n=017992πn/2048n=02047
Peter K.

Então, isso significa que ambas as abordagens estão corretas? Mas qual você recomenda ser mais bom em termos de praticidade?
DX

Sim, ambas as abordagens estão corretas. Eu usaria a "solução mínima de energia" (ou seja, a solução mais simples e mais preguiçosa). Isso normalmente usaria a transformação de comprimento 2048.
Peter K.

Já vi na literatura e nos livros que as pessoas estão recomendando que o zero seja preenchido para torná-lo 2. Por que nunca insistem em implementar alguma combinação de outros algoritmos para obter bons resultados.
DX

2
Suponha que seus dados estejam x. Forma X = fft(x,123456);(ou algum outro comprimento estranho). Encontre xx = ifft(X);. Veja o que sum(abs(x-xx(1:length(x))));é.
Peter K.

Respostas:


6

A FFT resultante será diferente: em vez de calcular a FFT nas frequências para , você as calculará em para . No entanto, não há degradação das informações.2πn/1800  n=01799  2πn/2048  n=02047  

Ambas as abordagens estão corretas: usando 1800 ou 2048. Eu usaria a "solução de energia mínima" (ou seja, a solução mais simples e mais preguiçosa). Isso normalmente usaria a transformação de comprimento 2048.

As pessoas tendem a usar as transformações radix-2 porque não conhecem melhor. Parece haver muita informação incorreta sobre as FFTs que têm potência de 2. Não existe essa restrição. Além disso, eles provavelmente não sabem sobre algoritmos decentes não-radix-2, como os disponíveis no FFTW e em outras bibliotecas.

Para verificar se a FFT de qualquer tamanho preserva informações:

Suponha que seus dados de comprimento 1800 estejam x. Forma X = fft(x,2048);(ou outro comprimento diferente de 1800).
Encontre xx = ifft(X);.
Veja o que sum(abs(x-xx(1:1800)));é.

Veja também esta pergunta e suas respostas.


Quando eu faço isso ... apenas me dá um número, mas nenhuma comparação através de gráficos. Lamento, mas eu não sou muito bom em Matlab, porque eu implementei tudo em C.
DX

0

É preciso entender que, como o resultado (e a fonte) são discretos, a FFT não é realmente uma transformação de Fourier, mas, na realidade, é o desenvolvimento da série de Fourier. Isso significa que o resultado de qualquer FFT não é a transformação de um único bloco de dados, mas a transformação de um sinal periódico que consiste em uma concatenação infinita do mesmo bloco de dados, com ou sem uma separação consistindo no comprimento do preenchimento . (Supondo que meus dados analisados ​​se pareçam com «m», a transformação será o desenvolvimento de «... mmmmm ...» ou de «... mmmmm ...», que não são o mesmo sinal.)

Como conseqüência, não ter preenchimento significa adicionar ou remover implicitamente a falha de alta frequência nos dados de origem provenientes da descontinuidade na junção do final de um bloco e no início do próximo (que é o mesmo). O exemplo extremo seria analisar um bloco contendo o mesmo valor. O preenchimento de não preenchimento fará a diferença entre um sinal contínuo e um retangular.

A outra conseqüência disso é que, quanto mais longo o preenchimento, mais próximo o resultado será da transformação de uma única explosão de dados e maior será a resolução da transformação. Não é totalmente preciso dizer que, independentemente da passagem, não haverá degradação das informações. Haverá (de maneira limitada), por causa dos erros de arredondamento e o uso de um buffer mais longo, pode ajudar a evitá-lo (novamente, de uma maneira muito limitada).

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.