IoT向けNOMA――基礎と実装
非直交多元接続、マルチユーザ無線、ソフトウェア無線(SDR)
第1章 はじめに:IoTにおけるNOMAの意義
本稿では、非直交多元接続(NOMA)をソフトウェア無線(SDR)で実装し、実験室で検証した内容を述べる。出発点となる問いは、二つのユーザが同一時刻に同一周波数帯で送信したとき、タイムスロットや別キャリアで分離せずに、受信機が両方のデータストリームを分離できるか、である。
実験では独立した送信機を二台(それぞれSDR一台)と共有の受信機を用いた。ベースバンド処理(フィルタ、同期、復調、逐次干渉キャンセル[SIC])は主にGNU Radioと補助的なPythonで実装し、評価にはビット誤り率(BER)とユーザ間の電力比への依存を含めた。本ページの図や曲線は、いずれも同じ測定に基づく。
無線によるデータ伝送は、現代の技術システムの中核にある。とくにモノのインターネット(IoT)では接続デバイス数が急速に増えている。センサ、制御器、組み込みシステムが継続的にデータを送る――しばしば同時に、限られた無線資源の上で。
そこには基本的な問題がある。
要点:送信するデバイスが増えるほど、衝突は起きやすくなる。
省エネを重視したIoTでは、重いプロトコルや確認応答を避けることが多い。省エネにはなるが、衝突したパケットは失われやすい。時分割多重(TDM)や周波数分割多重(FDM)のような古典的手法は、時間または周波数でユーザを厳密に分けて衝突を避けようとする。しかしこれらはある程度までしかスケールせず、利用可能な資源を最適には使えない。
代替案の一つが、非直交多元接続(NOMA)である。
決定的な違い:複数のユーザが同一周波数で同時に送信する。
信号は互いに素なチャネルで分けるのではなく、受信側の信号処理で分離する。重畳した信号を意図的に再構成し、引き離す。
理論上は単純に聞こえる。実際には多くの課題がある。
- 雑音と干渉
- 周波数誤差と位相誤差
- 信号電力のばらつき
- 同期の問題
NOMAを安定して動かすには、受信機が複雑な処理段を実行する必要がある。中核となる手法の一つが逐次干渉キャンセル(SIC)であり、寄与を段階的に検出・再構成し、合成信号から減算していく。
本稿では、そのようなシステムを実際にどう構築するか――無線の基礎から、ソフトウェア無線による実信号処理まで示す。
第2章 基礎:ソフトウェア無線とデータ伝送
ソフトウェア無線(SDR)
ソフトウェア無線(SDR)は、従来ハードウェアで行っていた機能を可能な限りソフトウェアに置き換えた無線システムである。
従来型の受信機では、多くの段がハードウェアに固定されている。
- ミキサ
- フィルタ
- 復調器
SDRでは信号をできるだけ早い段階でデジタル化し、その後はすべてソフトウェアで処理する。
SDRの動作(簡略)
信号経路は次のようになる。
- アンテナがRF信号を受信する。
- ミキサが低い周波数(中間周波またはベースバンド)へシフトする。
- ADCが信号をデジタル化する。
- デジタル信号処理が行う。
- フィルタリング
- 復調
- 同期
- 復号
本セットアップに合う理由
重要なのは、受信機の挙動全体がプログラム可能であることである。
そのためSDRはNOMAと相性がよい。
- 重畳した複数信号を柔軟に解析できる
- SICなどのアルゴリズムを直接実装できる
- 変更のたびにハードを再設計する必要がない
デジタル伝送の基礎
無線リンクを動かすには、デジタルデータをアナログ波形に変換する必要がある。
変調――QPSKの例
本システムでは直交位相偏移変調(QPSK)を用いる。
性質:
- シンボルあたり2ビット
- BPSKの約2倍のデータレート
- 頑健で広く使われる変調方式
シンボルは複素平面上の点として表される。
- 実部 → 同相(I)
- 虚部 → 直交(Q)
典型的なシンボル値(I, Q):
- (1, 1)
- (−1, 1)
- (−1, −1)
- (1, −1)
これが通常のQPSK星座図になる。
拡張QPSK(GNU Radio用のバイトパックを含む)では、送信機がadjust_dataを用いる(BAT_NOMA_Transmitter.pyより抜粋):
def adjust_data(data): # extended QPSK
new_data = np.zeros(len(data) * 2, dtype=int)
data_temp = np.zeros(len(data) * 2, dtype=int)
for i in np.arange(len(data_temp)):
data_temp[i] = data[int(i / 2)]
for j in np.arange(len(new_data)):
if (j % 2) == 0:
new_data[j] = (np.uint8(np.uint8(data_temp[j] / (64)) * 16)) | (
np.uint8(np.uint8(data_temp[j] * 4) / 64))
if (j % 2) == 1:
new_data[j] = np.uint8(np.uint8(np.uint8(data_temp[j] / 4) * 64) / 4) | (
np.uint8(np.uint8(data_temp[j] * 64) / 64))
return new_data
GNU RadioのConstellation Objectブロックでは、16のシンボル位置のうち4点がQPSK点、残りはヌルシンボル(0+0j)など(論文付録参照)。
パルス形状――ルートレイズドコサイン
シンボルをきれいに送るには、専用のパルス形状を使う:ルートレイズドコサイン(RRC)フィルタである。
理由:
- シンボル間干渉(ISI)を抑える
- 明確なシンボル判定を可能にする
- 帯域利用を最適化する
重要:送信機と受信機が合わせてマッチドフィルタを形成する(通常は各々RRC);理想的にはサンプリング瞬間でISIが打ち消される。
受信側のパルス整形では、明示的に計算したRRC係数とrcosへの畳み込みを用いる(BAT_NOMA_Receiver.pyより抜粋):
rrcos = np.array(
[1, 1, 1, 0.95256299, 0.7945013, 0.56381161, 0.3173851, 0.11599391, 0.00930381])
rrcos = np.sqrt(np.concatenate((np.array([1]), rrcos, np.zeros(50 - 19), np.flip(rrcos))))
rrcos = np.fft.fftshift(np.real(np.fft.ifft(rrcos)))
rrcos = rrcos / np.sqrt(np.sum(np.square(rrcos)))
rcos = np.convolve(rrcos, rrcos)
送信機側でもGNU RadioのRRCブロックを使用する;係数は同一のシンボルレート/シンボルあたりサンプル数に合わせる必要がある。
実用上の周波数選択
搬送波周波数は信号品質に大きく影響する。
典型的な観察:
- 2.4 GHz → 干渉が大きい(Wi‑Fi、Bluetooth)
- 低い帯域 → リンクが安定しやすいことが多い
低い周波数は干渉が少なく、デバイス間の周波数オフセットも小さくなりやすい。
パケット構造
伝送は短いバーストパケットを用いる――IoTでは典型的である。
パケットには次が含まれる。
- プリアンブル――同期と信号検出
- ヘッダ――メタデータ(例:宛先)
- ペイロード――実データ
プリアンブルが重要な理由
受信機は送信開始時刻を知らない。プリアンブルは次に用いる。
- サンプルストリームの中から信号を見つける
- 時間基準をロックする
- 復調の準備をする
エンドツーエンドのデータフロー
送信経路:
- データ → QPSK変調
- パルス整形(RRC)
- 搬送波へのアップコンバージョン
- アンテナから放射
受信経路:
- アンテナ受信
- ベースバンドへのダウンコンバージョン
- デジタル化
- フィルタリングと同期
- 復調
- データ取出し
NOMAにおいてなぜ重要か
上記はすべて重要である。NOMAは波形を非常にきれいに処理できて初めて機能するからである。
わずかな誤差でも次が起きる。
- 誤ったシンボル判定
- 干渉キャンセルの劣化
- ユーザ信号の再構成不能
第3章 NOMAの仕組み
本セットアップではNOMAを電力領域NOMAとして扱う:ユーザは主に受信電力(送信振幅と経路損失)で区別される。受信機はその順序を利用し、最も強い「層」を最初に復号し、段階的に剥がしていく。以下ではこの像を形式化しSINRを導入する――第7章の測定でも同じ量を用いる。
NOMAの核となる考え方
古典的な多元接続はユーザを厳密に分離する。
- TDM → 異なるタイムスロット
- FDM → 異なる周波数
NOMAは逆である:複数ユーザが同一周波数で同時に送信する。
分離は受信機のみで――信号処理によって行う。
数学的モデル
受信信号は送信機の重畳である。
\[ x(t) = \sum_{k=1}^{N} P_k \cdot s_k(t) \]
- \(s_k(t)\):ユーザ\(k\)の信号(例:パルス整形を含む変調シンボル)
- \(P_k\):対応する送信電力(または振幅係数、モデルによる)
- \(x(t)\):受信機での合成信号(雑音前;チャネルは別にモデル化可能)
要点:すべてのユーザ信号が同一帯域を占め、同時に活性である。
電力による分離(電力領域)
一般的な電力領域NOMAの中心アイデアは次のとおり。
異なる受信電力――通常は送信レベルやチャネル減衰の違いに由来する。
典型的(理想化された)構成:
- 遠い/弱い経路 → 受信機に十分なエネルギーが届くよう送信電力を高める
- 近い送信機 → 送信電力は低いが受信機では依然検出可能
おおよそ、受信機には支配的な層と、その下に一つ以上の弱い層が見える。
受信機では何が起きるか
受信信号はきれいな単一ユーザQPSKには見えない。次のようになる。
- 重畳している
- 雑音がある
- チャネル効果で歪む
直感:弱いユーザは、最初は強いユーザに対して追加の雑音のように振る舞う。
逐次干渉キャンセル(SIC)
ユーザを分離する主な方法が逐次干渉キャンセル(SIC)である。
段階的な流れ
- 強い層を検出する――支配的で、最初は単一ユーザリンクのように復調できる。
- 再構成する――復号シンボルから(チャネル推定を含め)そのユーザの寄与を再構築する。
- 受信波形から減算する。
- 弱い層が現れる――重畳の「雑音」の中に隠れていたが、いま処理できる。
- 受信強度の降順でさらにユーザがいれば繰り返す。
なぜこれが機能しうるか
次がそろっていれば機能する。
- 受信電力がはっきり分離している
- 支配層が確実に検出される
- 再構成が正確である
そうでなければ残留誤差が大きく、後段の復調が失敗する。
星座図の見方
QPSKでは振る舞いが特徴的である。
- NOMAなし → I/Q平面上に4点がはっきり
- NOMAあり → 重畳により有効なシンボル位置がずれる
QPSKユーザが二ついれば、一方の各シンボルが他方の各シンボルと組み合わさり――おおよそ最大16の重畳状態が現れうる(両方が効く場合)。
弱いユーザが強すぎると点が判定境界付近に寄りBERが悪化する。弱すぎると雑音に埋もれる。
まとめ:最適な電力比があり、電力と符号化の設計が重要である。
雑音とチャネル効果
実際にはさらに次がある。
- 熱雑音
- 経路損失とフェージング
- 位相・周波数誤差(キャリアオフセット)
信号は重畳するだけでなく劣化する――SICでの推定と減算が難しくなる。
SNR/SINRの見方
ユーザ\(k\)に対する有効比は次のように書ける。
\[ \mathrm{SINR}_k = \frac{P_k \cdot g_k}{\sum_{i \neq k} P_i \cdot g_i + N} \]
分子:\(k\)に望ましい信号;分母:他ユーザからの干渉に加え雑音電力\(N\)。\(g_k\)は(簡略化した)チャネル利得である。
厳密にはSINRであるが、多元接続では緩くSNRと呼ばれることも多い。他ユーザは分母で追加の雑音のように働く。
NOMAの限界
NOMAは万能ではない。重大な問題には次が含まれる。
- 不利な電力比
- 同期不良
- SICでの減算の不正確さ
- 強い雑音や急速に変化するチャネル
その場合方式はすぐに崩れ――誤りが段に伝播する。
要点
NOMAは「RFだけ」ではない――大きくは信号処理の問題である。
成功は次に強く依存する。
- 合成信号の推定と同期がどれだけよいか
- 強いユーザの再構成と減算がどれだけ正確か
第4章 信号処理:送信機から受信機まで
本章では信号経路全体を扱う――何が起きるかだけでなく、NOMAを動かすためにサンプルをどう処理しなければならないか。
SDRの後、受信機は複素ベースバンドI/Qサンプルの連続ストリームを持つ。以降はソフトウェア側:バッファ、マッチドフィルタ(RRC)、相関によるプリアンブル探索、周波数・タイミング整合、シンボルレートへのダウンサンプリング、QPSK(+ヌルシンボル)のハード判定、続いて強ユーザの再構成とSIC。GNU Radioがフローグラフの大半を実装し、重要な評価とSIC演算はフローグラフと同じサンプルを共有するPythonスクリプトに置ける(ファイルシンク、TCP、埋め込みPythonブロックなど)。
全体像
システムは三つの部分からなる。
- 送信機(TX)
- 無線チャネル
- 受信機(RX+処理)
要約:データ → 変調 → 空中伝搬 → 取得 → 処理 → 復号 →(準備)SIC
送信機側の処理
1. データフレーミング
データは短いバーストパケットで送られる。典型的な構成:
- プリアンブル(同期)
- ヘッダ(メタデータ)
- ペイロード
短いパケットはIoTでは典型であり、チャネルとタイミングを「ほぼ一定」とみなせる時間も制限する。
2. 拡張QPSK(実務上の工夫)
理論上は古典QPSKで足りる。実際には問題が出た。
SDRは「ペイロードなし」を断続的に送ると過渡応答を生じ、バースト端が壊れペイロードが使えなくなることがある。
対策:ヌルシンボル――星座に余分な点(0,0)をI/Q上に加え、ペイロードがないとき(アイドル/埋め)に送る。
利点:送信チェーンが連続的に励起され、実ペイロード前の立ち上がり歪みが減る。
3. パルス整形
変調の後は第2章と同様にRRCパルス整形:帯域制限し、受信側でマッチドフィルタを当てISIを最小化する。
4. 電力スケーリング(NOMAにとって重要)
送信前にベースバンド波形の振幅をスケールする――送信機ごとに異なる振幅(電力)を与え、受信機で望ましい支配順とSIC順が現れるようにする。
5. SDR送信
SDRが離散ベースバンドを生成し、アップコンバート(例:434 MHz)してアンテナから放射する。
無線チャネル
TXとRXのあいだでは:
- ユーザの寄与が一つの受信波形に重畳する
- 受信電力は通常距離とともに減る
- 雑音が加わる
- 干渉やマルチパスが現れうる
結果:一つの複雑で劣化した受信信号となる。
受信機側の処理
1. 受信とデジタル化
アンテナ → SDR(ベースバンドへダウンコンバート)→ ADC:複素デジタルサンプル。
2. バッファリング
サンプルはバッファに書き込まれる:ストリームは連続だが評価はバースト指向――まずパケットを見つけ切り出す必要がある。
3. マッチドフィルタ
パルスに整合した相手(RRC)でフィルタし、シンボル瞬間で最良のSNRと期待されるパルス形状を得る。
4. プリアンブル検出
バッファ内で既知のプリアンブルパターンを探索する。通常は相互相関。強いピークはパケット発見・開始インデックス既知を意味する。
受信機は周波数ビンにわたるプリアンブルの参照FFTを用意し、タイミング探索は最大IFFT相関を用いる(BAT_NOMA_Receiver.pyより抜粋):
preamble = np.exp(0.5j * np.pi * (symbols[:preamble_len] + 0.5))
pus4 = np.vstack((np.array(preamble), np.zeros((3, len(preamble)))))
pus4 = np.reshape(pus4, 4 * preamble_len, order='F')
pus4fft = np.zeros((sync_bands, fft_len), dtype=np.complex64)
for i in np.arange(sync_bands):
pus4fft[i, :] = np.fft.fft(np.concatenate((
pus4 * np.exp(2j * np.pi / (4 * preamble_len) / 3
* (i - sync_bands / 2) * np.arange(4 * preamble_len)),
np.zeros(fft_len - 4 * preamble_len, dtype=np.complex64))))
# ... after RRC: rxfft = np.fft.fft(rxp)
# ccp = max over bins of |ifft(rxfft * conj(pus4fft[i]))| → peak i0
閾値tsyncthresholdとプロットを含む完全なループはBAT_NOMA_Receiver.pyを参照。
5. 同期
- 時間同期:サンプリング位相/シンボルクロックを求める。粗いプリアンブル位置の後に精緻化することが多い。
- ダウンサンプリング:シンボルあたり複数サンプルから一つへ(フィルタとタイミングの後)。
- 周波数同期:キャリアオフセットを推定・補正し、星座が無限に回転しないようにする。
6. 位相追跡(NOMAではしばしば重要)
長いブロックや残留誤差には、PLLなどで位相ドリフトを追跡し判定を安定させる。
7. 復調
複素サンプルをシンボルへ、シンボルをビットへ――最初は最も強い(支配的)ユーザについて。
SICの準備
復調の後は重要な段:ユーザ波形を、理想的には重畳の前に見えていたであろう形に再構成する。
再構成
- シンボル → 複素星座点(ヌルシンボルを使う場合は含む)
- パルス整形のサンプルレートへアップサンプル
- 送信機と同じパルス(RRC)で畳み込み
目標:復号した強ユーザのベースバンドにおけるきれいな参照。
復号ユーザの再構成にはcalculated_original_signalを用いる(BAT_NOMA_Receiver.pyより抜粋):
def calculated_original_signal(estimated_symbol):
estimated_Signal = np.zeros(len(estimated_symbol[0:464]), dtype='complex_')
for m in np.arange(len(estimated_symbol[0:464])):
if estimated_symbol[m] == 0:
estimated_Signal[m] = np.cdouble(complex(1, 1))
if estimated_symbol[m] == 1:
estimated_Signal[m] = np.cdouble(complex(-1, 1))
if estimated_symbol[m] == 2:
estimated_Signal[m] = np.cdouble(complex(-1, -1))
if estimated_symbol[m] == 3:
estimated_Signal[m] = np.cdouble(complex(1, -1))
sub_signal = np.zeros(len(estimated_Signal) * 4, dtype=np.complex64)
j = 0
while j <= len(sub_signal) - 1:
if j % 4 == 0:
sub_signal[j] = estimated_Signal[int(j / 4)]
else:
sub_signal[j] = 0
j = j + 1
sub_signal = np.convolve(sub_signal, rcos)
return np.array(sub_signal, dtype=np.cdouble)
続いて保存したPLL参照による位相補正、移動平均スケーリング、減算(同一ファイル内のSICブロック)。
受信振幅へのスケーリング
再構成は実際の受信成分の振幅・位相に合わせる必要がある。振幅がドリフトする場合はシンボルピークの移動平均(またはチャネル推定)でスケールを頑健に設定する。
何を減算するか
SICでは通常、生ADCサンプルを盲目的に減算しない;マッチドフィルタ後・同期済みチェーンを用いる――そこで強ユーザの形が復号シンボル列と最もよく整合する。
整合がなければ大きな残留が残り、第二ユーザは隠れたままとなり実用上NOMAは失敗する。
なぜこれほどの手間か
タイミング、周波数、位相、振幅の推定が不正確なら再構成は重畳受信波形と一致せず、減算が誤り、誤りが後段のSICに伝播する。
第5章 逐次干渉キャンセル(SIC)の詳細
逐次干渉キャンセル(SIC)は、NOMAを実用的にする機構である。
第4章で処理チェーンを用意した;ここでは重畳したユーザ寄与を実際に分離する。
目標:合成受信信号を成分に分解する――あるいは弱いユーザが復調できるほど順次に分離する。
基本原理
ベースバンドで二ユーザいれば受信信号は次のように書ける。
\[ r(t) = s_1(t) + s_2(t) + n(t) \]
- \(s_1(t)\):支配的ユーザ
- \(s_2(t)\):弱いユーザ
- \(n(t)\):雑音(およびモデル化する残留干渉)
SICの考え方:強い項\(s_1\)を推定・復調 → 再構成 → 受信波形から減算 → \(s_2\)が次の復調パスでより見えやすくなる。
アルゴリズムの流れ
ステップ1――支配層の検出
第4章の前処理の後、信号は同期され周波数オフセットはおおまかに補正され、マッチドフィルタ後には判定に適した波形がある。
最も強い層は最初は単一ユーザリンクのように復調できる。
注意:弱いユーザは追加の雑音/干渉のように振る舞う。電力分割とチャネル品質が適切ならBERは低いままである。
ステップ2――シンボルベースの再構成
復調シンボルは複素星座点に写る。QPSKの例(実装どおり;Grayマッピングが典型):
- \(00 \rightarrow 1 + j\)
- \(01 \rightarrow -1 + j\)
- \(11 \rightarrow -1 - j\)
- \(10 \rightarrow 1 - j\)
(第4章の拡張アルファベットではヌルシンボル\((0,0)\)が現れうる。)
結果:I/Q上の離散シンボル列。
ステップ3――アップサンプリング
シンボル列をパルス整形のサンプルレートに戻す:シンボルあたり複数サンプル(理想的には間にゼロ)――連続送信パルスを再構築するために必要。
ステップ4――パルス整形(送信波形の再構成)
アップサンプルしたシンボル列を送信機と同様にパルス形状で畳み込む。
\[ s_{\mathrm{rek}}(t) = s_{\mathrm{sym}}(t) \ast h(t) \]
ここで\(h(t)\)はルートレイズドコサインのインパルス応答(TX側)。結果はベースバンドにおける強ユーザの干渉のない送信波形に近似する――スケールとチャネル位相までは次の段で整合する。
ステップ5――重要:スケーリング
実務は素朴な理論から外れることが多い。
素朴(悪い):生の受信ピークだけでスケール――雑音、重畳、SDR/AGCの変動では問題になる。
実用的:例えばシンボルピークの移動平均(または頑健なチャネル振幅推定)。利点:外れ値が減り、NOMA重畳下でもフィットが安定し、時間追跡できる。
ステップ6――減算
ベースバンドでの実際のSIC段:
\[ r_{\mathrm{neu}}(t) = r(t) - \alpha \cdot s_{\mathrm{rek}}(t) \]
\(\alpha\)は振幅・位相の整合をまとめたもの(複素でもよい;実装依存)。
重要:ここでの\(r(t)\)は前処理済みの信号――フィルタ・同期済みであり生ADCストリームではない。受信と再構成の間でタイミングとパルス形状が一致する。
結果:支配的ユーザはほぼ除去され;弱いユーザは残留に現れる。
whole_rxの位相補正の後、ノートブックはSic_Signalを振幅ピークの移動平均でスケールしセグメントから減算する;続いて第二ユーザの周波数オフセットを補正する(BAT_NOMA_Receiver.pyより抜粋):
Sic_Signal = calculated_original_signal(estsymb)
for o in np.arange(whole_rx.shape[0] - 50 - 48):
whole_rx[o + 50] *= np.exp(-1j * refph[int(o / 4)])
start_value = (np.mean(np.abs(rx[i0:i0 + 64 * 4:4].real)))
for i in np.arange(0, 1914):
new_value = (39 * start_value + np.abs(whole_rx[int(i / 4) + 40].real)) / 40
Sic_Signal[i + 40] = Sic_Signal[i + 40] * start_value * 1.1
start_value = new_value
rx[i0 - 50:i0 + 464 * 4 + 48] = whole_rx[0:464 * 4 + 50 + 48] - Sic_Signal
rx[i0:i0 + 464 * 4] = rx[i0:i0 + 464 * 4] * np.exp(
-1j * (-1 * ph0) - 2j * np.pi * ((-1) * f0) / fft_len * np.arange(i0, i0 + 4 * symbols.shape[0]))
i0、ph0、f0、estsymb、refphは同一スクリプトのプリアンブル/PLLチェーンから得る。
誤差の増幅
減算は完全ではない。原因には次が含まれる。
- 雑音
- 残留位相・周波数誤差
- \(\alpha\)の不正確さや誤ったチャネル推定
- 同期誤差
残留成分は第二ユーザを強く乱し、第一SIC段の後の復調を悪化させうる。
実務上の最適化(エンジニアリングメモ)
1. 常に条件付け済みチェーン上で減算する
フィルタ済み、タイミング・周波数補正済みデータで減算する――生サンプルではない。これが「SICが動く」と「動かない」の差になることが多い。
2. 位相ロックループ(PLL)
問題:位相ドリフト → 再構成が受信波形と一致しなくなる。
対策:PLLまたは同等の追跡で連続的に位相補正――長いパケットでも整合と減算が大幅に改善する。
3. 複数ユーザでの周波数オフセット
問題:TXチェーンが異なると残留オフセットも異なり;ユーザ1を復号した後も残差は回転しうる。
対策:第一SIC段の後にオフセットを再推定し、ユーザ2を復調する前に再同期する。
4. セグメントを全バッファへ戻す接続
時間スライスだけを処理する場合、結果を一貫して書き戻す必要がある――二ユーザ超や複数バーストで重要になる。
最適化で得られたもの
本セットアップではこれらの段が支配的干渉を実質的に低減した(測定ではおおよそ約6倍の信号低減のオーダー)し分離を改善した――なければSICは実用的に使えなかった。
正確な係数はSNR、電力比、実装に依存する;相対的な改善が重要である。
SICの限界
SICは次に敏感である。
- 誤った電力比
- 高雑音
- 不正確な同期
重大:第一ユーザの復号が誤れば再構成も誤り、減算が残留を損ない第二ユーザは使えなくなる――古典的な誤り伝播である。
主な要点
SICは単に「信号を一つ引く」ことではない。復調、再構成、振幅/位相整合、減算という精密なパイプラインであり――誤りはすべて後段を圧迫する。
第6章 実機でのNOMA運用
信号処理とSICの詳細のあと、本章では具体的な実験室セットアップでNOMAをどう実装・検証したか述べる。
焦点:実際の重畳、両ユーザの検出、SICの適用、弱いユーザの実用的な復号。
試験構成
システムは次からなる。
- 送信機2台(それぞれSDR一台)
- 受信機1台(SDR)
- 数メートル離れたアンテナ
シナリオ(電力領域):
- TX1 → 送信電力が高い(「遠い」/弱いチャネルを模す)
- TX2 → 送信電力が低い(近い/強い経路)
効果:受信機はユーザ間で支配関係の異なるNOMA様の重畳を見る。
下の写真はアンテナとSDRを載せた実験台である。
課題:真に同時の送信
二信号を同時に送ることは、聞こえより実際は難しい。
制御にTCPを用いた――遅延は小さいが可変である。バーストは非常に短く(ミリ秒オーダー)、わずかなジッタも効く。
目標:トリガが不完全でも受信機で両バーストの時間的重なりを最大化する。
小さな制御スクリプト(またはフローグラフブロック)が両TX経路に「今送れ」コマンドを並列または順に送る。TCPバッファとOSスケジューリングのため二つのRFバーストの絶対時刻は決定的ではない;受信機でのプリアンブル相関が混合物の中から各寄与を見つけるために不可欠であり――SIC後のユーザ2についても再び必要になる。
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket2.connect(("192.168.1.153", 9092)) # second PC
clientSocket.connect(("localhost", 9092))
while i < 1:
time.sleep(0.2)
clientSocket2.send(send_zeros)
clientSocket2.send(frame)
clientSocket2.send(send_zeros)
time.sleep(0.01)
clientSocket.send(send_zeros)
clientSocket.send(frame)
clientSocket.send(send_zeros)
IP/ポートは環境に合わせて調整する;frameはadjust_data後のペイロードバイトにヌルシンボル埋めを加えたもの。
重畳信号の受信
ベースバンドのキャプチャは予想どおり次を示す。
- 包絡線が一定でない
- はっきりした変動がある
- 生トレースにきれいな単一ユーザのシンボル構造はない
解釈:複数ユーザが重畳する――この波形がプリアンブル探索とSICへの入力である。
ステップ1――第一信号の検出(プリアンブル)
第4/5章と同様:既知プリアンブルと相互相関する。
結果:強いピーク → 最初の利用可能セグメント/評価バーストの開始。
時間波形の読み方
初期サンプルは穏やかに見え、後半は「引き裂かれた」ように見える。
解釈:初期は一方のユーザが支配し、後半は第二ユーザとの重なりが増す――オフセットや重なるバーストと整合する。
ステップ2――支配ユーザの復号
強いユーザを先に復調する。
観察:重なりがあってもまだ復号可能;シンボル位相はかなり安定。
推定BER(オーダー):非常に低く、およそ\(5 \cdot 10^{-3}\)(ビット誤り約0.5%)――SNRとバースト整合に依存。
ステップ3――SICの適用
支配的寄与は定番の手順で除去:再構成(シンボル→パルス)、スケール、条件付け済み受信バッファから減算。
減算の効果
減算後、残留振幅は下がり構造が変わる。
重要:第二ユーザがより見えるようになる――支配層の下に「隠れていた」からである。
ステップ4――第二信号の検出
残留に対して再びプリアンブルと相互相関する。
観察:新しいピークが現れる;残留中のユーザ1のエネルギーははるかに低い。
結論:本セットアップでSICチェーンが機能する証拠――ユーザ2が再び見つけられる。
ステップ5――第二信号の復号
弱いユーザを復調する。
観察:ユーザ1より雑音が多く、シンボル角度は不安定。
推定BER:より高くオーダー\(10^{-2}\)(約1%)――SIC後の残留干渉と低い有効SNRから予想される。
第二ユーザが難しい理由
- 不完全な減算による残留誤差
- 実験での非理想的な重なり/タイミング
- 雑音が弱い層をより強く打つ
典型的なNOMAの振る舞い:第二段は常に壊れやすい。
総合評価
- 成功:両信号を検出し分離できた。
- 成功:本セットアップで重畳をSICにより実用的に分離できた。
- 限界:ユーザ2の品質はユーザ1を大きく下回る――理論とSICの誤り伝播が予測するとおり。
実務上の教訓
- NOMAはハードウェアで動く――シミュレーションだけではない;ここでは実際の重畳SDR波形を分離できた。
- 電力比:ギャップが大きすぎると弱ユーザが埋もれる;小さすぎると支配が崩れ第一復調が損なわれる。
- 同期:わずかなタイミング誤差でも影響が大きい――短いパケットではとくに。
- SICがボトルネック:減算品質がユーザ2の実用性をほぼ決める。
エンジニアリングメモ
理論と実践はずれる。
本試験で典型的な実効果:
- TCP制御によるジッタと遅延
- 不安定な振幅(AGC、ハード、クリッピング)
- 完全に同時・完全に重なるバーストはない
- 追加のハード不完全性(オフセット、位相)
だから第4~5章のフィルタ、同期、スケール、PLLは「余分なオプション」ではなく――SICを安定させるために必須だった。
第7章 評価とシステム性能
試験台でNOMAを動かしたあとの中心的な問いは次である。
実際に信号をどれだけ確実に分離できるか?
最も重要なのは二つの量である。
- ビット誤り率(BER)
- ユーザ電力比への依存
主要指標としてのBER
BERは誤ったビットの割合である。
\[ \mathrm{BER} = \frac{\text{誤ビット数}}{\text{総ビット数}} \]
BERが低いほど、与えた条件下で復号がよい。
受信機ノートブックは参照symbolsに対するシンボル偏差からBERを形成する(BAT_NOMA_Receiver.pyより抜粋):
error_sum = 0
for l in np.arange(symbol_len):
error = ((estsymb[l] - symbols[l] + 8) % 4)
if error == 3:
error = 1
error_sum = error_sum + error
BER = error_sum / (symbol_len * 2)
BERが0.1未満のバーストを正常受信と数える(評価メモに従う)。
ユーザ1(支配的)の結果
強いユーザは重畳キャプチャから直接復号する。
観察:シンボル判定は非常に安定;ユーザ2の干渉は中程度にとどまり誤り率は低い。
典型的な実験室値:\(\mathrm{BER} < 0.01\)(1%未満)。
解釈(信号1)
支配層は有効振幅が最大で頑健であり、第一段ではユーザ2は主として追加の擾乱のように振る舞う。
ユーザ2の結果(SIC後)
弱いユーザは支配ユーザを減算した後にのみ評価する。
観察:ばらつきがはるかに大きく、許容差への感度が高く、SIC品質と雑音への依存が強い。
典型的なBER範囲:およそ\(0.01\)~\(0.1\)、電力比とバースト品質に強く結びつく。
ユーザ2がより誤る理由
- SICが不完全または不正確
- ユーザ1からの残留成分
- 雑音
- 残留同期誤差
本実装の主な限界はここである:第二段がほぼすべての脆さを背負う。
電力比の影響
実験の主なつまみは受信電力の比である。支配ユーザを\(P_1\)、弱いユーザを\(P_2\)(いずれも受信機で測定)とし、
\[ R = \frac{P_2}{P_1} \]
と定義する(厳密な定義は実験室ログに従う)。
測定が示すこと
明瞭な最適がある:本ランでは最良の\(R\)はおよそ\(0.4\)~\(0.5\)であった。
最適域の外
- ユーザ1が支配的すぎる(\(R\)が小さすぎる):ユーザ2は強くマスクされSIC後も回復が難しい。
- ユーザ1が弱すぎる(\(R\)が大きすぎる):第一復調が誤りやすくSICチェーンが崩れ――誤りが伝播する。
解釈
ここでのNOMAはかなり狭い電力窓でのみ機能する――実務上最も重要な教訓の一つである。
BERのばらつき
有利な\(R\)領域では:
- 信号1:非常に安定、外れ値少なく一貫して復号可能。
- 信号2:ばらつきが広い――バーストによってはずっとよく、ずっと悪い。
中央値(信号2、評価データセット):およそ\(\mathrm{BER} \approx 0.08\)。
成功率
バーストを「正常受信」とした条件:
基準:\(\mathrm{BER} < 0.1\)。
結果(実験):
- 全設定を通じ:条件を満たしたのは約34%、
- 最適電力領域では:約60%。
解釈
セットアップはNOMAとしてあるべき振る舞いをするが、厳しいIoT目標に十分な信頼性はまだない――電力比と信号品質に非常に敏感である。
主なシステム限界
- 不安定な電力分割:SDR/AGC振幅が時間とバースト間でドリフトする。
- SICの不完全性:減算は完全ではなく残留が第二段を損なう。
- 雑音とチャネル:両ユーザに影響;弱い層にはより悪い。
- 同期誤差:タイミングと周波数は理想ではない――小さなオフセットが短いパケットで大きな影響を持つ。
要点
- NOMAはパラメータに依存が大きい――よいセットアップがなければ性能は急速に落ちる。
- SICが決定的段――減算品質が成功をほぼ決める。
- 第二ユーザは常により難しい――有効SNRが低く、第一段の後により劣化する。
より頑健なシステムへ
同様のセットアップをはるかに信頼させるには、次の追加が有効である。
- 前方誤り訂正(FEC)と任意でインタリーブ
- 適応的電力またはレート制御(\(R\)とデータレートの調整)
- よりよい同期(トリガを締め、TCPジッタの代わりに共通基準)
- 研究用装置:チャネルと残留干渉の学習型または反復型SIC改良
本章のまとめ
NOMAは実験室では動く――しかしプラグアンドプレイではない。
- 最適電力領域ではよい結果が得られうる。
- 実務的限界はSIC残留、雑音、同期として現れる。
- 性能はシステムパラメータ――とくに\(P_2/P_1\)と第一段復調品質――に強く依存する。
第8章 まとめと展望
本章では実験台の結果を要約し、技術的展望に位置づける。追加プロットは意図的に省略する;主要な曲線は第7章にある。
要約
本稿は、非直交多元接続(NOMA)をソフトウェア無線でどう実装し実験室で検証できるかを示す。
核となる考え:複数ユーザが同一帯域で同時に送信し、分離は受信機で――主に逐次干渉キャンセル(SIC)によって行う。
構築で確認できたこと:
- 重畳波形は剥がして実用的な単一ユーザストリームに戻せる。
- 前処理とスケーリングが適切ならSICは実際のSDRチェーンで機能する。
- 支配ユーザを減算した後、第二の弱いユーザを顕在化し復調できる。
結論:NOMAは教科書の概念にとどまらず――制御されたセットアップで実証できる。
理論と実践
重要な教訓:理論は実験室より簡単に聞こえる。
NOMAの原理は短く述べられるが、実チェーンは次を示す。
- 信号は雑音があり非理想的である。
- 振幅は変動する(AGC、ハード、クリッピング)。
- 周波数誤差と位相誤差は常にある。
- 同期は完全ではない――短いバーストと外部トリガではとくに。
帰結:フィルタ、同期、位相、振幅処理が密に揃って初めてSICは成功する。
主な技術的教訓
- 電力比:成功を決める――ギャップが大きすぎると弱ユーザが隠れ、小さすぎると支配と第一段検出が崩れる。狭い最適がある(第7章)。
- 中核はSIC:減算品質がほぼすべてを決め;小さな再構成誤差が第二ユーザを強く損なう。SICがボトルネックである。
- DSPの比重:難しいのは「RF単体」よりその後の処理――フィルタ、同期、位相追跡、スケーリングがこの形のNOMAを可能にする。
- 弱いユーザ:第二信号は物理的にも算法的にも不利――雑音が多く感度高く再構成も難しい。これは符号のミスではなく電力領域NOMA+SICの性質である。
NOMAが役立ちうる場面
課題はあるが、NOMAは将来の高密度無線展開に潜在力を持つ。
- IoT:多数デバイスが並行し、レートは中程度、スペクトラム効率への関心が高い。
- スマートシティ:センサ群、交通・インフラデータ――デバイス数は多く資源は限られる。
- 低エネルギーリンク:直交割当を硬くしすぎないとオーバーヘッドを削れる――慎重な電力計画と頑健な受信機と組み合わせて。
考えられる改善
NOMAを展開に耐えるものにするには:
- 適応的電力制御:送信機が電力を調整し最適比をより安定させる。
- SIC/チャネルへの機械学習:残留干渉とチャネルへのニューラルまたは反復推定器――雑音とモデル誤差に頑健(研究/試作段階)。
- FEC:第二ユーザ経路のBERを下げSIC残留を大きく和らげる。
- よりよい同期:時間/周波数ロックを締める(共通基準、よりよいトリガ)→ 減算前の誤差を小さくする。
エンジニアリング上の省察
実務で最も難しいのはめったに「理論の欠如」ではなく実装の細部である。
典型的に見えにくい効果:
- 小さなタイミングのずれ
- わずかな位相オフセット
- 不安定な振幅
- 非理想ハード(オフセット、ドリフト)
これらの細部がデモが動くか崩れるかをしばしば決める。
締めの考え
NOMAは現代の無線がアルゴリズムとDSPに大きく依存すること――アンテナと増幅器だけではないことを改めて示す。
RF、ソフトウェア、モデルを組み合わせることでスペクトラムをより効率よく使う道が開く。
最後に
述べたセットアップはDSP、空中伝送、システム統合を結びつけ、概念がどう測定可能になるかを示す。
理論・実装・測定のつながりは、進化するIoTと通信システムにとって重要である――NOMAが標準にまさにこの形で入るか、多くの道具の一つにすぎないかにかかわらず。
著者: Kryentech の Ruedi
作成: 2026年4月6日 · 最終更新: 2026年4月6日
技術的内容は最終更新時点のものです。