Millimeterwellen-Frequenzmoduliertes Dauerstrichradar (FMCW) funktioniert durch Aussenden und Empfangen von elektromagnetischen Radiofrequenzwellen (RF). Aufgrund ihrer einzigartigen Eigenschaften bietet diese Technologie mehrere Vorteile für interaktive Systeme und Anwendungen. Sie arbeitet unabhängig von Lichtverhältnissen, Umgebungsgeräuschen oder Wetter und bietet schnelle und genaue Sensorfunktionen.
Darüber hinaus kann er verschiedene Materialien durchdringen, was ihn ideal für die Integration in verschiedene Geräte und Umgebungen macht. Der Sensor kann als kleine Festkörper-Halbleitereinheit mit Millimeterwellen-HF-Frequenzen konstruiert werden – im Wesentlichen ein Radarchip. Dieser Chip ist kompakt, verbraucht wenig Strom, hat keine beweglichen Teile und kann kostengünstig in großen Mengen hergestellt werden.
mmWave-FMCW-Radar kann in vielen Geräten verwendet werden, beispielsweise:
Darüber hinaus können mmWave-FMCW-Radare zusammen mit Deep-Learning-Modellen zur Lösung verschiedener Aufgaben eingesetzt werden:
Beachten Sie, dass alle diese Anwendungen ohne Kameras, mit einem Gerät mit sehr geringem Stromverbrauch und relativ kleinen NNs gelöst werden können.
In den nächsten Jahren werden viele Verbraucherelektronikgeräte diesen Sensortyp mit Deep-Learning-Algorithmen wahrscheinlich aktiv nutzen, um die oben genannten Probleme zu lösen. Darüber hinaus wurde 2021 der Wi-Fi-Standard IEEE 802.11 verabschiedet. Dieser Standard verwendet dieselben Funkfrequenzen und Betriebsprinzipien, sodass Wi-Fi-Router auf dieselben Funktionen zugreifen können wie mmWave-FMCW-Radare.
In diesem und den nächsten beiden Artikeln geht es um:
In diesem Artikel wird erläutert, wie ein mmWave-FMCW-Radarsignal verarbeitet wird. Der Code, der zur Generierung der meisten Abbildungen verwendet wurde, ist in Google Colab oder am Ende des Artikels verfügbar.
Das Signal des mmWave-FMCW-Radars ermöglicht die Messung der Entfernung zu allen Objekten in seinem Sichtfeld, ihrer Geschwindigkeit und Winkelposition (Azimut und Höhe). Das Signal des Radars kann in Form von Bildern mit sehr geringer Auflösung (normalerweise ~32x32 - 256x64 Pixel) mit Entfernung/Geschwindigkeit/Winkel entlang der Bildachsen verarbeitet werden, wie im Bild unten - Entfernungs-Doppler- (Entfernungs-Geschwindigkeits-) Entfernungs-Winkel-Bilder.
Der Sensor besteht aus mehreren (1 oder mehr) omnidirektionalen Sendeantennen und mehreren (1 oder mehr) Empfangsantennen. Die Sende- und Empfangsantennen arbeiten gleichzeitig. Das Radarsichtfeld beträgt normalerweise ~120° und die maximale Entfernung kann von einigen Zentimetern bis zu mehreren zehn Metern betragen.
Normalerweise müssen wir zum Zeitpunkt t1 ein Signal aussenden und zum Zeitpunkt t2 dessen Reflexion empfangen, um die Distanz zu messen. Die Distanz kann dann als d=(t2-t1)*c berechnet werden, wobei c die Lichtgeschwindigkeit ist, da sich die Radiowelle mit Lichtgeschwindigkeit bewegt.
Die FMCW-Millimeterwellenradarantenne ist omnidirektional und benötigt eine Möglichkeit, die Zeiten t1 und t2 für alle Objekte im Radarsichtfeld zu messen. Hierzu wird ein FMCW-Signal (Frequency Modulated Continuous Wave) verwendet. Die Hauptkomponente des Radars ist ein Chirp. Chirp ist ein sinusförmiges Funksignal, dessen Frequenz mit der Zeit linear zunimmt, wie in der folgenden Abbildung dargestellt.
Ein Chirp ist durch Startfrequenzen (f_start) und Endfrequenzen (f_end), Bandbreite ( B=f_end-f_start ) und Chirp-Zeit (Tc) gekennzeichnet. Die Chirp-Zeit reicht von einigen Mikrosekunden bis zu einigen Millisekunden. Die Startfrequenz beträgt je nach Radaranwendung normalerweise ~30, 60 oder 77 GHz. Die Chirp-Bandbreite reicht von ~0,5 GHz bis zu mehreren GHz.
Die Empfangsantenne (Rx) und die Sendeantenne (Tx) arbeiten gleichzeitig. Der Synthesizer erzeugt kontinuierlich einen Chirp, der an die Sendeantenne Tx und den Mischer gesendet wird. Gleichzeitig wird das von der Rx-Antenne empfangene Signal auch an den Mischer weitergeleitet. Der Mischer gibt die Differenz zwischen dem an Tx gesendeten Signal und dem von Rx empfangenen Signal aus.
Die Frequenz des Chirp-Signals ändert sich mit der Zeit nach einem bekannten linearen Gesetz (Steigung), was bedeutet, dass, wenn sich ein einzelnes Objekt vor dem Radar befindet, dieses Objekt ein Signal x_out mit einem
Wir können die Entfernung zu allen Objekten im Radarsichtfeld einfach durch Analyse des Signals vom Mischer messen, ohne die Zeit zu messen: d=(F_obj*c)/(2*S). In der Literatur wird das x_out- Signal als „IF-Signal“ (Zwischenfrequenzsignal) bezeichnet.
Ein zusätzlicher Vorteil des Sensordesigns: Die Trägerfrequenz des Signals liegt normalerweise bei 30 GHz oder 60 GHz. Wenn wir ein Signal mit solchen Frequenzen digitalisieren müssten, hätten wir sehr hohe Anforderungen an den ADC. Die gesamte Signalanalyse erfolgt anhand eines IF-Signals, dessen Frequenz normalerweise bei einigen MHz liegt, was die Anforderungen an den ADC erheblich verringert.
Wie oben gezeigt, müssen wir das Signal x_out in seine Frequenzkomponenten zerlegen, um die Entfernung zu allen Objekten im Radar-Sichtfeld zu ermitteln. Die Fourier-Transformation ist ein Algorithmus, der ein Zeitbereichssignal in den Frequenzbereich umwandelt.
Die Fourier-Transformation des IF-Signals zeigt mehrere Töne und die Frequenz jedes Tons ist proportional zur Entfernung jedes Objekts vom Radar – in der Literatur wird diese Fourier-Transformation auch „Fast Time Fourier-Transformation“ oder „Reichweiten-Fourier-Transformation“ genannt.
Problem: Wenn sich mehrere Objekte in derselben Entfernung befinden, haben wir ein Problem, da wir mit der Entfernungs-FFT nicht zwischen zwei Objekten unterscheiden können. Wenn sich Objekte jedoch mit unterschiedlicher Geschwindigkeit bewegen, können sie anhand der Geschwindigkeit getrennt werden.
Chirps werden normalerweise unmittelbar hintereinander oder mit einer leichten Verzögerung wiederholt. In der Literatur wird die Zeit zwischen dem Beginn zweier Chirps als Chirp-Wiederholungszeit bezeichnet. Mehrere Chirps (normalerweise 16 bis 256) werden zu einem Radar-Frame zusammengefügt. Frame-Zeit = Chirp-Wiederholungszeit * Chirp-Anzahl. Normalerweise beträgt die Zeit eines Frames einige zehn Mikrosekunden bis einige zehn Millisekunden.
Warum mehrere Chirps übereinander stapeln? Die Phase des IF-Signals reagiert sehr empfindlich auf kleine und große Vibrationen von Objekten im Radarsichtfeld. Damit lässt sich sogar die Vibrationsfrequenz eines Motors oder der Herzschlag eines Menschen oder Tieres messen.
Es ist möglich, die Geschwindigkeit eines Objekts in einer bestimmten Entfernung zu messen, indem man Phasenänderungen über die Zeit analysiert (Phasenänderung von Chirp zu Chirp):
Der Algorithmus zur Geschwindigkeitsmessung mit mmWave FMCW Radar ist sehr einfach:
Wenden Sie die Fourier-Transformation auf jeden Chirp in einem Frame an. Jede Frequenz entspricht einer bestimmten Entfernung zum Objekt. Manchmal werden diese Frequenzen als Entfernungsbereiche bezeichnet, da jede Frequenz einem bestimmten Bereich entspricht.
Wenn das ursprüngliche ZF-Signal mit nicht komplexen Werten dargestellt wird, muss die zweite Hälfte der Frequenzen (Bereichsbereiche) gemäß dem Nyquist-Shannon-Theorem verworfen werden.
Wenden Sie eine weitere Fourier-Transformation auf jeden Bereichsabschnitt an - zerlegen Sie Phasenänderungen im Zeitverlauf in Frequenzen, wobei die Frequenz einem bestimmten Dopplerwert (Geschwindigkeitswert) entspricht.
Problem: Wenn sich zwei Objekte in gleicher Entfernung und mit gleicher Geschwindigkeit bewegen, erzeugen sie einen einzigen Peak im Entfernungs-Doppler-Bild. Wenn wir jedoch mehrere Empfangsantennen haben, ist es möglicherweise möglich, Objekte anhand ihrer Winkelposition zu trennen.
Wie bereits erläutert, führt eine kleine Änderung der Entfernung zu einer Phasenänderung. Phasenänderungen über zeitlich getrennte Chirps werden zur Berechnung der Objektgeschwindigkeit verwendet. Phasenänderungen über räumlich getrennte Chirps (Chirps, die von verschiedenen Rx-Antennen empfangen werden) können zur Winkelschätzung verwendet werden.
Der Algorithmus zur Winkelschätzung mit mehreren Empfangsantennen Rx ist sehr einfach:
Übertragen Sie mit einer Tx-Antenne einen Rahmen aus Chirps.
Berechnen Sie die 2D-Fourier-Transformation (Reichweiten-Doppler-Bild) der von allen Rx-Antennen empfangenen Frames. Die Reichweiten-Doppler-Bilder jeder Rx-Antenne weisen Spitzen an derselben Stelle und im selben Doppler auf, jedoch mit unterschiedlicher Phase (Phasendifferenz entspricht der Entfernung zwischen den Rx-Antennen).
Verwenden Sie die Phasendifferenz (ω), um den Ankunftswinkel von Objekten zu schätzen – wenden Sie die dritte Fourier-Transformation auf alle Rx-Antennen an.
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
Laden Sie ein Beispiel für mmWave-FMCW-Radardaten aus dem RAMP-CNN-Projekt herunter.
!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
Daten aus der Datei laden.
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
Visualisierungsfunktionen.
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()
Zeigt die ADC-Daten eines Chirps an.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Zeigen Sie nach der Bereichs-FFT einen Chirp an.
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')
Radarrahmen im Zeit- und Frequenzbereich anzeigen.
# 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')
Ermitteln Sie Reichweite, Doppler-Effekt und Winkel aus den Radardaten.
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'] )
Die nächsten beiden Artikel behandeln: