Friday 9 September 2016

fourier transform - How to circularly shift a signal by a fraction of a sample?


The shift theorem says:



Multiplying $x_n$ by a linear phase $e^{\frac{2\pi i}{N}n m}$ for some integer m corresponds to a circular shift of the output $X_k$: $X_k$ is replaced by $X_{k-m}$, where the subscript is interpreted modulo N (i.e., periodically).



Ok, that works fine:


plot a


arbitrary 9-sample signal


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

signal shifted by 3 samples in the frequency domain


It shifted by 3 samples, as I expected.


I thought you could also do this to shift by fractions of a sample, but when I try it, my signal becomes imaginary and not at all like the 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 after multiplying by 3.5 complex exponential


I didn't expect this at all. Isn't this equivalent to convolving with a real impulse that's been shifted by 3.5 samples? So the impulse should still be real, and the result should still be real? And it should have more or less the same shape as the original, but sinc interpolated?



Answer



If you want the shifted output of the IFFT to be real, the phase twist/rotation in the frequency domain has to be conjugate symmetric, as well as the data. This can be accomplished by adding an appropriate offset to your complex exp()'s exponent, for the given phase slope, so that the phase of the upper (or negative) half, modulo 2 Pi, mirrors the lower half in the FFT aperture. The complex exponential shift function can also be made conjugate symmetric by indexing it from -N/2 to N/2 with a phase of zero at index 0.


It just so happens that the appropriate offset for phase twists or spirals, that complete an exact integer multiples of 2 Pi rotations in aperture, to be conjugate symmetric in aperture, is zero.


With a conjugate symmetric phase twist vector, the result should then end up as a circular Sinc interpolation for non-integer shifts.


Elaboration by OP:


Your choice of k = [0, 1, 2, 3, 4, 5, 6, 7, 8] is producing an asymmetrical complex exponential:



asymmetrical complex exponential 0.5 sample shift attempt, with imaginary part as dashed line


If you use k = [0, 1, 2, 3, 4, -4, -3, -2, -1] instead, you get a Hermite-symmetric complex exponential:


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

Hermite-symmetric complex exponential for 0.5 sample shift, with imaginary part as dashed line


and now when you use the same exponential formula to shift by 0.5 or 3.5 samples, you get a real result:


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

shift by 0.5 and 3.5 samples, with original as dotted line



No comments:

Post a Comment

readings - Appending 内 to a company name is read ない or うち?

For example, if I say マイクロソフト内のパートナーシップは強いです, is the 内 here read as うち or ない? Answer 「内」 in the form: 「Proper Noun + 内」 is always read 「ない...