মিলিমিটার-তরঙ্গ ফ্রিকোয়েন্সি-মডুলেটেড কন্টিনিউয়াস-ওয়েভ (FMCW) রাডার রেডিও ফ্রিকোয়েন্সি (RF) ইলেক্ট্রোম্যাগনেটিক তরঙ্গ নির্গত এবং সনাক্ত করে কাজ করে। এর অনন্য বৈশিষ্ট্যগুলির কারণে, এই প্রযুক্তিটি ইন্টারেক্টিভ সিস্টেম এবং অ্যাপ্লিকেশনগুলির জন্য বিভিন্ন সুবিধা প্রদান করে। এটি আলোর অবস্থা, পরিবেশগত শব্দ বা আবহাওয়া থেকে স্বাধীনভাবে কাজ করে, দ্রুত এবং সঠিক সেন্সিং ক্ষমতা প্রদান করে।
তদুপরি, এটি বিভিন্ন উপকরণে প্রবেশ করতে পারে, এটি বিভিন্ন ডিভাইস এবং সেটিংসে একীভূত করার জন্য আদর্শ করে তোলে। সেন্সরটি মিলিমিটার-ওয়েভ আরএফ ফ্রিকোয়েন্সিতে একটি ছোট, সলিড-স্টেট সেমিকন্ডাক্টর ইউনিট হিসাবে তৈরি করা যেতে পারে - মূলত, একটি রাডার চিপ। এই চিপটি কমপ্যাক্ট, অল্প শক্তি খরচ করে, কোন চলমান যন্ত্রাংশ নেই এবং প্রচুর পরিমাণে সাশ্রয়ীভাবে উৎপাদন করা যায়।
mmWave FMCW রাডার অনেক ডিভাইসে ব্যবহার করা যেতে পারে, যেমন:
তাছাড়া, mmWave FMCW রাডারগুলিকে ডিপ লার্নিং মডেলের সাথে একসাথে বিভিন্ন কাজ সমাধান করতে ব্যবহার করা যেতে পারে:
মনে রাখবেন যে এই সমস্ত অ্যাপ্লিকেশনগুলি ক্যামেরা ছাড়াই সমাধান করা যেতে পারে, একটি খুব কম শক্তি খরচ ডিভাইস এবং তুলনামূলকভাবে ছোট NN.
পরবর্তী কয়েক বছরে, অনেক ভোক্তা ইলেকট্রনিক্স সম্ভবত উপরে উল্লিখিত সমস্যাগুলি সমাধান করতে গভীর শিক্ষার অ্যালগরিদম সহ এই ধরণের সেন্সর সক্রিয়ভাবে ব্যবহার করা শুরু করবে। উপরন্তু, 2021 সালে, IEEE 802.11ау Wi-Fi মান অনুমোদিত হয়েছিল। এই স্ট্যান্ডার্ডটি একই রেডিও ফ্রিকোয়েন্সি এবং অপারেটিং নীতিগুলি ব্যবহার করে, Wi-Fi রাউটারগুলিকে mmWave FMCW রাডারগুলির মতো একই কার্যকারিতা অ্যাক্সেস করতে সক্ষম করে।
এটি এবং পরবর্তী দুটি নিবন্ধ কভার করবে:
এই নিবন্ধটি ব্যাখ্যা করে কিভাবে একটি mmWave FMCW রাডার সংকেত প্রক্রিয়া করা হয়। বেশিরভাগ পরিসংখ্যান তৈরি করতে ব্যবহৃত কোডটি Google Colab- এ বা নিবন্ধের শেষে অ্যাক্সেস করা যেতে পারে।
mmWave FMCW রাডার থেকে সংকেত তার দৃশ্যের ক্ষেত্রের সমস্ত বস্তুর দূরত্ব, তাদের গতি এবং কৌণিক অবস্থান (অজিমুথ এবং উচ্চতা) পরিমাপ করতে সক্ষম করে। রাডার থেকে সংকেতটি খুব ছোট রেজোলিউশনের চিত্রের আকারে প্রক্রিয়া করা যেতে পারে (সাধারণত ~32x32 - 256x64 পিক্সেল) চিত্রের অক্ষ বরাবর রেঞ্জ/স্পীড/কোণ সহ নীচের ছবির মতো - রেঞ্জ-ডপলার (রেঞ্জ-স্পীড) রেঞ্জ- কোণ ছবি।
সেন্সরটিতে বেশ কয়েকটি (1 বা তার বেশি) সর্বমুখী ট্রান্সমিটিং অ্যান্টেনা এবং বেশ কয়েকটি (1 বা তার বেশি) গ্রহণকারী অ্যান্টেনা থাকে। ট্রান্সমিটিং এবং রিসিভিং অ্যান্টেনা একই সাথে কাজ করে। রাডার দেখার ক্ষেত্র সাধারণত ~120° হয় এবং সর্বোচ্চ দূরত্ব কয়েক সেন্টিমিটার থেকে দশ মিটার পর্যন্ত হতে পারে।
আমাদের সাধারণত t1 সময়ে একটি সংকেত নির্গত করতে হবে এবং দূরত্ব পরিমাপ করার জন্য t2 সময়ে এর প্রতিফলন পেতে হবে। তখন দূরত্বকে d=(t2-t1)*c হিসাবে গণনা করা যেতে পারে, যেখানে c হল আলোর গতি কারণ রেডিও তরঙ্গ আলোর গতিতে ভ্রমণ করে।
FMCW মিমি-ওয়েভ রাডার অ্যান্টেনা সর্বমুখী, এবং এটির রাডার ক্ষেত্রের সমস্ত বস্তুর জন্য t1 এবং t2 সময় পরিমাপ করার একটি উপায় প্রয়োজন। এর জন্য একটি FMCW (ফ্রিকোয়েন্সি মডুলেটেড কন্টিনিউয়াস ওয়েভ) সংকেত ব্যবহার করা হয়। রাডারের প্রধান উপাদান একটি কিচিরমিচির। চির্প হল একটি সাইনোসয়েড রেডিও সিগন্যাল যার ফ্রিকোয়েন্সি সময়ের সাথে সাথে রৈখিকভাবে বৃদ্ধি পায়, যেমনটি নীচের চিত্রে দেখানো হয়েছে।
একটি কিচিরমিচির সূচনা (f_start) এবং শেষ (f_end) ফ্রিকোয়েন্সি, ব্যান্ডউইথ ( B=f_end-f_start ), এবং কিচিরমিচির সময় (Tc) দ্বারা চিহ্নিত করা হয়। কিচিরমিচির সময় কয়েক মাইক্রোসেকেন্ড থেকে কয়েক মিলিসেকেন্ড পর্যন্ত। রাডার প্রয়োগের উপর নির্ভর করে স্টার্ট ফ্রিকোয়েন্সি সাধারণত ~30, 60, বা 77GHz হয়। Chirp ব্যান্ডউইথ ~0.5GHz থেকে বেশ কিছু GHz পর্যন্ত।
রিসিভিং (Rx) এবং ট্রান্সমিটিং (Tx) অ্যান্টেনা একই সাথে কাজ করে। সিনথেসাইজার ক্রমাগত একটি চিপ তৈরি করে যা প্রেরণকারী অ্যান্টেনা Tx এবং মিক্সারে পাঠানো হয়। একই সময়ে, Rx অ্যান্টেনা দ্বারা প্রাপ্ত সংকেতটিও মিক্সারে খাওয়ানো হয়। মিক্সারটি Tx-এ প্রেরিত সংকেত এবং Rx দ্বারা প্রাপ্ত সংকেতের মধ্যে পার্থক্য নির্ণয় করে।
একটি পরিচিত রৈখিক আইন (ঢাল) অনুসারে কিচিরমিচির সংকেতের ফ্রিকোয়েন্সি সময়ের সাথে পরিবর্তিত হয় যার অর্থ রাডারের সামনে যদি একটি একক বস্তু থাকে তবে এই বস্তুটি একটি সংকেত x_out তৈরি করবে
আমরা সময় পরিমাপ না করেই মিক্সার থেকে সংকেত বিশ্লেষণ করে রাডারের দৃশ্যের ক্ষেত্রে সমস্ত বস্তুর দূরত্ব পরিমাপ করতে পারি: d=(F_obj*c)/(2*S)। সাহিত্যে, x_out সংকেতকে 'IF সংকেত' (মধ্যবর্তী ফ্রিকোয়েন্সি সংকেত) বলা হয়।
সেন্সর ডিজাইনের একটি অতিরিক্ত বোনাস: সিগন্যালের ক্যারিয়ার ফ্রিকোয়েন্সি সাধারণত 30GHz বা 60Ghz হয়। যদি আমাদের এই ধরনের ফ্রিকোয়েন্সিগুলির একটি সংকেত ডিজিটাইজ করার প্রয়োজন হয়, তাহলে আমাদের ADC-এর জন্য খুব উচ্চ প্রয়োজনীয়তা থাকবে। সমস্ত সিগন্যাল বিশ্লেষণ IF সিগন্যালে করা হয় যার ফ্রিকোয়েন্সি সাধারণত কয়েক মেগাহার্টজের কাছাকাছি হয়, যা উল্লেখযোগ্যভাবে ADC-এর প্রয়োজনীয়তাগুলিকে শিথিল করে।
উপরে দেখানো হয়েছে, রাডার FoV-এ সমস্ত বস্তুর দূরত্ব খুঁজে বের করার জন্য, আমাদের সংকেত x_out এর ফ্রিকোয়েন্সি উপাদানগুলিতে পচন করতে হবে। ফুরিয়ার ট্রান্সফর্ম একটি অ্যালগরিদম যা একটি সময় ডোমেন সংকেতকে ফ্রিকোয়েন্সি ডোমেনে রূপান্তর করে।
IF সংকেতের ফুরিয়ার ট্রান্সফর্ম একাধিক টোন প্রকাশ করবে, এবং প্রতিটি টোনের ফ্রিকোয়েন্সি রাডার থেকে প্রতিটি বস্তুর পরিসরের সমানুপাতিক - সাহিত্যে, এই ফুরিয়ার ট্রান্সফর্মকে ফাস্ট টাইম ফুরিয়ার ট্রান্সফর্ম বা রেঞ্জ ফুরিয়ার ট্রান্সফর্মও বলা হয়।
সমস্যা: একই দূরত্বে একাধিক বস্তু থাকলে আমরা সমস্যায় পড়ি কারণ রেঞ্জ FFT আমাদের দুটি বস্তুর মধ্যে পার্থক্য করতে দেয় না। কিন্তু বস্তুগুলো যদি ভিন্ন গতিতে চলে তাহলে সেগুলোকে গতির দ্বারা আলাদা করা যায়।
কিচিরমিচির সাধারণত একে অপরের পরে বা সামান্য বিলম্বের সাথে পুনরাবৃত্তি হয়। সাহিত্যে, দুটি কিচিরমিচির শুরুর মধ্যবর্তী সময়কে চির্প পুনরাবৃত্তির সময় বলা হয়। একটি রাডার ফ্রেম তৈরি করার জন্য বেশ কয়েকটি চিপস (সাধারণত 16 থেকে 256) একসাথে স্ট্যাক করা হয়। একটি ফ্রেম সময় = Chirps পুনরাবৃত্তি সময় * Chirps সংখ্যা। সাধারণত, 1 ফ্রেমের সময় দশ মাইক্রোসেকেন্ড থেকে দশ মিলিসেকেন্ড পর্যন্ত।
কেন একসাথে একাধিক চিপস স্ট্যাক? IF সংকেতের পর্যায়টি রাডারের দৃষ্টিকোণ ক্ষেত্রে বস্তুর ছোট এবং বড় কম্পনের জন্য অত্যন্ত সংবেদনশীল - এটি এমনকি একটি ইঞ্জিনের কম্পন ফ্রিকোয়েন্সি বা ব্যক্তি বা প্রাণীর হৃদস্পন্দন পরিমাপ করতেও ব্যবহার করা যেতে পারে।
সময়ের সাথে পর্যায় পরিবর্তনগুলি বিশ্লেষণ করে একটি নির্দিষ্ট পরিসরে একটি বস্তুর বেগ পরিমাপ করা সম্ভব (পর্যায় থেকে কিচিরমিচির পরিবর্তন):
mmWave FMCW রাডার দিয়ে গতি পরিমাপের অ্যালগরিদম খুবই সহজ:
একটি ফ্রেমে প্রতিটি কিচিরমিচিরে ফুরিয়ার ট্রান্সফর্ম প্রয়োগ করুন। প্রতিটি ফ্রিকোয়েন্সি বস্তুর একটি নির্দিষ্ট দূরত্বের সাথে মিলে যায়। কখনও কখনও, এই ফ্রিকোয়েন্সিগুলিকে রেঞ্জ বিন বলা হয় কারণ প্রতিটি ফ্রিকোয়েন্সি একটি নির্দিষ্ট পরিসরের সাথে মিলে যায়
যদি আসল IF সংকেতটি অ-জটিল মান দিয়ে উপস্থাপন করা হয়, তবে ফ্রিকোয়েন্সির দ্বিতীয় অর্ধেক (রেঞ্জ বিন) অবশ্যই Nyquist-Shannon উপপাদ্য অনুসারে বাতিল করতে হবে
প্রতিটি রেঞ্জ বিনের উপর আরেকটি ফুরিয়ার ট্রান্সফর্ম প্রয়োগ করুন - সময়ের সাথে সাথে পচনশীল ফেজ পরিবর্তনগুলি ফ্রিকোয়েন্সিতে পরিণত হয় যেখানে ফ্রিকোয়েন্সি একটি নির্দিষ্ট ডপলার (বেগ) মানগুলির সাথে মিলে যায়
সমস্যা: যদি একই দূরত্বে দুটি বস্তু একই গতিতে চলতে থাকে তবে তারা রেঞ্জ-ডপলার ইমেজে একটি একক শিখর তৈরি করবে। কিন্তু যদি আমাদের কাছে বেশ কয়েকটি রিসিভিং Rx অ্যান্টেনা থাকে, তাহলে বস্তুকে তাদের কৌণিক অবস্থান দ্বারা আলাদা করা সম্ভব হতে পারে।
যেমন আগে ব্যাখ্যা করা হয়েছে, দূরত্বের একটি ছোট পরিবর্তনের ফলে একটি ফেজ পরিবর্তন হবে। সময়ের মধ্যে আলাদা করা চিপস জুড়ে ফেজ পরিবর্তন বস্তুর বেগ গণনা করতে ব্যবহৃত হয়। স্পেসে আলাদা করা চিপস জুড়ে ফেজ পরিবর্তন (বিভিন্ন Rx অ্যান্টেনা দ্বারা প্রাপ্ত চিপ) কোণ অনুমানের জন্য ব্যবহার করা যেতে পারে।
একাধিক গ্রহণকারী অ্যান্টেনা Rx সহ কোণ অনুমান অ্যালগরিদম খুবই সহজ:
একটি Tx অ্যান্টেনা দিয়ে কিচিরমিচির একটি ফ্রেম প্রেরণ করুন।
সমস্ত Rx অ্যান্টেনা দ্বারা প্রাপ্ত ফ্রেমের 2D ফুরিয়ার ট্রান্সফর্ম (রেঞ্জ-ডপলার ইমেজ) গণনা করুন। প্রতিটি Rx অ্যান্টেনার রেঞ্জ-ডপলার ইমেজ একই অবস্থানে এবং ডপলারের শিখর থাকবে কিন্তু ভিন্ন ফেজ সহ (ফেজ পার্থক্য Rx অ্যান্টেনার মধ্যে দূরত্বের সাথে মিলে যায়)।
অবজেক্টের আগমনের কোণ অনুমান করতে ফেজ পার্থক্য (ω) ব্যবহার করুন - সমস্ত 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
RAMP-CNN প্রকল্প থেকে mmWave FMCW রাডার ডেটার একটি উদাহরণ ডাউনলোড করুন।
!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
ফাইল থেকে ডেটা লোড করুন।
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
ভিজ্যুয়ালাইজেশন ফাংশন।
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()
একটি কিচিরমিচির একটি ADC ডেটা দেখান।
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
রেঞ্জ 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')
সময় এবং ফ্রিকোয়েন্সি ডোমেনে রাডার ফ্রেম দেখান।
# 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')
রাডার ডেটা থেকে পরিসীমা, ডপলার এবং কোণ পান।
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'] )
পরবর্তী দুটি নিবন্ধ কভার করবে: