2026年5月1日金曜日

nRF52833で測距(6) - IQデータの処理方法(3)



ちょっと本気出して測距を考えてみたい。IQデータの料理方法についてまとめておきたい。、、、の第3回目。相関係数の前処理について。空間平均法やる。

信号源が一つ(または反射による相関が極めて強い)場合、そのままでは相関行列のランクが不足するという数学的課題を解決するために前回Tamed Caponってのをやったけど、空間平均法もやってみる。空間平均法は行列のサイズを擬似的に小さくして平均化することで「ランク(情報の深み)」として復元する手法らしい。

空間平均法のアルゴリズム
全体のデータ数をN、サブアレイのサイズをMとして、M個の要素を持つ部分ベクトル$\mathbf{x}_i$を作成する。
全体データは
\[ \mathbf{x}=\begin{pmatrix} x_1,x_2,...,x_{N-1} \end{pmatrix}^T \] 以下のように部分ベクトルを作っていく \[ \mathbf{x}_{0}=\begin{pmatrix} x_0,x_1,...,x_{M-1} \end{pmatrix}^T \] \[ \mathbf{x}_{1}=\begin{pmatrix} x_1,x_2,...,x_{M+1-1} \end{pmatrix}^T \] \[ \mathbf{x}_{2}=\begin{pmatrix} x_2,x_3,...,x_{M+2-1} \end{pmatrix}^T \] \[ \dots \] \[ \mathbf{x}_{i}=\begin{pmatrix} x_i,x_{i+1},...,x_{M+i-1} \end{pmatrix}^T \] \[ \dots \] \[ \mathbf{x}_{L-1}=\begin{pmatrix} x_{L-1},x_{L-1+1},...,x_{M+L-1-1} \end{pmatrix}^T \] で \[ M+L-1-1=N-1 \] なので \[ L=NーM+1 \] で、各サブセットごとに$M \times M$の相関行列$\mathbf{R}_{{xx}_i}$を算出して、加算平均すると最終的な相関行列$\mathbf{\bar{R}}_{xx}$が得られるらしい。すなわち
\[ \mathbf{R}_{{xx}_i} = \mathbf{x}_i \mathbf{x}_i^H \tag{1} \] \[ \mathbf{\bar{R}}_{xx} = \frac{1}{L} \sum_{i=0}^{L-1} \mathbf{R}_{{xx}_i} \tag{2} \] なんでこれでランクが上がるのかをGeminiに聞いてみた
なぜこれで「ランク」が上がるのか
無線測距のデータがランク $1$ になってしまうのは、各周波数成分の位相関係が完全に固定(コヒーレント)されているからです。空間平均法で窓をずらしていくと、各サブセット $\mathbf{x}_i$ にとって「基準となる位相」が $i$ ごとに変化します。この「位相のずれ」を含んだ状態で平均をとることで、数学的には「信号源が統計的に独立であるかのように振る舞わせる」ことができ、行列のランクが回復(最大 $M$ まで)します。
、、、らしい(^∀^;)
で、これでもランクが足りない場合、「フォワード・バックワード空間平均(FBSS: Forward-Backward Spatial Smoothing)」というのをやるらしい。
Forwardとは(上に書いてあるのと同じ)、
\[ \mathbf{x}_{fi}=\begin{pmatrix} x_i,x_{i+1},...,x_{M+i-1} \end{pmatrix}^T \tag{3} \] Backwardとは、 \[ \mathbf{x}_{bi}=\begin{pmatrix} x_{M+i-1}^*,...,x_{i+1}^*,x_i^* \end{pmatrix}^T \tag{4} \] これにより新たに別のスナップショットを取得したようになるらしい。で、
\[ \mathbf{R}_{xxi} = \frac{\mathbf{x}_{fi}\mathbf{x}_{fi}^H + \mathbf{x}_{bi}\mathbf{x}_{bi}^H}{2} \tag{5} \] として、(2)の計算をすればいいってことらしい。
で、これをどう実装するかというと、上に記載したアルゴリズム通りに実装してもいいんだけど、オリジナルの$\mathbf{R}_{xx}$も欲しいってこともある。んで、オリジナルの$\mathbf{R}_{xx}$から部分行列を切り出し切り出しして足して足して最後に割って空間平均された相関行列$\mathbf{\bar{R}}_{xx}$を得ようと思う(参考サイト : 菊間信良著 科学技術出版社 アレーアンテナによる適応信号処理 FORTRAN, MATLAB ソースリスト)。
で、作成したコードがこちら
ble_spatial_rxx_capon2.py

解析に使ってるデータはこちら(今まで使いまわしてきたやつ...いちおう)
previous_log.txt

で、結果
いちおうこういう結果が出て、BeamformerよりCaponの方がまあ確かに鋭くはなったんだけど、空間平均のサブアレー要素数とか、Tamedの係数とかで、だらっとさせることもできるし、鋭さを求めると、別のピークが現れてきたり、めっちゃぶっ飛んだり、、、どういう設定にするかで結果が変わりやすいんだけど、じゃあその設定を何を根拠に調整していけばいいのかがわからない。実機でチューニングする類のやつなのかな( ˘•ω•˘ ).。oஇ


実は彼は天才で今週末でスパッと戦争を止められる秘策を持っていてほしい願望