Radar sóng liên tục điều chế tần số sóng milimet (FMCW) hoạt động bằng cách phát ra và phát hiện sóng điện từ tần số vô tuyến (RF). Do đặc tính độc đáo của nó, công nghệ này mang lại một số lợi thế cho các hệ thống và ứng dụng tương tác. Nó hoạt động độc lập với điều kiện ánh sáng, tiếng ồn môi trường hoặc thời tiết, mang lại khả năng cảm biến nhanh chóng và chính xác.
Hơn nữa, nó có thể xuyên qua nhiều vật liệu khác nhau, khiến nó trở nên lý tưởng để tích hợp vào nhiều thiết bị và cài đặt khác nhau. Cảm biến có thể được chế tạo như một đơn vị bán dẫn trạng thái rắn nhỏ ở tần số RF sóng milimet - về cơ bản là một chip radar. Con chip này nhỏ gọn, tiêu thụ ít năng lượng, không có bộ phận chuyển động và có thể được sản xuất với số lượng lớn với chi phí hợp lý.
Radar mmWave FMCW có thể được sử dụng trong nhiều thiết bị, chẳng hạn như:
Hơn nữa, radar mmWave FMCW có thể được sử dụng cùng với các mô hình học sâu để giải quyết các nhiệm vụ khác nhau:
Lưu ý rằng tất cả các ứng dụng này có thể được giải quyết mà không cần camera, với thiết bị tiêu thụ điện năng rất thấp và NN tương đối nhỏ.
Trong vài năm tới, nhiều thiết bị điện tử tiêu dùng có thể sẽ bắt đầu tích cực sử dụng loại cảm biến này với các thuật toán học sâu để giải quyết các vấn đề nêu trên. Ngoài ra, vào năm 2021, tiêu chuẩn Wi-Fi IEEE 802.11ау đã được phê duyệt. Tiêu chuẩn này sử dụng cùng tần số vô tuyến và nguyên tắc hoạt động, cho phép bộ định tuyến Wi-Fi truy cập chức năng tương tự như radar mmWave FMCW.
Bài viết này và hai bài viết tiếp theo sẽ đề cập đến:
Bài viết này giải thích cách xử lý tín hiệu radar mmWave FMCW. Bạn có thể truy cập mã được sử dụng để tạo hầu hết các số liệu trong Google Colab hoặc ở cuối bài viết.
Tín hiệu từ radar mmWave FMCW cho phép đo khoảng cách đến tất cả các vật thể trong trường quan sát, tốc độ và vị trí góc của chúng (góc phương vị và độ cao). Tín hiệu từ radar có thể được xử lý thành dạng hình ảnh có độ phân giải rất nhỏ (thường là ~ 32x32 - 256x64 pixel) với phạm vi/tốc độ/góc dọc theo trục hình ảnh như trong hình bên dưới - phạm vi doppler phạm vi (tốc độ phạm vi)- hình ảnh góc cạnh.
Cảm biến bao gồm một số (1 hoặc nhiều) ăng-ten phát đa hướng và một số (1 hoặc nhiều) ăng-ten thu. Anten phát và thu hoạt động đồng thời. Trường quan sát của radar thường là ~ 120° và khoảng cách tối đa có thể từ vài cm đến hàng chục mét.
Chúng ta thường cần phát ra tín hiệu tại thời điểm t1 và nhận tín hiệu phản xạ tại thời điểm t2 để đo khoảng cách. Khoảng cách khi đó có thể được tính như d=(t2-t1)*c , trong đó c là tốc độ ánh sáng vì sóng vô tuyến truyền đi với tốc độ ánh sáng.
Ăng-ten radar sóng mm FMCW có tính đa hướng và cần có cách đo thời gian t1 và t2 cho tất cả các vật thể trong trường quan sát của radar. Tín hiệu FMCW (Sóng liên tục được điều chế tần số) được sử dụng cho việc này. Thành phần chính của radar là tiếng kêu. Chirp là tín hiệu vô tuyến hình sin có tần số tăng tuyến tính theo thời gian, như thể hiện trong hình bên dưới.
Tiếng kêu được đặc trưng bởi tần số bắt đầu (f_start) và kết thúc (f_end), Băng thông ( B=f_end-f_start ) và thời gian kêu (Tc). Thời gian chirp dao động từ vài micro giây đến vài mili giây. Tần số bắt đầu thường là ~30, 60 hoặc 77GHz, tùy thuộc vào ứng dụng radar. Băng thông Chirp dao động từ ~ 0,5GHz đến vài GHz.
Anten thu (Rx) và anten phát (Tx) hoạt động đồng thời. Bộ tổng hợp liên tục tạo ra một tiếng kêu được gửi đến ăng ten phát Tx và bộ trộn. Đồng thời, tín hiệu nhận được từ anten Rx cũng được đưa đến bộ trộn. Bộ trộn tạo ra sự khác biệt giữa tín hiệu được gửi tới Tx và tín hiệu mà Rx nhận được.
Tần số của tín hiệu chirp thay đổi theo thời gian theo một quy luật tuyến tính đã biết (Độ dốc), nghĩa là nếu có một vật thể ở phía trước radar, vật thể này sẽ tạo ra tín hiệu x_out với
Chúng ta có thể đo khoảng cách đến tất cả các vật thể trong trường quan sát của radar chỉ bằng cách phân tích tín hiệu từ bộ trộn mà không cần đo thời gian: d=(F_obj*c)/(2*S). Trong tài liệu, tín hiệu x_out được gọi là 'tín hiệu IF' (tín hiệu tần số trung gian).
Một điểm cộng nữa của thiết kế cảm biến: tần số sóng mang của tín hiệu thường vào khoảng 30GHz hoặc 60GHz. Nếu chúng ta cần số hóa tín hiệu có tần số như vậy, chúng ta sẽ có yêu cầu rất cao đối với ADC. Tất cả các phân tích tín hiệu được thực hiện trên tín hiệu IF có tần số thường ở khoảng vài MHz, điều này làm giảm đáng kể các yêu cầu đối với ADC.
Như đã trình bày ở trên, để tìm khoảng cách đến tất cả các vật thể trong radar foV, chúng ta cần phân tách tín hiệu x_out thành các thành phần tần số của nó. Biến đổi Fourier là một thuật toán chuyển đổi tín hiệu miền thời gian sang miền tần số.
Biến đổi Fourier của tín hiệu IF sẽ hiển thị nhiều âm và tần số của mỗi âm tỷ lệ thuận với phạm vi của từng đối tượng từ radar - trong tài liệu, biến đổi Fourier này còn được gọi là biến đổi Fourier thời gian nhanh hoặc biến đổi Fourier phạm vi.
Vấn đề: nếu có nhiều đối tượng ở cùng một khoảng cách thì chúng tôi đang gặp rắc rối vì phạm vi FFT sẽ không cho phép chúng tôi phân biệt giữa hai đối tượng. Nhưng nếu các vật chuyển động với tốc độ khác nhau thì chúng có thể bị phân tách bằng tốc độ.
Các tiếng kêu thường được lặp lại ngay sau nhau hoặc hơi trễ. Trong văn học, khoảng thời gian giữa lúc bắt đầu hai tiếng kêu được gọi là Thời gian lặp lại tiếng kêu. Một số tiếng kêu (thường từ 16 đến 256) được xếp chồng lên nhau để tạo thành khung radar. Thời gian khung hình = Thời gian lặp lại tiếng kêu * Số tiếng kêu. Thông thường, thời gian của 1 khung hình là từ hàng chục micro giây đến hàng chục mili giây.
Tại sao xếp nhiều tiếng kêu lại với nhau? Pha của tín hiệu IF rất nhạy cảm với các rung động nhỏ và lớn của các vật thể trong trường quan sát của radar - nó thậm chí có thể được sử dụng để đo tần số rung động của động cơ hoặc nhịp tim của người hoặc động vật.
Có thể đo vận tốc của một vật ở một phạm vi cụ thể bằng cách phân tích sự thay đổi pha theo thời gian (sự thay đổi pha từ chirp sang chirp):
Thuật toán đo tốc độ bằng radar mmWave FMCW rất đơn giản:
Áp dụng Biến đổi Fourier cho từng tiếng kêu trong khung. Mỗi tần số tương ứng với một khoảng cách nhất định tới vật thể. Đôi khi, những tần số này được gọi là phạm vi vì mỗi tần số tương ứng với một phạm vi cụ thể
nếu tín hiệu IF ban đầu được biểu diễn bằng các giá trị không phức tạp thì nửa sau của tần số (thùng phạm vi) phải bị loại bỏ theo định lý Nyquist-Shannon
Áp dụng một Biến đổi Fourier khác trên mỗi ngăn phạm vi - phân tách các thay đổi pha theo thời gian thành các tần số trong đó tần số sẽ tương ứng với một giá trị Doppler (vận tốc) cụ thể
Vấn đề: nếu có hai vật thể ở cùng một khoảng cách di chuyển với cùng tốc độ thì chúng sẽ tạo ra một đỉnh duy nhất trong hình ảnh doppler phạm vi. Nhưng nếu chúng ta có một số ăng-ten thu Rx, có thể phân tách các vật thể theo vị trí góc của chúng
Như đã giải thích trước đó, một sự thay đổi nhỏ về khoảng cách sẽ dẫn đến sự thay đổi pha. Sự thay đổi pha giữa các tiếng kêu tách biệt theo thời gian được sử dụng để tính toán vận tốc của vật thể. Có thể sử dụng sự thay đổi pha giữa các tiếng kêu tách biệt trong không gian (các tiếng kêu được nhận bởi các ăng ten Rx khác nhau) để ước tính góc.
Thuật toán ước lượng góc với nhiều anten thu Rx rất đơn giản:
Truyền một khung tiếng kêu bằng ăng-ten Tx.
Tính toán Biến đổi Fourier 2D (hình ảnh phạm vi doppler) của các khung mà tất cả ăng-ten Rx nhận được. Ảnh range-doppler của mỗi anten Rx sẽ có các đỉnh ở cùng một vị trí và doppler nhưng có pha khác nhau (độ lệch pha tương ứng với khoảng cách giữa các anten Rx).
Sử dụng độ lệch pha (ω) để ước tính góc tới của vật thể - áp dụng biến đổi Fourier thứ ba trên tất cả các ăng-ten 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ải xuống ví dụ về dữ liệu radar mmWave FMCW từ dự án 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
Tải dữ liệu từ tập tin.
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
Chức năng trực quan hóa.
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()
Hiển thị một dữ liệu ADC của tiếng kêu.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Hiển thị tiếng kêu sau phạm vi 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')
Hiển thị khung radar trong miền thời gian và tần số.
# 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')
Nhận phạm vi, doppler và góc từ dữ liệu 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'] )
Hai bài viết tiếp theo sẽ đề cập đến: