Então, eu estou tentando escrever um interpolador no domínio da frequência que apague a resposta de frequência de um sinal e transforma inversas. Há dois casos com os quais tenho que lidar:
- Resposta uniforme - é necessário dividir a bandeja porque é ambígua. Então, copio a parte negativa do espectro e adiciono zeros no meio.
n*(interp-1)-1
- Resposta de comprimento ímpar - não há compartimento , basta dividir a frequência positiva / negativa e inserir zeros entre eles.
n*(interp-1)
O código que faz o preenchimento zero pode ser visto aqui
// Copy negative frequency components to end of buffer and zero out middle
// inp - input buffer of complex floats
// n - transform size
// interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
if ((n % 2) == 0) {
memmove(inp + n*interp - n/2, inp + n/2, n/2*sizeof(cfloat_t));
memset (inp + n/2 + 1, 0, (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero
inp[n/2] /= 2.0;
inp[n*interp-n/2] /= 2.0;
} else {
memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
memset (inp + (n+1)/2, 0, (n*(interp-1))*sizeof(cfloat_t));
}
}
O canal imaginário tem uma pequena ondulação, mas não é tão ruim assim:
fft
interpolation
c
gct
fonte
fonte
Respostas:
Ao zerar os compartimentos de alta frequência, você multiplicou efetivamente o espectro do sinal com uma função retangular. Multiplicação em frequência é convolução no tempo e o par de Fourier de um ret é sinc. Então, o que você realmente fez foi envolver o sinal do domínio do tempo com um sinc com a largura do lóbulo principal do sinc inversamente proporcional ao comprimento do ret. É por isso que as inúmeras técnicas de criação de filtros, como Parks-McClellan, são chamadas de "região de transição" ou banda de "transição", para que não ocorra uma alteração instantânea na resposta de frequência do filtro. Essas técnicas de design de filtro são importantes porque o filtro "ideal", como você usou, tem efeitos indesejáveis no domínio do tempo.
fonte
Uma etapa no domínio da frequência será exibida como ondulações no domínio do tempo. Se você suavizar seus dados de frequência com uma função de janela (por exemplo, janela Hamming), deverá reduzir significativamente as ondulações.
fonte