Voy a usar ese módulo para detectar rango, velocidad y ángulo, para ese radar. enlace
He leído muchas técnicas de radar y usaré el modo FMCW, y la señal modulada será un diente de sierra (chirridos).
Tengo 4 señales I1, Q1, I2, Q2.
Necesito confirmar mi comprensión de los algoritmos de procesamiento de señales
Primeros pasos.
- I1, Q1, I2, Q2 a ADC
- Agregar I1 + I2, Q2 + Q2
- Multiplica el resultado de 2 por conjuro de 2
- Aplique FFT en las filas de la señal 2D I / Q para obtener el rango
- Aplique fft en las columnas de la señal 2D I / Q para obtener la velocidad
- Aplique un tercer FFT pero no sabe en qué bloque?
- Encuentre los picos de cada bloque FFT para obtener el Rango, Velocidad, Rango.
¿Alguien me diría si los pasos son correctos o no? ¿Alguien explicaría qué consideraciones debo tener en cuenta?
De acuerdo con la respuesta, escribí un algoritmo básico, espero que sea correcto
/* 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[0];
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)));
}
}
}