¿Cómo desplazar circularmente una señal por una fracción de una muestra?

22

El teorema del cambio dice :

Multiplicar por una fase lineal para algún entero m corresponde a un desplazamiento circular de la salida : se reemplaza por , donde se interpreta el subíndice módulo N (es decir, periódicamente).xn XkXkXk-me2πiNnmXkXkXkm

Ok, eso funciona bien:

plot a

señal arbitraria de 9 muestras

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

señal desplazada por 3 muestras en el dominio de frecuencia

Cambió en 3 muestras, como esperaba.

Pensé que también podría hacer esto para cambiar por fracciones de una muestra, pero cuando lo intento, mi señal se vuelve imaginaria y no se parece en nada al original:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

señal después de multiplicar por 3.5 exponencial complejo

No esperaba esto en absoluto. ¿No es esto equivalente a convolucionarse con un impulso real que ha sido desplazado por 3.5 muestras? Entonces, ¿el impulso debería ser real y el resultado debería ser real? ¿Y debería tener más o menos la misma forma que el original, pero interpolado sinc?

endolito
fuente
Aquí hay un envío de Matlab File Exchange que calcula la modulación correcta para señales reales / complejas de longitud par / impar y las retrasa fraccionalmente: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Respuestas:

14

Si desea que la salida desplazada de la IFFT sea real, el giro / rotación de fase en el dominio de frecuencia debe ser simétrico conjugado, así como los datos. Esto se puede lograr agregando un desplazamiento apropiado al exponente complejo de exp (), para la pendiente de fase dada, de modo que la fase de la mitad superior (o negativa), módulo 2 Pi, refleje la mitad inferior en la apertura FFT . La función de desplazamiento exponencial compleja también puede hacerse simétrica conjugada indexándola de -N / 2 a N / 2 con una fase de cero en el índice 0.

Sucede que el desplazamiento apropiado para giros de fase o espirales, que completan un número entero exacto múltiplos de 2 rotaciones Pi en la apertura, para ser conjugado simétrico en apertura, es cero.

Con un vector de giro de fase simétrico conjugado, el resultado debería terminar como una interpolación de Sinc circular para cambios no enteros.

Elaboración por OP:

Su elección de k = [0, 1, 2, 3, 4, 5, 6, 7, 8] está produciendo un exponencial complejo asimétrico:

intento de cambio de muestra exponencial complejo asimétrico 0.5, con parte imaginaria como línea discontinua

Si usa k = [0, 1, 2, 3, 4, -4, -3, -2, -1] en su lugar, obtendrá un exponencial complejo simétrico de Hermite:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

Exponencial complejo simétrico de Hermite para 0.5 desplazamiento de muestra, con parte imaginaria como línea discontinua

y ahora cuando usa la misma fórmula exponencial para desplazarse por 0.5 o 3.5 muestras, obtiene un resultado real:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

cambiar por 0.5 y 3.5 muestras, con original como línea punteada

hotpaw2
fuente
¡Ajá! En lugar de k = [0, 1, 2, 3, 4], debería estar usandok = [0, 1, 2, -2, -1]
endolith
@endolith / hotpaw2, en otras palabras, ¿se trata de indexar las muestras en el dominio del tiempo?
TheGrapeBeyond
1
La simetría alrededor del bin 0 también proporcionará simetría alrededor de N / 2, incluso si N / 2 no es un número entero.
hotpaw2
1
Encontré una función que aplica la modulación correcta en Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
¿Esto se cumple igualmente para señales complejas?
Leo