I think I've managed to produce the correct range-velocity map. I'm struggling with analytically calculating the range which I expect to see on the range-velocity map. Could someone please give me a direction for how to calculate this? I have one target which moves away from the radar in a constant velocity.


I'm trying to implement the pulsed-doppler radar algorithm. I've went through most of the steps and generated range-doppler map where the y axis is the pulse number and the x axis is the range. I'm trying to convert the map into range-velocity map by using the relation $$ v = (c \cdot f_d)/(2 \cdot f_c) $$ where $c$ is the speed of light, $f_d$ is Doppler frequency and $f_c$ is the carrier wave frequency.

What I did was multiply the frequency axis in the range [-fs/2,fs/2] by c/(2*fc) where fs is the Nyquist frequency. The number of points which I divided the frequency axis into are fs/(number-of-samples). But when I use imagesc to plot the range-velocity map, it looks like the velocity is zero. I believe my problem is when generating the velocity axis, since when plotting all the other stages the results look good. what could be the problem?

Thank you very much once again!

  • $\begingroup$ What is $f_s$? If it's not your PRF, then you will scale the Doppler axis incorrectly. $\endgroup$
    – Envidia
    Jan 20, 2022 at 22:45
  • $\begingroup$ Are you able to share more or your Matlab (I assume)? It's possible you may have a problem that is unrelated to the terms in your question. $\endgroup$ Jan 21, 2022 at 0:04
  • $\begingroup$ @Envidia could you please explain to me why does it need to be the prf? I thought I'm using the nyquist frequency to slice the frequency axis I tried changing it, but it didn't help, perhaps I have more mistakes elsewhere. $\endgroup$ Jan 22, 2022 at 12:33
  • $\begingroup$ @E.Ginzburg Posted an answer that hopefully addresses your issue. $\endgroup$
    – Envidia
    Jan 23, 2022 at 3:21
  • $\begingroup$ @Envidia thank you! it explained a-lot. could you please explain to me - when I plot the transmitted pulse train and the received one, the transmitted one looks exactly like a single pulse only duplicated, but the received one looks a bit different- the height of the main lobe at individual pulse changes. I've excepted to receive exactly the transmitted pulse train only delayed, but from the code, I have this multiplication in the exponential term which depend on tau when tau changes with time, so perhaps the plot is correct, and I've misunderstood it? I appreciate your help, thank you $\endgroup$ Jan 23, 2022 at 7:15

3 Answers 3


In a range-Doppler map (RDM), you actually have two sample rates that define the two dimensions of the matrix:

  1. Fast-time dimension. This is usually established by the ADC to sample the pulse return. This tends to be the fastest of the two sample rates, hence the name. This is what is typically given by the symbol $f_s$ and establishes the range dimension of the RDM.
  2. Slow-time dimension. The second dimension is made up of the number of pulses collected. The fastest you can hope to gather these is at the $PRI$, and thus the sample rate across this dimension is the $PRF$.

So now the RDM captures two Nyquist bands:

  1. $[-f_s/2, fs/2)$ for the fast-time dimension
  2. $[-PRF/2, PRF/2)$ for the slow-time dimension

You can see directly from (2) that $\pm PRF/2$ is the maximum Doppler frequency you can measure unambiguously. You can apply the frequency-Doppler conversion formula to get the velocity limits that you can measure.

$$v_{max} = \pm\frac{f_{d_{max}}\lambda}{2} = \pm\frac{PRF\lambda}{4}$$


We're going to start with some already-simulated target returns from a moving target. The pertinent parameters are

  • Target range of 800 m and velocity of 250 m/s
  • Wavelength $\lambda$ of 0.03 m
  • PRF of 50 kHz
  • Collected 500 fast-time samples and 256 slow-time samples (which is the number of pulses)

We then form the 500x256 RDM:

enter image description here

The mapping still has to be done in order to determine the target's range and velocity. Let's assume we've already done the range mapping, but now we need to do velocity.

Let's check that this system can unambiguously measure this velocity at the given PRF:

$$v_{max} = \pm\frac{PRF \lambda}{4} = \pm\frac{(50 \space kHz)0.03}{4}$$ $$v_{max} = \pm 375 \space m/s$$

It can, so now lets map the Doppler axis to velocity. Assuming that we did a N-point DFT in the slow-time dimension, the frequency bin size is now:

$$\Delta f = \frac{PRF}{N}$$

And using the Doppler-velocity mapping we get the velocity bin size:

$$\Delta v = \Delta f\frac{\lambda}{4}$$

We now have the bin size itself, and with a little work you can use it to transform the slow-time dimension from $[-PRF/2, PRF/2)$ to $[-v_{max}/2, v_{max}/2)$:

enter image description here


You should be careful in defining the range axis with a negative frequency. This type of range mapping applies only to a very specific type of system that uses stretch-LFM processing, which I doubt you're doing.

For more traditional radars, it makes sense that you can't have a negative range so introducing $-f_s$ is not appropriate. Now, this was my fault since I did state that the fast-time dimension captures the band $[-f_s/2, fs/2)$. This is technically true in the mathematical sense, but is not used directly as shown to define the range axis. The velocity axis defined by $[-PRF/2, PRF/2)$ is still valid.

The calculations that you have won't work. Instead try something like this:

rangeAxis = (1:numRangeBins)*(c/(2*fs)) % Range bin size is c/(2*fs)
dopplerAxis = (-numDopplerBins/2:numDopplerBins/2 - 1).*PRF/numDopplerBins;
velocityAxis = dopplerAxis*lambda/2;

With the right values this should yield the correct range and velocity axes you're looking for.

  • $\begingroup$ Than you very much for your detailed reply. just to make sure I understood correctly: assuming I have a chirp signal which is defined by two parameters: the pulse width in time domain pw, and its bandwidth B. given the pri the prf is prf=1/pri. if I define nyquist frequency to be fs = 10*B so the fast time axis will be defined as follows: fast_time_axis = (-fs/2:fs/N:fs/2) where N=fs*L when L is the full pulse train length and the slow time axis will be defined: slow_time_axis = (-prf/2:prf/M:prf/2) where M=prf*L did I get it right? $\endgroup$ Jan 23, 2022 at 6:56
  • $\begingroup$ by this analysis, I understand that the dimensions of my sample matrices is incorrect. The received demodulated signal needs to be arranged in N1xM1 matrix where N1=L/pri the number of pri's in the full transmitted pulse train and M1=length(fast_time_axis/N1) and the transmitted signal before modulation needs to be arranged in N2xM2 matrix where N2=N1=L/pri the number of pri's in the full transmitted pulse train and M2=length(slow_time_axis/N2) am I correct? I'm trying to implement it now, although I'm not getting good results, have I misunderstood something? Thank you! $\endgroup$ Jan 23, 2022 at 11:24
  • $\begingroup$ This is a more complete answer than mine and address the additional information added to the question. $\endgroup$ Jan 23, 2022 at 11:36
  • $\begingroup$ @E.Ginzburg Posted an update with additional explanations and some code to try. $\endgroup$
    – Envidia
    Jan 25, 2022 at 2:08
  • $\begingroup$ @Envidia Thank you so much for your help, now the range axis looks reasonable. The velocity axis still looks weird (velocity of 0). I'm not sure if I defined the number of doppler bins appropriately: numDopplerBins = L/pri where L is the whole length of the transmitted signal and pri = 1/prf. one more place I can think of where the problem can be is the way I've created the sample matrices, perhaps I have a problem with their indexing. Is there any chance you could take a look at it? I've added the code to the question itself. Thank you very much one again $\endgroup$ Jan 25, 2022 at 16:08

First some background.

In radar the relationship between range rate, $v$ and Doppler frequency offset, $\Delta f$ is given by: $$v = -\frac{c}{2} \frac{\Delta f}{f_c}$$ where $c$ is the speed of light and $f_c$ is the carrier frequency. There may be a sign difference depending on conventions for positive range rate.

This expression is equivalent, to within a factor of 2 (see below) to that in Hunter Akins' answer.

Starting with: $$f_d = \frac{c+v_r}{c+v_s}f_c$$ where $f_d$ is the Doppler frequency, $v_r$ is the receiver velocity, and $v_s$ is the source velocity.

Assume that $v_s = 0$ and all of the motion is on the part of the receiver: $$f_d = \frac{c+v_r}{c}f_c $$

Solving for $v_r$: $$v_r = c \frac{f_d - f_c}{f_c}$$

The Doppler frequency offset is equal to the amount the Doppler frequency has been shifted from the carrier $\Delta f = f_c - f_d $: $$v_r = -c \frac{\Delta f}{f_c}$$

And, since in radar the signal is reflected from the target, the Doppler shift is twice the case for a one way path so the effective velocity for the receiver is only half that it would be for a one way signal: $$v = -\frac{c}{2} \frac{\Delta f}{f_c}$$

If you original frequency axis is Doppler space [-fs/2,fs/2] (fs being the sample rate, typically in these sorts of plots equal to the pulse repetition interval) then you can convert the axis labeling to the equivalent velocity by multiplying by -(c/(2 * carrier_freq)).

This corresponds to what you have stated you are doing. I suspect there is some other issue with you program. If you can post more details we can provide a better answer.

  • $\begingroup$ Thank you very much for your reply. I've edited the post and I'll be grateful for some help here. $\endgroup$ Jan 22, 2022 at 12:22

It seems like your formula is wrong. For example, if $f_{d} = f_{c}$, then $v=c/2$. The formula I'm familiar with is $$ f_{d} = \frac{c + v_{r}}{c + v_{s}} f_{c} , $$ where $v_{r}$ is the velocity of the receiver and $v_{s}$ is the velocity of the source (one dimensional). You need to estimate the frequency of max power for each received pulse. This frequency is $f_{d}$. Then probably assume $v_{s} = 0$ and use the fact that you now $f_{c}$ (since presumably you sent out the pulse). Then you can solve for $v_{r}$ for each received pulse.

  • $\begingroup$ The formula is not "wrong" per se. The formula that the OP has is the approximation used in virtually all radar systems I have ever worked on. For the frequencies used in practical radar systems, the approximation is more than accurate and using this version is overkill. The OP's issue is likely with how the sampling is being defined. $\endgroup$
    – Envidia
    Jan 20, 2022 at 22:47
  • $\begingroup$ @Envidia I don't even this there's really any approximation. If you solve this equation for vr and recognize the fd in the OP's question is the Doppler offset from carrier, then all that misusing is a factor of two due to reflection. I will write an answer when I get a couple of minutes. I'll need to make some assumptions about the OP's script as well. $\endgroup$ Jan 21, 2022 at 0:02
  • $\begingroup$ @GrapefruitIsAwesome What I'm saying is that they're both correct, but the answer shouldn't say that the OP's equation is wrong, because it definitely isn't. Glad you have the time to write an answer! And you're spot on, I think OP may have an issue more with his MATLAB script than with the theory that was applied. $\endgroup$
    – Envidia
    Jan 21, 2022 at 0:08
  • $\begingroup$ @Envidia I concur with your assessment $\endgroup$ Jan 21, 2022 at 0:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.