# Shift a signal by fraction of a sample

I have a signal with a sample time of 0.5 micro seconds and I would like to shift this signal by a fraction of the sample time, say by 3 nano seconds.

I have read a few online resources about fractional delay filtering and about using the FFT and IFFT to perform such delay. Can someone point me to some theory on this or give me an idea on how to implement it.

For the regular shifting of the signal for integer samples, I have implemented this by shifting the signal by the required number of samples and adding zeros at the beginning. Is this approach correct?

There's a good overview article which appeared in 1996 in the IEEE Signal Processing Magazine: Splitting the unit delay: tools for fractional delay filter design. The nice thing about it is that there's also a set of related Matlab files available. These routines will allow you to design such a system.

As for shifting by an integer number of samples, what you did is obviously correct.

• I only skimmed the paper so I'm not sure if this is explicitly in there, but fractional delay is related to fractional derivative, which generalizes the n-th derivative to arbitrary order. Aug 4, 2015 at 16:02

Besides doing fft type solutions you can also use interpolation, the specific kind of interpolation that is appropriate would be based on your needs of course! Linear interpolation has worked well for me in the past with flange effects, but your mileage may vary.

Lagrange interpolation might also be worth looking into btw, if linear interpolation isn't good enough. http://blog.demofox.org/2015/07/08/lagrange-interpolation/

• Hermite might be better than Lagrange, but if you have access to MATLAB (or an FIR filter design program), you can design yourself a "polyphase filter bank" interpolator in which you have coefficient sets for a variety of different, uniformly-spaced, fractional delays. pick the two discrete fractional delays closest to your given fractional delay and linearly interpolate between them. Aug 4, 2015 at 19:44

This can be done using 'delayseq' function in MATLAB. This function can shift the signal in fractional samples. You can either write the number of samples you want to shift or the in terms of time, the amount of delay you want. But the important thing to notice is that the delayed signal has same length as that of original signal so if you do not want to truncate the signal, use zero padding first and then delayseq. https://in.mathworks.com/help/phased/ref/delayseq.html