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:
fft
interpolation
c
gct
fuente
fuente
Respuestas:
Al poner a cero los contenedores de alta frecuencia, ha multiplicado efectivamente el espectro de la señal con una función rectangular. La multiplicación en frecuencia es convolución en el tiempo y el par de Fourier de un rect es un sinc. Entonces, lo que realmente hizo fue convolver la señal del dominio del tiempo con un sinc con el ancho del lóbulo principal del sinc inversamente proporcional a la longitud del rectángulo. Es por eso que las numerosas técnicas de diseño de filtros como el diseño de Parks-McClellan en lo que se llama una "región de transición" o banda de "transición" para que no haya un cambio instantáneo en la respuesta de frecuencia del filtro. Estas técnicas de diseño de filtros son importantes porque el filtro "ideal" como el que usó tiene esos efectos indeseables en el dominio del tiempo.
fuente
Un paso en el dominio de la frecuencia aparecerá como ondas en el dominio del tiempo. Si suaviza sus datos de frecuencia con una función de ventana (por ejemplo, la ventana de Hamming), debería reducir significativamente las ondas.
fuente