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: