Comment décaler circulairement un signal d'une fraction d'un échantillon?

22

Le théorème de décalage dit :

Multipliant par une phase linéaire e 2 π ixn pour un entiermcorrespond à undécalage circulairede la sortieXk:Xkest remplacé parXk-m, où l'indice est interprété moduloN(c'est-à-dire périodiquement).e2πjeNnmXkXkXk-m

Ok, ça marche bien:

plot a

signal arbitraire à 9 échantillons

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

signal décalé de 3 échantillons dans le domaine fréquentiel

Il s'est déplacé de 3 échantillons, comme je m'y attendais.

Je pensais que vous pouviez également faire cela pour décaler par fractions d'un échantillon, mais quand je l'essaye, mon signal devient imaginaire et pas du tout comme l'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--'

signal après multiplication par 3,5 exponentielle complexe

Je ne m'y attendais pas du tout. N'est-ce pas équivalent à convoluer avec une véritable impulsion décalée de 3,5 échantillons? Donc, l'impulsion devrait toujours être réelle, et le résultat devrait toujours être réel? Et il devrait avoir plus ou moins la même forme que l'original, mais sinc interpolé?

endolith
la source
Voici une soumission Matlab File Exchange qui calcule la modulation correcte pour les signaux réels / complexes de longueur paire / impaire et les retarde fractionnellement: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Réponses:

14

Si vous voulez que la sortie décalée de l'IFFT soit réelle, la torsion / rotation de phase dans le domaine fréquentiel doit être conjuguée symétrique, ainsi que les données. Cela peut être accompli en ajoutant un décalage approprié à l'exposant de votre exp complexe (), pour la pente de phase donnée, de sorte que la phase de la moitié supérieure (ou négative), modulo 2 Pi, reflète la moitié inférieure de l'ouverture FFT . La fonction de décalage exponentiel complexe peut également être rendue conjuguée symétrique en l'indexant de -N / 2 à N / 2 avec une phase de zéro à l'indice 0.

Il se trouve que le décalage approprié pour les torsions de phase ou les spirales, qui complètent un multiple entier exact de 2 rotations Pi en ouverture, pour être conjugué symétrique en ouverture, est nul.

Avec un vecteur de torsion de phase symétrique conjugué, le résultat devrait alors se terminer par une interpolation circulaire Sinc pour des décalages non entiers.

Elaboration par OP:

Votre choix de k = [0, 1, 2, 3, 4, 5, 6, 7, 8] produit une exponentielle complexe asymétrique:

Tentative de décalage de l'échantillon exponentiel complexe asymétrique de 0,5, avec une partie imaginaire en ligne pointillée

Si vous utilisez k = [0, 1, 2, 3, 4, -4, -3, -2, -1] à la place, vous obtenez une exponentielle complexe hermite symétrique:

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

Exponentielle complexe hermite symétrique pour un décalage de 0,5 échantillon, avec une partie imaginaire sous forme de ligne pointillée

et maintenant, lorsque vous utilisez la même formule exponentielle pour décaler de 0,5 ou 3,5 échantillons, vous obtenez un vrai résultat:

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

décalage de 0,5 et 3,5 échantillons, avec l'original en pointillé

hotpaw2
la source
Ah! Au lieu de k = [0, 1, 2, 3, 4], je devrais utiliserk = [0, 1, 2, -2, -1]
endolith
@endolith / hotpaw2, En d'autres termes, tout est question d' indexation des échantillons de domaine temporel?
TheGrapeBeyond
1
La symétrie autour du bac 0 fournira également la symétrie autour de N / 2, même si N / 2 n'est pas un entier.
hotpaw2
1
J'ai trouvé une fonction qui applique la modulation correcte sur Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
cela vaut-il également pour les signaux complexes?
Leo