paint-brush
ディープラーニング: mmWave FMCW レーダーを搭載したエッジデバイス パート 1 - 信号処理@owlgrey
2,496 測定値
2,496 測定値

ディープラーニング: mmWave FMCW レーダーを搭載したエッジデバイス パート 1 - 信号処理

Dmitrii Matveichev 10m2024/04/10
Read on Terminal Reader

長すぎる; 読むには

ミリ波 FMCW レーダーは、環境条件に依存しない多目的な検知機能を提供し、カメラなしで人間を検出するデバイスやアプリケーションに最適です。効率的でコスト効率に優れ、チャープ周波数の変化を分析して距離、速度、方向を測定し、民生用電子機器や Wi-Fi テクノロジーの大幅な進歩を実現します。
featured image - ディープラーニング: mmWave FMCW レーダーを搭載したエッジデバイス パート 1 - 信号処理
Dmitrii Matveichev  HackerNoon profile picture

ミリ波周波数変調連続波 (FMCW) レーダーは、無線周波数 (RF) 電磁波を放射して検出することで機能します。この技術は独自の特性を備えているため、インタラクティブ システムやアプリケーションにさまざまな利点をもたらします。照明条件、環境ノイズ、天候に左右されずに動作し、迅速かつ正確な検知機能を提供します。


さらに、さまざまな材料を透過できるため、さまざまなデバイスや環境に組み込むのに最適です。このセンサーは、ミリ波 RF 周波数の小型の固体半導体ユニットとして構築できます。つまり、レーダー チップです。このチップはコンパクトで、消費電力が少なく、可動部品がなく、コスト効率よく大量生産できます。


mmWave FMCW レーダーは、次のような多くのデバイスで使用できます。

  • 仮想現実(VR)ガジェット
  • ウェアラブル技術、スマート衣料
  • モノのインターネット (IoT) デバイス
  • ゲームコントローラー
  • スマートフォン、タブレット、ノートパソコンなどの従来の電子機器。


さらに、mmWave FMCW レーダーをディープラーニング モデルと組み合わせて使用することで、さまざまなタスクを解決できます。

  • 人間の存在検知
  • 人数カウント、位置特定、追跡
  • 人間の活動の分類(人が寝る/座る/歩く/スポーツをするなど)
  • ジェスチャー認識
  • 場所認識
  • オドメトリとSLAM


これらのアプリケーションはすべて、カメラを使わず、消費電力が非常に低いデバイスと比較的小さな NN で解決できることに注意してください。


今後数年間で、多くの家電製品が、ディープラーニングアルゴリズムを搭載したこのタイプのセンサーを積極的に使用し、上記の問題を解決するようになるでしょう。さらに、2021年には、IEEE 802.11aу Wi-Fi規格が承認されました。この規格では、同じ無線周波数と動作原理が使用され、Wi-FiルーターがmmWave FMCWレーダーと同じ機能にアクセスできるようになります。


この記事と次の 2 つの記事では、次の内容を取り上げます。

  • mmWave FMCW レーダー信号処理 - RF 信号から距離、ドップラー、角度を取得する方法
  • カメラと比較したFMCWレーダーを使用する利点
  • mmWave FMCWレーダー信号のディープラーニングアプリケーション


この記事では、mmWave FMCW レーダー信号の処理方法について説明します。ほとんどの図を生成するために使用されたコードは、 Google Colabまたは記事の最後からアクセスできます。

FMCW ミリ波レーダー

mmWave FMCW レーダーからの信号により、視野内のすべての物体までの距離、速度、角度位置 (方位角と仰角) を測定できます。レーダーからの信号は、以下の図のように、画像軸に沿った距離/速度/角度を含む非常に小さな解像度の画像 (通常は約 32x32 - 256x64 ピクセル) の形式で処理できます - 距離-ドップラー (距離-速度) 距離-角度画像。



