Milimetre dalga Frekans Modülasyonlu Sürekli Dalga (FMCW) radarı, radyo frekansı (RF) elektromanyetik dalgaları yayarak ve tespit ederek çalışır. Benzersiz özellikleri nedeniyle bu teknoloji, etkileşimli sistemler ve uygulamalar için çeşitli avantajlar sunmaktadır. Aydınlatma koşullarından, çevresel gürültüden veya hava koşullarından bağımsız olarak çalışarak hızlı ve doğru algılama yetenekleri sunar.
Üstelik çeşitli malzemelere nüfuz edebiliyor, bu da onu çeşitli cihazlara ve ayarlara entegrasyon için ideal kılıyor. Sensör, milimetrik dalga RF frekanslarında küçük, katı hal yarı iletken bir ünite (esasen bir radar çipi) olarak yapılabilir. Bu çip kompakttır, az güç tüketir, hareketli parçası yoktur ve büyük miktarlarda uygun maliyetle üretilebilir.
mmWave FMCW radarı aşağıdakiler gibi birçok cihazda kullanılabilir:
Ayrıca mmWave FMCW radarları çeşitli görevleri çözmek için derin öğrenme modelleriyle birlikte kullanılabilir:
Tüm bu uygulamaların kameralar olmadan, çok düşük güç tüketen bir cihazla ve nispeten küçük NN'lerle çözülebileceğini unutmayın.
Önümüzdeki birkaç yıl içinde birçok tüketici elektroniği, yukarıda belirtilen sorunları çözmek için derin öğrenme algoritmalarına sahip bu tür sensörleri aktif olarak kullanmaya başlayacak gibi görünüyor. Ayrıca 2021 yılında IEEE 802.11ау Wi-Fi standardı onaylandı. Bu standart, Wi-Fi yönlendiricilerinin mmWave FMCW radarlarıyla aynı işlevselliğe erişmesine olanak tanıyan aynı radyo frekanslarını ve çalışma ilkelerini kullanır.
Bu ve sonraki iki makale şunları kapsayacaktır:
Bu makalede mmWave FMCW radar sinyalinin nasıl işlendiği açıklanmaktadır. Çoğu rakamı oluşturmak için kullanılan koda Google Colab'dan veya makalenin sonunda erişilebilir.
mmWave FMCW radarından gelen sinyal, görüş alanındaki tüm nesnelere olan mesafeyi, hızlarını ve açısal konumlarını (azimut ve yükseklik) ölçmeyi sağlar. Radardan gelen sinyal, aşağıdaki resimde olduğu gibi görüntü eksenleri boyunca menzil/hız/açı ile çok küçük çözünürlüklü görüntüler (genellikle ~32x32 - 256x64 piksel) şeklinde işlenebilir - range-doppler (range-speed) range- açılı görüntüler.
Sensör birkaç (1 veya daha fazla) çok yönlü verici antenden ve birkaç (1 veya daha fazla) alıcı antenden oluşur. Verici ve alıcı antenler aynı anda çalışır. Radarın görüş alanı genellikle ~120°'dir ve maksimum mesafe birkaç santimetreden onlarca metreye kadar olabilir.
Mesafeyi ölçmek için genellikle t1 zamanında bir sinyal göndermemiz ve t2 zamanında yansımasını almamız gerekir. Daha sonra mesafe d=(t2-t1)*c olarak hesaplanabilir; burada c , radyo dalgası ışık hızında hareket ettiğinden ışığın hızıdır.
FMCW mm-dalga radar anteni çok yönlüdür ve radar görüş alanındaki tüm nesneler için t1 ve t2 sürelerini ölçecek bir yola ihtiyaç duyar. Bunun için bir FMCW (Frekans Modülasyonlu Sürekli Dalga) sinyali kullanılır. Radarın ana bileşeni bir cıvıltıdır. Chirp, aşağıdaki şekilde gösterildiği gibi frekansı zamanla doğrusal olarak artan sinüzoidal bir radyo sinyalidir.
Bir cıvıltı başlangıç (f_start) ve bitiş (f_end) frekansları, Bant genişliği ( B=f_end-f_start ) ve cıvıltı süresi (Tc) ile karakterize edilir. Cıvıltı süresi birkaç mikrosaniyeden birkaç milisaniyeye kadar değişir. Başlangıç frekansı, radar uygulamasına bağlı olarak genellikle ~30, 60 veya 77GHz'dir. Chirp Bant Genişliği ~0,5 GHz'den birkaç GHz'e kadar değişir.
Alıcı (Rx) ve verici (Tx) antenler aynı anda çalışır. Sentezleyici sürekli olarak verici anten Tx'e ve miksere gönderilen bir cıvıltı üretir. Aynı zamanda Rx anteninin aldığı sinyal de miksere beslenir. Karıştırıcı, Tx'e gönderilen sinyal ile Rx tarafından alınan sinyal arasındaki farkı çıkarır.
Cıvıltı sinyalinin frekansı, bilinen bir doğrusal yasaya (Eğim) göre zamanla değişir; bu, radarın önünde tek bir nesne varsa, bu nesnenin x_out sinyalini üreteceği anlamına gelir.
Zamanı ölçmeden mikserden gelen sinyali analiz ederek radar görüş alanındaki tüm nesnelere olan mesafeyi ölçebiliriz: d=(F_obj*c)/(2*S). Literatürde x_out sinyaline 'IF sinyali' (ara frekans sinyali) adı verilir.
Sensör tasarımının ek bir avantajı: sinyalin taşıyıcı frekansı genellikle 30 GHz veya 60 GHz civarındadır. Bu frekanslardaki bir sinyali dijitalleştirmemiz gerekirse, ADC'ye yönelik çok yüksek gereksinimlerimiz olurdu. Tüm sinyal analizi, frekansı genellikle birkaç MHz civarında olan IF sinyali üzerinde yapılır ve bu, ADC gereksinimlerini önemli ölçüde rahatlatır.
Yukarıda gösterildiği gibi, radar görüş alanındaki tüm nesnelerin mesafesini bulmak için x_out sinyalini frekans bileşenlerine ayırmamız gerekir. Fourier Dönüşümü, zaman alanı sinyalini frekans alanına dönüştüren bir algoritmadır.
IF sinyalinin Fourier Dönüşümü birden fazla tonu ortaya çıkaracaktır ve her tonun frekansı, her nesnenin radardan uzaklığıyla orantılıdır - literatürde bu Fourier dönüşümüne aynı zamanda hızlı zamanlı Fourier dönüşümü veya aralık Fourier dönüşümü de denir.
Sorun: Aynı mesafede birden fazla nesne varsa başımız belaya girer çünkü FFT menzili iki nesneyi ayırt etmemize izin vermez. Ancak nesneler farklı hızlarda hareket ediyorsa hızlarına göre ayrılabilirler.
Cıvıltılar genellikle hemen ardından veya hafif bir gecikmeyle tekrarlanır. Literatürde iki cıvıltı başlangıcı arasındaki süreye cıvıltı tekrarlama süresi denir. Birkaç cıvıltı (genellikle 16 ila 256) bir radar çerçevesi oluşturacak şekilde bir araya getirilir. A kare süresi = Cıvıltı Tekrarlama Süresi * Cıvıltı Sayısı. Tipik olarak, 1 karenin süresi onlarca mikrosaniyeden onlarca milisaniyeye kadardır.
Neden birden fazla cıvıltıyı bir araya getiresiniz ki? IF sinyalinin fazı, radar görüş alanındaki nesnelerin küçük ve büyük titreşimlerine karşı çok hassastır; hatta bir motorun titreşim frekansını veya bir kişinin veya hayvanın kalp atışını ölçmek için bile kullanılabilir.
Zaman içindeki faz değişikliklerini (cıvıltıdan cıvıltıya faz değişimi) analiz ederek bir nesnenin belirli bir aralıktaki hızını ölçmek mümkündür:
mmWave FMCW radarıyla hızı ölçmeye yönelik algoritma çok basittir:
Bir karedeki her cıvıltıya Fourier Dönüşümü uygulayın. Her frekans nesneye olan belirli bir mesafeye karşılık gelir. Bazen, her frekans belirli bir aralığa karşılık geldiğinden bu frekanslara aralık kutuları adı verilir.
orijinal IF sinyali karmaşık olmayan değerlerle temsil ediliyorsa, frekansların ikinci yarısı (aralık bölmeleri) Nyquist-Shannon teoremine göre atılmalıdır.
Her aralık bölmesine başka bir Fourier Dönüşümü uygulayın - zaman içindeki faz değişikliklerini, frekansın belirli bir Doppler (hız) değerlerine karşılık geleceği frekanslara ayrıştırın
Sorun: Eğer aynı mesafede, aynı hızda hareket eden iki nesne varsa, bunlar aralık doppler görüntüsünde tek bir tepe noktası oluşturacaktır. Ancak birden fazla alıcı Rx antenimiz varsa nesneleri açısal konumlarına göre ayırmak mümkün olabilir.
Daha önce açıklandığı gibi mesafedeki küçük bir değişiklik, faz değişikliğine neden olacaktır. Zaman içinde ayrılmış cıvıltılar arasındaki faz değişimi, nesnelerin hızını hesaplamak için kullanılır. Açı tahmini için uzayda ayrılan cıvıltılar (farklı Rx antenleri tarafından alınan cıvıltılar) arasındaki faz değişimi kullanılabilir.
Birden fazla alıcı anten Rx ile açı tahmin algoritması çok basittir:
Bir Tx anteni ile bir cıvıltı çerçevesi iletin.
Tüm Rx antenleri tarafından alınan çerçevelerin 2D Fourier Dönüşümünü (aralık doppler görüntüsü) hesaplayın. Her bir Rx anteninin aralık doppler görüntüleri aynı konumda ve dopplerde ancak farklı fazda tepe noktalarına sahip olacaktır (faz farkı, Rx antenleri arasındaki mesafeye karşılık gelir).
Nesnelerin varış açısını tahmin etmek için faz farkını (ω) kullanın; üçüncü Fourier dönüşümünü tüm Rx antenlerine uygulayın.
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
RAMP-CNN projesinden mmWave FMCW radar verilerinin bir örneğini indirin.
!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
Dosyadan veri yükleyin.
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
Görselleştirme işlevleri.
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()
Bir cıvıltıya ait bir ADC verisini gösterin.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Fft aralığından sonra bir cıvıltı gösterin.
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')
Radar çerçevesini zaman ve frekans alanlarında gösterin.
# 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')
Radar verilerinden menzil, doppler ve açı elde edin.
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'] )
Sonraki iki makale aşağıdakileri kapsayacaktır: