I'm going to use that module for detecting range, velocity and angle, for that radar. https://www.innosent.de/fileadmin/media/dokumente/datasheets/180222_Datenblatt_IVQ-3005.pdf

So I have read a lot of radar techniques and I'm going to use the mode FMCW, and the modulated signal will be a sawtooth (chirps).

I have 4 signals I1, Q1, I2, Q2.

I need to confirm my understanding of the signal processing algorithms

First steps.

  • I1, Q1, I2, Q2 to ADC
  • Add I1 + I2, Q2 + Q2
  • Multiply the result from 2 by conjguate of 2
  • Apply FFT on the rows of the 2D signal I/Q to get the range
  • Apply fft on the cols of the 2D signal I/Q to get the velocity
  • Apply a third FFT but don't know on which block?
  • Find peaks of each FFT block to get the Range, Velocity, Range.

Would someone tell me if the steps are correct or not? Would someone explain what considerations should I take care of?

enter image description here

According the answer, I wrote a basic algorithm, hope that's correct

    /* FFT length must be a power of 2 */
    #define FFT_LENGTH 16
    #define M 4            /* must be log2(FFT_LENGTH) */
    #define ECHO_SIZE 12

    void main()
      int            i,j,k;
      float          tempflt,rin,iin,p1,p2;
      static float   mag[FFT_LENGTH];
      static COMPLEX echos[ECHO_SIZE][FFT_LENGTH];
      static COMPLEX last_echo[ECHO_SIZE];

    /* read in the first echo */
      for(i = 0 ; i < ECHO_SIZE ; i++) {
         last_echo[i].real = getinput();
         last_echo[i].imag = getinput();

 // Read in the Second channgel
// Add first channel I/Q to second channel.

      for(;;) {
        for (j=0; j< FFT_LENGTH; j++){

    /* remove stationary targets by subtracting pairs (highpass filter) */
          for (k=0; k< ECHO_SIZE; k++){
            rin = getinput();
            iin = getinput();
            echos[k][j].real = rin - last_echo[k].real;
            echos[k][j].imag = iin - last_echo[k].imag;
            last_echo[k].real = rin;
            last_echo[k].imag = iin;
    /* do FFTs on each range sample */
        for (k=0; k< ECHO_SIZE; k++) {


          for(j = 0 ; j < FFT_LENGTH ; j++) {
            tempflt  = echos[k][j].real * echos[k][j].real;
            tempflt += echos[k][j].imag * echos[k][j].imag;
            mag[j] = tempflt;
    /* find the biggest magnitude spectral bin and output */
          tempflt = mag[0];
          for(j = 1 ; j < FFT_LENGTH ; j++) {
            if(mag[j] > tempflt) {
              tempflt = mag[j];
    /* interpolate the peak loacation */
          p1 = mag[i] - mag[i-1];
          p2 = mag[i] - mag[i+1];
          sendout((float)i + (p1-p2)/(2*(p1+p2+1e-30)));
  • \$\begingroup\$ Can you provide a block diagram that shows the signal processing chain that you're proposing? Your words aren't making a whole lot of sense. Be clear about exactly what function each block performs, and exactly what kind of data is being passed from block to block. \$\endgroup\$
    – Dave Tweed
    May 21, 2018 at 12:35
  • \$\begingroup\$ @DaveTweed I have added a block diagram \$\endgroup\$ May 21, 2018 at 13:56
  • \$\begingroup\$ You didn't have to show us the entire user interface of your drawing tool; just the finished drawing would have been sufficient -- and a lot easier to read. In any case, this is still lacking the details that I asked for. If you can't be any more precise about what you want (the functional specification), then guiding you toward an implementation (the design) is going to be pretty much impossible. \$\endgroup\$
    – Dave Tweed
    May 21, 2018 at 14:05
  • \$\begingroup\$ @DaveTweed I just want to know how would I use that module that outputs the I1/Q1, I2/Q2.. and I just thought about the block diagram above, and I'm not sure If my observation is correct or not. Just mentioning some points about how would I proceed are enough to me. Basically I want to get the Range, Velocity and Angle \$\endgroup\$ May 21, 2018 at 14:23

1 Answer 1


The output of an FMCW radar with linear ramp modulation (triangle or sawtooth waves) is a group of tones, one per target. The frequency of each tone gives the range of the corresponding target, and the rate at which the frequency changes gives the range rate (radial velocity). To make these measurements, you can simply add the two receiver channels together.

To measure AOA (angle of arrival), you need to compare the phase angles of the two receiver channels, as derived from the I and Q data. This processing has to be done for each target tone as well. Keep in mind that the phase "wraps" at angles greater than about ±27°, according to the datasheet.

One FFT on a block of data will help you identify target tones. But I don't know what you have in mind when you apply a second FFT.

  • \$\begingroup\$ Would you clarify more how can one FFT block of data will help to get the range and the velocity and the angle ? \$\endgroup\$ May 21, 2018 at 15:38
  • \$\begingroup\$ From all resources that I have read, we need three FFT blocks on the I/Q signals \$\endgroup\$ May 21, 2018 at 15:39
  • \$\begingroup\$ I have added a sample code that shows your algorithm, is it correct ? \$\endgroup\$ May 21, 2018 at 15:47
  • \$\begingroup\$ I can get the Phase of the First channel I/Q, and get the phase of the second channel I/Q, from tan(Q/I), how would I compare the phases of the two channels to get the AOA ? \$\endgroup\$ May 21, 2018 at 17:03
  • 1
    \$\begingroup\$ You need to do a lot more reading on this topic before you'll be in a position to ask the kind of narrowly focused questions that we can handle here. As it stands, including your follow-up comments, this question is far too broad. \$\endgroup\$
    – Dave Tweed
    May 21, 2018 at 17:54

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.