# Signal processing of an IVQ-3005 Radar Module

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? 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++) {

fft(echos[k],M);

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;
i=0;
for(j = 1 ; j < FFT_LENGTH ; j++) {
if(mag[j] > tempflt) {
tempflt = mag[j];
i=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)));
}
}
}

• 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. – Dave Tweed May 21 '18 at 12:35
• @DaveTweed I have added a block diagram – Ahmed Saleh May 21 '18 at 13:56
• 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. – Dave Tweed May 21 '18 at 14:05
• @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 – Ahmed Saleh May 21 '18 at 14:23