mmWave FMCW レーダー信号は、距離ドップラー画像と距離角度画像、およびカメラからのビューに処理されます (出典: https://github.com/ZhangAoCanada/RADDet?tab=readme-ov-file)

センサーは、複数 (1 つ以上) の全方向性送信アンテナと複数 (1 つ以上) の受信アンテナで構成されています。送信アンテナと受信アンテナは同時に動作します。レーダーの視野は通常約 120° で、最大距離は数センチメートルから数十メートルです。

距離の測定方法

通常、距離を測定するには、時刻t1に信号を発信し、時刻t2にその反射を受信する必要があります。距離はd=(t2-t1)*cとして計算できます。ここで、 cは光速です。電波は光速で移動するためです。


FMCW ミリ波レーダー アンテナは全方向性であり、レーダー視野内のすべてのオブジェクトの時間t1t2を測定する方法が必要です。これには、FMCW (周波数変調連続波) 信号が使用されます。レーダーの主なコンポーネントはチャープです。チャープは、下の図に示すように、時間とともに周波数が直線的に増加する正弦波無線信号です。

チャープの始まりから終わりまで、最初の図のように、電波の周波数はあらかじめ決められた線形法則に従って変調(変更)されます。2 番目の図は、1 ミリ秒の長さのチャープの例を示しています。

チャープは、開始周波数 (f_start) と終了周波数 (f_end)、帯域幅 ( B=f_end-f_start )、およびチャープ時間 (Tc) によって特徴付けられます。チャープ時間の範囲は、数マイクロ秒から数ミリ秒です。開始周波数は通常、レーダー アプリケーションに応じて約 30、60、または 77GHz です。チャープ帯域幅の範囲は、約 0.5GHz から数 GHz です。

IF 信号は、現在送信されている Tx 信号と受信されている Rx 信号の差です。(出典: https://www.ti.com/content/dam/videos/external-videos/2/3816841626001/5415203482001.mp4/subassets/mmwaveSensing-FMCW-offlineviewing_0.pdf)

受信 (Rx) アンテナと送信 (Tx) アンテナは同時に動作します。シンセサイザーは 1 つのチャープを連続的に生成し、送信アンテナ Tx とミキサーに送ります。同時に、Rx アンテナで受信した信号もミキサーに送られます。ミキサーは、Tx に送信された信号と Rx で受信した信号の差を出力します。

ミキサーは、2つの入力で正弦波信号を受信し、入力信号の周波数と位相の差である周波数と位相の新しい正弦波信号を生成する単純なデバイスです。

チャープ信号の周波数は既知の線形法則(傾き)に従って時間とともに変化します。つまり、レーダーの前に1つの物体がある場合、この物体は次のような信号x_outを生成します。絶え間ない周波数F_obj=S2d/c 、ここでS - チャープ信号周波数の変化率(傾き)、 d - 物体までの距離、 c - 光速。

レーダーの前に物体が1つある場合、この物体は一定周波数F_obj=S2d/cの信号x_outを生成します。

時間を測定せずにミキサーからの信号を分析するだけで、レーダー視野内のすべての物体までの距離を測定できます: d=(F_obj*c)/(2*S)。文献では、 x_out信号は「IF 信号」(中間周波数信号) と呼ばれています。


センサー設計のさらなる利点: 信号の搬送周波数は通常 30GHz または 60GHz 程度です。このような周波数の信号をデジタル化する必要がある場合、ADC には非常に高い要件が課せられます。すべての信号分析は、通常数 MHz 程度の周波数の IF 信号に対して行われるため、ADC の要件は大幅に緩和されます。

フーリエ変換を使用してレーダー FoV 内の各オブジェクトの範囲を見つける

上で示したように、レーダー FoV 内のすべてのオブジェクトまでの距離を見つけるには、信号x_out をその周波数成分に分解する必要があります。フーリエ変換は、時間領域信号を周波数領域に変換するアルゴリズムです。


IF 信号のフーリエ変換により複数のトーンが明らかになり、各トーンの周波数はレーダーからの各オブジェクトまでの距離に比例します。文献では、このフーリエ変換は高速時間フーリエ変換または距離フーリエ変換とも呼ばれます。

時間領域におけるチャープのIF信号

高速フーリエ変換後の周波数領域におけるチャープのIF信号

問題: 同じ距離に複数のオブジェクトがある場合、距離 FFT では 2 つのオブジェクトを区別できないため、問題が発生します。ただし、オブジェクトが異なる速度で移動する場合は、速度によって分離できます。

複数のチャープで速度を測定する方法

チャープは通常、次々に、またはわずかに遅れて繰り返されます。文献では、2 つのチャープの開始間の時間はチャープ繰り返し時間と呼ばれています。複数のチャープ (通常 16 ~ 256) が積み重ねられてレーダー フレームを形成します。フレーム時間 = チャープ繰り返し時間 * チャープ数。通常、1 フレームの時間は数十マイクロ秒から数十ミリ秒です。

レーダーフレーム - 複数のチャープが積み重ねられています。すべてのチャープは周波数変調された正弦波ですが、便宜上、すべてのチャープは周波数変調の線形法則として表されます。各チャープから受信されたIF信号により、FoV内のすべての物体までの距離を推定できます。

周波数領域で視覚化されたレーダー フレーム (複数のチャープが積み重ねられたもの)。各チャープにはフーリエ変換が個別に適用されます。黄色の水平線/曲線は特定の範囲にあるオブジェクトを表します。この図では、範囲ビン ~40 と ~50 に 2 つのオブジェクトがあります。

複数のチャープを積み重ねる理由は何でしょうか? IF 信号の位相は、レーダー視野内の物体の大小の振動に非常に敏感です。エンジンの振動周波数や、人や動物の心拍を測定するためにも使用できます。


時間の経過に伴う位相変化(チャープからチャープへの位相変化)を分析することで、特定の範囲における物体の速度を測定することができます。


  • 時間Tc を隔てて少なくとも 2 つのチャープを送信します。


  • 範囲フーリエ変換後、各チャープは同じ場所にピークを持ちますが、位相は異なります。


  • チャープ全体の位相 ω の変化は物体の速度に対応します。

mmWave FMCW レーダーで速度を測定するアルゴリズムは非常にシンプルです。

  1. フレーム内の各チャープにフーリエ変換を適用します。各周波数は、オブジェクトまでの特定の距離に対応します。各周波数が特定の範囲に対応するため、これらの周波数は範囲ビンと呼ばれることもあります。


  2. 元のIF信号が非複素数値で表現されている場合、ナイキスト・シャノン定理に従って周波数の後半部分(範囲ビン)を破棄する必要がある。


  3. 各範囲ビンに別のフーリエ変換を適用します。時間の経過に伴う位相の変化を周波数に分解します。周波数は特定のドップラー(速度)値に対応します。

左から右へ: フーリエ変換後の単一チャープの IF 信号 (レンジ フーリエ変換)、レンジ フーリエ変換後のレーダー フレーム、レンジ ドップラー画像。レンジ ドップラー画像の「ピクセル」の値は、特定の速度と距離における振幅応答と位相です。

問題: 同じ距離に同じ速度で移動する2つの物体がある場合、距離ドップラー画像では1つのピークが生成されます。しかし、受信Rxアンテナが複数ある場合は、角度位置によって物体を区別できる可能性があります。

角度位置の測定方法

前に説明したように、距離がわずかに変化すると位相が変化します。時間的に離れたチャープ間の位相変化は、物体の速度を計算するために使用されます。空間的に離れたチャープ(異なる Rx アンテナで受信されたチャープ)間の位相変化は、角度の推定に使用できます。


複数の受信アンテナ Rx を使用した角度推定アルゴリズムは非常にシンプルです。

  1. Tx アンテナを使用してチャープのフレームを送信します。


  2. すべての Rx アンテナで受信したフレームの 2D フーリエ変換 (距離ドップラー画像) を計算します。各 Rx アンテナの距離ドップラー画像には、同じ場所とドップラーのピークがありますが、位相は異なります (位相差は Rx アンテナ間の距離に対応します)。


  3. 位相差 (ω) を使用して物体の到着角度を推定します。すべての Rx アンテナに 3 番目のフーリエ変換を適用します。

すべての Rx アンテナに 3 番目のフーリエ変換を適用すると、距離-ドップラー-角度の立方体が生成されます。この立方体は、距離-ドップラー、距離-角度、角度-速度の画像として視覚化できます。

Python による mmWave FMCW レーダー データ処理

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()


チャープの 1 つの 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'] ) 

参考文献

次は何ですか?

次の 2 つの記事では、次の内容を取り上げます。

  • カメラと比較した mmWaveFMCW レーダーの長所と短所
  • mmWave FMCWレーダー信号のディープラーニングアプリケーション