Filtragem de espaço de Fourier

Eu tenho uma série temporal real de vetores x de comprimento T e um filtro h de comprimento t << T. h é um filtro no espaço de quatro, real e simétrico. É aproximadamente 1 / f.

Eu gostaria de filtrar x com h para obter y.

Suponha que t == T e FFTs de comprimento T possam caber na memória (nenhum dos quais é verdadeiro). Para obter meu x filtrado em python, eu faria:

import numpy as np
from scipy.signal import fft, ifft

y = np.real( np.ifft( np.fft(x) * h ) ) )

Como as condições não se mantêm, tentei o seguinte hack:

Selecione um tamanho de preenchimento P <t / 2, selecione um tamanho de bloco B para que B + 2P seja um bom tamanho de FFTEscale h via interpolação de spline para ser do tamanho B + 2P> t (h_scaled)y = []; Ciclo:Pegue o bloco de comprimento B + 2P de x (chamado x_b)Execute y_b = ifft (fft (x_b) * h_scaled)Solte o preenchimento P de ambos os lados de y_b e concatene com ySelecione o próximo x_b sobreposto com o último por P

Essa é uma boa estratégia? Como seleciono o preenchimento P de uma maneira adequada? Qual é a maneira correta de fazer isso? Eu não sei muito processamento de sinal. Esta é uma boa chance de aprender.

Estou usando o cuFFT para acelerar as coisas, então seria ótimo se a maior parte das operações fosse de FFTs. O problema real é 3D. Além disso, não estou preocupado com artefatos de um filtro acausal.

Obrigado Paul.

questionAnswers(1)

yourAnswerToTheQuestion