# How to undo dynamic Doppler effect by software?

I have a signal affected by Doppler effect. In general, the Doppler effect changes the scale of the time and frequency domains. So, to undo this phenomenon, I am using a sampling rate converter. Two possible implementations using polyphase structures are shown in Figures 1 and 2. They both work fine as expected. The recovered signal has no Doppler shift. .

However, while in presence of dynamic Doppler, i.e. the compression/expansion factor varies over time, I am not sure if this solution is appropriate. I am buffering the signal, and for each buffer I compute the corresponding $L$ and $M$ factors that undo the Doppler effect. Nevertheless, there exists a trade-off between buffer length and the frequency resolution. In other words, in a buffer I still have a varying Doppler shift, so the $L/M$ ratio should not be a constant during a single buffer.

Is there a way of apply a sample-to-sample method to undo dynamic Doppler effect? I am currently interested in software-based solutions, not hardware-based ones. For example, in hardware I would dynamically modify the sampling rate. What about in software? How can I dynamically modify the sampling rate?

References:

Both figures were taken from:

R. E. Crochiere and L. R. Rabiner, Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983

• Yes, you need a sample-rate converter whose resampling factor changes with time. The most straightforward way to do this is to maintain a NCO that indicates "what sample from the input stream should I output next." That NCO has a fractional component that indicates the subsample offset that your sample rate converter needs to create for each output sample. You can then use whichever resampling implementation structure that you want in order to effect the appropriate offset. – Jason R Jun 26 '18 at 15:01

## 1 Answer

If the only reason for the buffer is so your algorithm has something to process, then the simplest way to implement this is to keep your current algorithm but use a shorter buffer. If the larger buffer was present for other reasons (i.e. data arrives in large chunks), then keep that larger buffer, but feed it into a shorter buffer that is given to your processing code. (It seems any algorithm able to recognize Doppler shift in a given snapshot must also be able to process that same snapshot.) In this way you can keep your current algorithm, and tailor the short buffer length as desired. I can't imagine how an algorithm specifically designed to do this per sample would be of benefit, unless it takes less CPU--which seems unlikely.