Le radar à ondes continues modulées en fréquence (FMCW) à ondes millimétriques fonctionne en émettant et en détectant des ondes électromagnétiques de radiofréquence (RF). En raison de ses propriétés uniques, cette technologie offre plusieurs avantages pour les systèmes et applications interactifs. Il fonctionne indépendamment des conditions d'éclairage, du bruit ambiant ou des conditions météorologiques, offrant des capacités de détection rapides et précises.
De plus, il peut pénétrer dans divers matériaux, ce qui le rend idéal pour s’intégrer dans divers appareils et environnements. Le capteur peut être construit comme une petite unité semi-conductrice à semi-conducteurs à des fréquences RF d’ondes millimétriques – essentiellement une puce radar. Cette puce est compacte, consomme peu d’énergie, ne comporte aucune pièce mobile et peut être produite de manière rentable en grande quantité.
Le radar mmWave FMCW peut être utilisé dans de nombreux appareils, tels que :
De plus, les radars mmWave FMCW peuvent être utilisés avec des modèles d'apprentissage profond pour résoudre diverses tâches :
Notez que toutes ces applications peuvent être résolues sans caméras, avec un dispositif à très faible consommation d'énergie et des NN relativement petits.
Dans les prochaines années, de nombreux appareils électroniques grand public commenceront probablement à utiliser activement ce type de capteur avec des algorithmes d’apprentissage profond pour résoudre les problèmes mentionnés ci-dessus. De plus, en 2021, la norme Wi-Fi IEEE 802.11 a été approuvée. Cette norme utilise les mêmes fréquences radio et principes de fonctionnement, permettant aux routeurs Wi-Fi d'accéder aux mêmes fonctionnalités que les radars mmWave FMCW.
Cet article et les deux suivants couvriront :
Cet article explique comment un signal radar mmWave FMCW est traité. Le code utilisé pour générer la plupart des figures est accessible dans Google Colab ou en fin d'article.
Le signal du radar mmWave FMCW permet de mesurer la distance à tous les objets dans son champ de vision, leur vitesse et leur position angulaire (azimut et élévation). Le signal du radar peut être traité sous la forme d'images de très petite résolution (généralement ~ 32x32 - 256x64 pixels) avec une portée/vitesse/angle le long des axes de l'image comme dans l'image ci-dessous - portée-doppler (portée-vitesse) - images angulaires.
Le capteur se compose de plusieurs (1 ou plusieurs) antennes d'émission omnidirectionnelles et de plusieurs (1 ou plus) antennes de réception. Les antennes d'émission et de réception fonctionnent simultanément. Le champ de vision du radar est généralement d'environ 120° et la distance maximale peut aller de quelques centimètres à plusieurs dizaines de mètres.
Nous devons généralement émettre un signal au temps t1 et recevoir sa réflexion au temps t2 pour mesurer la distance. La distance peut alors être calculée comme d=(t2-t1)*c , où c est la vitesse de la lumière car l'onde radio se déplace à la vitesse de la lumière.
L'antenne radar à ondes millimétriques FMCW est omnidirectionnelle et nécessite un moyen de mesurer les temps t1 et t2 pour tous les objets dans le champ de vision du radar. Un signal FMCW (Frequency Modulated Continu Wave) est utilisé à cet effet. Le composant principal du radar est un gazouillis. Chirp est un signal radio sinusoïdal dont la fréquence augmente linéairement avec le temps, comme le montre la figure ci-dessous.
Un chirp est caractérisé par les fréquences de début (f_start) et de fin (f_end), la bande passante ( B=f_end-f_start ) et la durée du chirp (Tc). Le temps de chirp varie de quelques microsecondes à quelques millisecondes. La fréquence de démarrage est généralement d'environ 30, 60 ou 77 GHz, selon l'application radar. La bande passante Chirp varie de ~0,5 GHz à plusieurs GHz.
Les antennes de réception (Rx) et d'émission (Tx) fonctionnent simultanément. Le synthétiseur génère en continu un gazouillis qui est envoyé à l'antenne émettrice Tx et au mélangeur. Dans le même temps, le signal reçu par l’antenne Rx est également transmis au mélangeur. Le mélangeur produit la différence entre le signal envoyé à Tx et le signal reçu par Rx.
La fréquence du signal chirp change dans le temps selon une loi linéaire connue (Pente) ce qui signifie que s'il y a un seul objet devant le radar, cet objet générera un signal x_out avec un
Nous pouvons mesurer la distance à tous les objets dans le champ de vision du radar simplement en analysant le signal du mélangeur sans mesurer le temps : d=(F_obj*c)/(2*S). Dans la littérature, le signal x_out est appelé « signal IF » (signal à fréquence intermédiaire).
Un avantage supplémentaire de la conception du capteur : la fréquence porteuse du signal est généralement d'environ 30 GHz ou 60 GHz. Si nous avions besoin de numériser un signal de telles fréquences, nous aurions des exigences très élevées pour l'ADC. Toute analyse de signal est effectuée sur un signal IF dont la fréquence est généralement d'environ quelques MHz, ce qui assouplit considérablement les exigences de l'ADC.
Comme indiqué ci-dessus, pour trouver la distance à tous les objets dans le FoV du radar, nous devons décomposer le signal x_out en ses composantes de fréquence. La transformée de Fourier est un algorithme qui convertit un signal dans le domaine temporel en domaine fréquentiel.
La transformée de Fourier du signal IF révélera plusieurs tonalités, et la fréquence de chaque tonalité est proportionnelle à la portée de chaque objet depuis le radar - dans la littérature, cette transformée de Fourier est également appelée transformée de Fourier à temps rapide ou transformée de Fourier à distance.
Problème : s'il y a plusieurs objets à la même distance, nous avons des problèmes car la distance FFT ne nous permettra pas de différencier deux objets. Mais si les objets se déplacent à des vitesses différentes, ils peuvent être séparés par la vitesse.
Les gazouillis sont généralement répétés immédiatement les uns après les autres ou avec un léger retard. Dans la littérature, le temps entre le début de deux gazouillis est appelé Chirp Repetition Time. Plusieurs gazouillis (généralement 16 à 256) sont empilés pour former une trame radar. Une durée d'image = Temps de répétition des gazouillis * Nombre de gazouillis. En règle générale, la durée d'une image varie de dizaines de microsecondes à des dizaines de millisecondes.
Pourquoi empiler plusieurs gazouillis ensemble ? La phase du signal IF est très sensible aux petites et grandes vibrations des objets dans le champ de vision du radar - elle peut même être utilisée pour mesurer la fréquence de vibration d'un moteur ou le battement de coeur d'une personne ou d'un animal.
Il est possible de mesurer la vitesse d'un objet à une distance particulière en analysant les changements de phase au fil du temps (changement de phase de chirp à chirp) :
L'algorithme de mesure de la vitesse avec le radar mmWave FMCW est très simple :
Appliquez la transformation de Fourier à chaque gazouillis dans une image. Chaque fréquence correspond à une distance spécifique à l'objet. Parfois, ces fréquences sont appelées plages de plage puisque chaque fréquence correspond à une plage spécifique.
si le signal IF d'origine est représenté avec des valeurs non complexes, la seconde moitié des fréquences (intervalles de plage) doit être écartée selon le théorème de Nyquist-Shannon
Appliquez une autre transformée de Fourier sur chaque plage - décomposez les changements de phase au fil du temps en fréquences où la fréquence correspondra à des valeurs Doppler (vitesse) spécifiques.
Problème : s'il y a deux objets à la même distance se déplaçant à la même vitesse, ils produiront un seul pic dans l'image distance-doppler. Mais si nous disposons de plusieurs antennes de réception Rx, il peut être possible de séparer les objets par leur position angulaire
Comme expliqué précédemment, un petit changement de distance entraînera un changement de phase. Le changement de phase entre des gazouillis séparés dans le temps est utilisé pour calculer la vitesse des objets. Le changement de phase entre des gazouillis séparés dans l’espace (gazouillis reçus par différentes antennes Rx) peut être utilisé pour l’estimation de l’angle.
L'algorithme d'estimation d'angle avec plusieurs antennes de réception Rx est très simple :
Transmettez une trame de gazouillis avec une antenne Tx.
Calculez la transformée de Fourier 2D (image range-doppler) des images reçues par toutes les antennes Rx. Les images Range-Doppler de chaque antenne Rx auront des pics au même endroit et au même Doppler mais avec une phase différente (la différence de phase correspond à la distance entre les antennes Rx).
Utilisez la différence de phase (ω) pour estimer l'angle d'arrivée des objets - appliquez la troisième transformée de Fourier sur toutes les antennes Rx.
import os import numpy as np import scipy import scipy.io as spio import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import math
Téléchargez un exemple de données radar mmWave FMCW du projet RAMP-CNN .
!pip uninstall gdown -y && pip install gdown !gdown -V !gdown --folder https://drive.google.com/drive/folders/1Eg-8R45RPvifNf2VYI_MG-LRjdkLOHTf -O /content/sample_slice_data
Chargez les données du fichier.
file_name = '/content/sample_slice_data/2019_04_30/2019_04_30_pbms002/2019_04_30_pbms002_000000.mat' mat = spio.loadmat(file_name, squeeze_me=True) adc_data = np.asarray(mat["adc_data"]) print(adc_data.shape) # ADC samples, vRx, chirps - (128, 8, 255) print(adc_data.dtype) # complex128
Fonctions de visualisation.
def show_one_chirp(one_chirp_data, y_label='amplitude', x_label='One chirp'): plt.figure(figsize=[5, 4]) plt.plot(one_chirp_data) plt.xlabel(x_label) plt.ylabel(y_label) plt.show() def show_image(image_data, image_name, x_label='', y_label=''): plt.imshow(image_data) plt.title(image_name) plt.xlabel(x_label) plt.ylabel(y_label) plt.show() def show_3_images(img_data1, img_data2, img_data3): plt.figure(figsize=(10, 8)) plt.subplot(2, 2, 1) plt.imshow(img_data1[0], aspect=1.44) plt.title(img_data1[1]) plt.xlabel(img_data1[2]) plt.ylabel(img_data1[3]) plt.subplot(2, 2, 2) plt.imshow(img_data2[0], aspect=1.0) plt.title(img_data2[1]) plt.xlabel(img_data2[2]) plt.ylabel(img_data2[3]) plt.subplot(2, 2, 3) plt.imshow(img_data3[0], aspect=1.0) plt.title(img_data3[1]) plt.xlabel(img_data3[2]) plt.ylabel(img_data3[3]) plt.show()
Afficher les données ADC d'un gazouillis.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Afficher un gazouillis après la portée fft.
chirp_fft = np.fft.fft(adc_data[:,0,0]) show_one_chirp(np.absolute(chirp_fft), x_label='IF signal amplitude (range)', y_label='Amplitude')
Afficher l'image radar dans les domaines temporel et fréquentiel.
# show all chirps show_one_chirp(np.absolute(adc_data[:,0,:]), x_label='IF signal of frame chirps') show_image(np.absolute(np.fft.fft(adc_data[:,:,:], axis=0).mean(1)), 'range FFT', x_label='Chirps', y_label='Range')
Obtenez la portée, le Doppler et l'angle à partir des données radar.
def get_range_doppler_angle(adc_data_in): # adc_data_in - ADC samples, vRx, chirps samples_in = adc_data_in.shape[0] range_window = np.hamming(samples_in).reshape(-1,1,1) range_data = np.fft.fft(adc_data_in*range_window, samples_in, axis=0) # chirps_in = range_data.shape[2] doppler_window = np.hamming(chirps_in).reshape(1,1,-1) range_doppler_data = np.fft.fftshift(np.fft.fft(range_data*doppler_window, chirps_in, axis=2), axes=2) # # samples, vRx, chirps angle_window = np.hamming(range_doppler_data.shape[1]).reshape(1,-1,1) angle_bins=180 rda_data = np.fft.fftshift(np.fft.fft(range_doppler_data*angle_window, angle_bins, axis=1), axes=1) return range_data, range_doppler_data, rda_data
range_image, range_doppler_image, rda_cube = get_range_doppler_angle(adc_data)
show_3_images([np.absolute(range_image.mean(axis=1)), 'range doppler', 'Doppler', 'Range'], [np.absolute(rda_cube.mean(axis=2)), 'range angle', 'Angle', 'Range'], [np.absolute(rda_cube.mean(axis=0)), 'angle doppler', 'Doppler', 'Angle'] )
Les deux prochains articles porteront sur :