Timbre con valor real cuando FFT de longitud impar con relleno cero

13

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:

  1. 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.Fs/ /2n*(interp-1)-1
  2. Respuesta de longitud impar: no hay un contenedor así que solo divida la frecuencia positiva / negativa e inserte ceros entre ellos.Fs/ /2n*(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 50μs o menos de la señal espectáculo):

50μs

El canal imaginario tiene una pequeña onda, pero no tan malo:

Fs/ /2Fs/ /2

gct
fuente
Sus tramas son un poco difíciles de ver ya que se han reducido.
Jason R
@Jason lo siento, pensé que estaban vinculados, modifiqué el html para que puedan hacer clic en tamaño completo ahora.
gct
3
¿Tiene algún código o archivo de ejemplo para lo que está utilizando como entrada? Una cosa a tener en cuenta es que las condiciones límite asumidas por el DFT. Específicamente, hay una suposición inherente de que la señal de interés es periódica. Entonces, si hay una discontinuidad entre la primera y la última muestra en la entrada de longitud impar, entonces puede ver un timbre como el que observó. Es posible que la muestra de longitud uniforme sea más continua de principio a fin, por lo que no verá este fenómeno.
Jason R
No tengo datos en un formato que nadie más pueda digerir fácilmente, pero creo que tienes razón. Acabo de llegar aquí para trabajar y volví a compilar mi código / regeneré una entrada de prueba (chirrido de 10Hz-100Hz durante 1 segundo) y volví a ejecutar el código y no pude sonar. Vi su comentario y cambié la frecuencia a 10-100.314 y ahora veo sonar en transformaciones pares e impares.
gct
1
¿Has intentado aplicar una función de ventana a tus datos? Eso normalmente reducirá el timbre.
MarkSci

Respuestas:

1

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.

usuario27575
fuente
0

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.

Jian
fuente