Así que estoy tratando de escribir un interpolador de dominio de frecuencia que ponga a cero la respuesta de frecuencia de una señal y las transformadas inversas. Hay dos casos con los que tengo que lidiar:
- Respuesta de longitud uniforme: tiene que dividir el contenedor porque es ambiguo. Entonces copio la parte negativa del espectro y agrego ceros en el medio.
n*(interp-1)-1
- Respuesta de longitud impar: no hay un contenedor así que solo divida la frecuencia positiva / negativa e inserte ceros entre ellos.
n*(interp-1)
El código que hace el relleno cero se puede ver aquí
// 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));
}
}
El primer caso está trabajando muy bien, yo estoy probando en una señal chirp y se interpola muy bien, hay un poco de ruido numérico, pero ha disparado redonda a través de una FFT por lo qué se puede hacer (primeros o menos de la señal espectáculo):
El canal imaginario tiene una pequeña onda, pero no tan malo: