El radar de onda continua de frecuencia modulada de onda milimétrica (FMCW) funciona emitiendo y detectando ondas electromagnéticas de radiofrecuencia (RF). Debido a sus propiedades únicas, esta tecnología ofrece varias ventajas para sistemas y aplicaciones interactivos. Funciona independientemente de las condiciones de iluminación, el ruido ambiental o el clima, y ofrece capacidades de detección rápidas y precisas.
Además, puede penetrar diversos materiales, lo que lo hace ideal para integrarse en diversos dispositivos y entornos. El sensor puede construirse como una pequeña unidad semiconductora de estado sólido en frecuencias de RF de ondas milimétricas; esencialmente, un chip de radar. Este chip es compacto, consume poca energía, no tiene piezas móviles y puede producirse de forma rentable en grandes cantidades.
El radar mmWave FMCW se puede utilizar en muchos dispositivos, como:
Además, los radares mmWave FMCW se pueden utilizar junto con modelos de aprendizaje profundo para resolver diversas tareas:
Tenga en cuenta que todas estas aplicaciones se pueden resolver sin cámaras, con un dispositivo de muy bajo consumo de energía y NN relativamente pequeños.
En los próximos años, es probable que muchos productos electrónicos de consumo comiencen a utilizar activamente este tipo de sensor con algoritmos de aprendizaje profundo para resolver los problemas mencionados anteriormente. Además, en 2021 se aprobó el estándar Wi-Fi IEEE 802.11а. Este estándar utiliza las mismas frecuencias de radio y principios operativos, lo que permite a los enrutadores Wi-Fi acceder a la misma funcionalidad que los radares mmWave FMCW.
Este y los dos siguientes artículos cubrirán:
Este artículo explica cómo se procesa una señal de radar mmWave FMCW. Se puede acceder al código utilizado para generar la mayoría de las cifras en Google Colab o al final del artículo.
La señal del radar mmWave FMCW permite medir la distancia a todos los objetos en su campo de visión, su velocidad y su posición angular (acimut y elevación). La señal del radar se puede procesar en forma de imágenes de resolución muy pequeña (generalmente ~32x32 - 256x64 píxeles) con rango/velocidad/ángulo a lo largo de los ejes de la imagen como en la siguiente imagen: rango-doppler (rango-velocidad) imágenes en ángulo.
El sensor consta de varias (1 o más) antenas transmisoras omnidireccionales y varias (1 o más) antenas receptoras. Las antenas transmisora y receptora funcionan simultáneamente. El campo de visión del radar suele ser de ~120° y la distancia máxima puede ser desde un par de centímetros hasta decenas de metros.
Normalmente necesitamos emitir una señal en el momento t1 y recibir su reflejo en el momento t2 para medir la distancia. Luego, la distancia se puede calcular como d=(t2-t1)*c , donde c es la velocidad de la luz porque la onda de radio viaja a la velocidad de la luz.
La antena de radar de onda mm FMCW es omnidireccional y necesita una forma de medir los tiempos t1 y t2 para todos los objetos en el campo de visión del radar. Para ello se utiliza una señal FMCW (onda continua de frecuencia modulada). El componente principal del radar es un chirrido. Chirp es una señal de radio sinusoide cuya frecuencia aumenta linealmente con el tiempo, como se muestra en la siguiente figura.
Un chirrido se caracteriza por las frecuencias de inicio (f_start) y final (f_end), el ancho de banda ( B=f_end-f_start ) y el tiempo de chirrido (Tc). El tiempo del chirrido varía desde unos pocos microsegundos hasta unos pocos milisegundos. La frecuencia de inicio suele ser ~30, 60 o 77 GHz, según la aplicación del radar. El ancho de banda de Chirp oscila entre ~0,5 GHz y varios GHz.
Las antenas receptora (Rx) y transmisora (Tx) funcionan simultáneamente. El sintetizador genera continuamente un chirrido que se envía a la antena transmisora Tx y al mezclador. Al mismo tiempo, la señal recibida por la antena Rx también se envía al mezclador. El mezclador genera la diferencia entre la señal enviada a Tx y la señal recibida por Rx.
La frecuencia de la señal chirrido cambia en el tiempo según una ley lineal conocida (Pendiente), lo que significa que si hay un solo objeto delante del radar, este objeto generará una señal x_out con una
Podemos medir la distancia a todos los objetos en el campo de visión del radar simplemente analizando la señal del mezclador sin medir el tiempo: d=(F_obj*c)/(2*S). En la literatura, la señal x_out se denomina 'señal IF' (señal de frecuencia intermedia).
Una ventaja adicional del diseño del sensor: la frecuencia portadora de la señal suele rondar los 30GHz o 60Ghz. Si necesitáramos digitalizar una señal de tales frecuencias, tendríamos requisitos muy altos para el ADC. Todo el análisis de la señal se realiza en señal IF cuya frecuencia suele rondar un par de MHz, lo que relaja significativamente los requisitos para el ADC.
Como se mostró arriba, para encontrar la distancia a todos los objetos en el FoV del radar, necesitamos descomponer la señal x_out en sus componentes de frecuencia. La Transformada de Fourier es un algoritmo que convierte una señal en el dominio del tiempo al dominio de la frecuencia.
La transformada de Fourier de la señal IF revelará múltiples tonos, y la frecuencia de cada tono es proporcional al alcance de cada objeto desde el radar; en la literatura, esta transformada de Fourier también se denomina transformada de Fourier de tiempo rápido o transformada de Fourier de rango.
Problema: si hay varios objetos a la misma distancia estamos en problemas porque el rango FFT no nos permitirá diferenciar entre dos objetos. Pero si los objetos se mueven a diferentes velocidades, pueden separarse según la velocidad.
Los chirridos suelen repetirse inmediatamente uno después del otro o con un ligero retraso. En la literatura, el tiempo entre el comienzo de dos chirridos se llama tiempo de repetición de chirridos. Varios chirridos (generalmente de 16 a 256) se apilan para formar un marco de radar. Un tiempo de fotograma = Tiempo de repetición de chirridos * Número de chirridos. Normalmente, el tiempo de 1 fotograma es de decenas de microsegundos a decenas de milisegundos.
¿Por qué apilar varios chirridos juntos? La fase de la señal IF es muy sensible a las vibraciones pequeñas y grandes de los objetos en el campo de visión del radar; incluso se puede utilizar para medir la frecuencia de vibración de un motor o los latidos del corazón de una persona o un animal.
Es posible medir la velocidad de un objeto en un rango particular analizando los cambios de fase a lo largo del tiempo (cambio de fase de chirrido a chirrido):
El algoritmo para medir la velocidad con el radar mmWave FMCW es muy sencillo:
Aplique la Transformada de Fourier a cada chirrido en un cuadro. Cada frecuencia corresponde a una distancia específica al objeto. A veces, estas frecuencias se denominan intervalos de rango, ya que cada frecuencia corresponde a un rango específico.
Si la señal IF original se representa con valores no complejos, la segunda mitad de las frecuencias (contenedores de rango) debe descartarse según el teorema de Nyquist-Shannon.
Aplique otra transformada de Fourier en cada rango de rango: descomponga los cambios de fase a lo largo del tiempo en frecuencias donde la frecuencia corresponderá a valores Doppler (velocidad) específicos
Problema: si hay dos objetos a la misma distancia moviéndose a la misma velocidad, producirán un único pico en la imagen de rango Doppler. Pero si tenemos varias antenas receptoras Rx, es posible que se puedan separar objetos por su posición angular.
Como se explicó anteriormente, un pequeño cambio en la distancia resultará en un cambio de fase. El cambio de fase entre chirridos separados en el tiempo se utiliza para calcular la velocidad de los objetos. El cambio de fase entre chirridos separados en el espacio (chirridos recibidos por diferentes antenas Rx) se puede utilizar para estimar el ángulo.
El algoritmo de estimación de ángulos con múltiples antenas receptoras Rx es muy simple:
Transmite un cuadro de chirridos con una antena Tx.
Calcule la transformada de Fourier 2D (imagen de rango Doppler) de los fotogramas recibidos por todas las antenas Rx. Las imágenes Doppler de rango de cada antena Rx tendrán picos en la misma ubicación y Doppler pero con diferente fase (la diferencia de fase corresponde a la distancia entre las antenas Rx).
Utilice la diferencia de fase (ω) para estimar el ángulo de llegada de los objetos; aplique la tercera transformada de Fourier en todas las antenas 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
Descargue un ejemplo de datos de radar mmWave FMCW del proyecto 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
Cargue datos del archivo.
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
Funciones de visualización.
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()
Muestra los datos de un ADC de un chirrido.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Muestra un chirrido después del alcance 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')
Mostrar el cuadro de radar en los dominios de tiempo y frecuencia.
# 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')
Obtenga alcance, Doppler y ángulo a partir de datos de 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'] )
Los próximos dos artículos cubrirán: