メインコンテンツ

ソフトウェア無線機を使用した OFDM 送信機

この例では、ソフトウェア無線機 (SDR) を使用して、単一入力単一出力 (SISO) チャネル用の直交周波数分割多重 (OFDM) 送信機を設計する方法を示します。

この例では、一般的な同期信号、参照シンボル、制御チャネル、およびデータ チャネルを模倣する OFDM システムの物理層伝送プロトコルについて詳しく説明します。OFDM 伝送システムの処理には、巡回冗長検査 (CRC)、符号化、スクランブリング、畳み込み符号化、変調、フィルター処理、チャネル歪みが含まれます。

ソフトウェア無線機を使用した OFDM 受信機の例では、この例で送信された OFDM 信号を受信して復調します。

必要なソフトウェアとハードウェア

この例を実行するには、次に示すハードウェアのいずれか、およびそれらに対応するサポート パッケージが必要です。

OFDM フレーム パラメーターの設定

FFT 長、サイクリック プレフィックス長、サブキャリア数などの OFDM パラメーターを設定します。パイロット サブキャリア間隔とチャネル帯域幅のパラメーターは、それぞれ 30 KHz と 3 MHz に固定されています。

OFDM パラメーターを設定したら、データ パラメーターを設定しなければなりません。変調次数、符号化率、フレームあたりのシンボル数、および送信あたりのフレーム数を設定します。設定可能な変調スキームは BPSK、QPSK、16-QAM、設定可能な符号化率は 1/2 と 2/3 です。OFDM パラメーターとデータ パラメーターは、送信機と受信機の両方に共通でなければなりません。

可視化用のスコープは有効にも無効にもできますが、シミュレーションが長い場合はスコープを無効にすることをお勧めします。診断出力を制御するには、必要に応じて詳細を有効または無効にします。

% The chosen set of OFDM parameters:
OFDMParams.FFTLength              = 128;   % FFT length
OFDMParams.CPLength               = 32;    % Cyclic prefix length
OFDMParams.NumSubcarriers         = 90;    % Number of sub-carriers in the band
OFDMParams.Subcarrierspacing      = 30e3;  % Sub-carrier spacing of 30 KHz
OFDMParams.PilotSubcarrierSpacing = 9;     % Pilot sub-carrier spacing
OFDMParams.channelBW              = 3e6;   % Bandwidth of the channel 3 MHz

% Data Parameters
dataParams.modOrder       = 4;   % Data modulation order
dataParams.coderate       = "1/2";   % Code rate
dataParams.numSymPerFrame = 30;   % Number of data symbols per frame 20 for setup1
dataParams.numFrames      = 10000;   % Number of frames to transmit
dataParams.enableScopes   = true;                    % Switch to enable or disable the visibility of scopes
dataParams.verbosity      = false;                    % Switch to enable or disable the data diagnostic output

送信機パラメーターの初期化

OFDM 信号の送信に使用している無線機の名前を変数 radioDevice に割り当てます。受信機のゲインと動作中心周波数を設定します。

radioDevice            = "B210";  % Choose the radio device for transmission
centerFrequency        = 3e9;  % Center Frequency
gain                   = 60;  % Set radio gain

helperOFDMSetParamsSDR 関数は、OFDM シミュレーションに必要な送信機固有のパラメーターおよび送信機と受信機に共通のパラメーターを初期化し、helperGetRadioParams 関数は、送信機 System object™ 無線機に必要なパラメーターを初期化します。

[sysParam,txParam,trBlk] = helperOFDMSetParamsSDR(OFDMParams,dataParams);
sampleRate               = sysParam.scs*sysParam.FFTLen;                % Sample rate of signal
ofdmTx                   = helperGetRadioParams(sysParam,radioDevice,sampleRate,centerFrequency,gain);
Checking radio connections...
Win32; Microsoft Visual C++ version 1936; Boost_108100; UHD_4.6.0.0-vendor

---------- see libuhd version information above this line ----------
% Get the radio transmitter and spectrum analyzer system object system object for the user to visualize the transmitted waveform.
[radio,spectrumAnalyze] = helperGetRadioTxObj(ofdmTx);

送信機波形の生成

フレーム構造の送信

トランスポート ブロックには、ユーザー データと制御情報が含まれます。OFDM 送信機は、フレームごとに 1 つのトランスポート ブロックを送信します。トランスポート ブロックのサイズは、アクティブなサブキャリアの数、パイロット サブキャリアの数、変調次数、符号化率、CRC 長、符号化器の拘束長、フレームあたりのデータ シンボル数など、いくつかの要因によって異なります。

送信グリッドは、フレームごとに信号とチャネルを設定します。次の図は、FFT 長が 128 である 28 個の OFDM シンボルのうち 1 つの送信フレームを示しています。

同期シンボル (SS)

同期 (sync) 信号は、フレームの最初のシンボルとして送信されます。同期信号は、ZadOff-Chu を使用して生成された、DC を中心とした 62 サブキャリア信号で構成されます。この信号は帯域幅に依存しないように設計されています。これは、そのセルに割り当てられた帯域幅に関係なく、すべての送信機がこの信号を送信できることを意味します。この信号は、受信機が検出してセル信号を確実に検出し、フレーム境界 (フレームの開始) を識別することを目的としています。

参照シンボル (RS)

送信フレーム内の次のシンボルは参照シンボルです。参照シンボルは送信機と受信機の両方で既知であるため、受信機は受信した参照シンボルを既知の参照シンボルと比較してチャネルを推定できます。その後、受信機は、送信機と受信機との間のチャネル歪みを補正します。

ヘッダー シンボル

ヘッダー シンボルは、OFDM データ シンボルの帯域幅、サブキャリア変調スキーム、および符号化率を伝えるもので、送信されたフレームを受信機が復号化するのに役立ちます。この情報は重要であるため、可能な限り正しく復号化できるように、大きなシグナリングと符号化マージンで送信されます。そのため、シンボルは、インターリーブを広く取って符号化率 1/2 で符号化され、BPSK を使用して変調されます。チャネル歪みは時間の経過とともに変化する可能性があるため、正しく受信できる確率を最大化できるように、ヘッダー シンボルは参照シンボルの直後に送信されます。帯域幅はまだ不明であるため、ヘッダーは常に DC を中心とした 72 サブキャリア信号で送信されます。

パイロット信号

最後に、より高い送信周波数で見られる位相ジッターに対処するために、データ シンボル内の固定サブキャリア間隔でパイロットが送信され、受信機に位相基準が提供されます。

DC およびガード サブキャリア

伝送スペクトルの端にある null サブキャリアは、スペクトル エネルギーを指定された帯域幅に制限するために使用されます。DC のサブキャリアもゼロ化され、信号エネルギーがパワー アンプの線形範囲内に保たれます。

送信機の処理

Transmitter processing workflow.

データ シンボルは、フレームごとに 1 回送信される単一のデータ トランスポート ブロックを設定する単一のユーザーで構成されます。comm.CRCGenerator オブジェクトは、トランスポート ブロックのペイロードの CRC を計算し、それをペイロードに追加します。データは、comm.PNSequence オブジェクトを使用して加法的にスクランブルされ、送信スペクトル全体にデータの電力が均等に分散されます。大きな減衰によって発生するバースト エラーを防ぐため、reshape 関数を使用してインターリーブが実行されます。convenc 関数を使用して畳み込み符号化が実行され、前方誤り訂正のための冗長ビットが追加されます。データのパンクチャにより冗長ビットの数が減り、データのスループットが向上します。qammod 関数を使用してトランスポート ブロックが変調され、OFDM フレームで送信できる状態になります。すべての信号が ofdmmod 関数を使用して OFDM 変調されます。dsp.FIRFilter を使用し、さらに、firpmord および firpm フィルター設計関数で生成された係数を使用して、信号がフィルター処理されて帯域外発射が削減されます。

% Initialize transmitter
txObj = helperOFDMTxInit(sysParam);

tunderrun = 0; % Initialize count for underruns

% A known payload is generated in the function helperOFDMSetParams with
% respect to the calculated trBlkSize
% Store data bits for BER calculations
txParam.txDataBits = trBlk;
[txOut,txGrid,txDiagnostics] = helperOFDMTx(txParam,sysParam,txObj);

% Display the grid if verbosity flag is enabled
if dataParams.verbosity
    helperOFDMPlotResourceGrid(txGrid,sysParam);
end

% Repeat the data in a buffer for PLUTO radio to make sure there are less
% underruns. The receiver decodes only one frame from where the first
% synchroization signal is received
txOutSize = length(txOut);
if contains(radioDevice,'PLUTO') && txOutSize < 48000
    frameCnt = ceil(48000/txOutSize);
    txWaveform = zeros(txOutSize*frameCnt,1);
    for i = 1:frameCnt
        txWaveform(txOutSize*(i-1)+1:i*txOutSize) = txOut;
    end
else
    txWaveform = txOut;
end

if dataParams.enableScopes
    spectrumAnalyze(txOut);
end

無線での送信

for frameNum = 1:sysParam.numFrames+1
    underrun = radio(txWaveform);
    tunderrun = tunderrun + underrun;  % Total underruns
end
% Clean up the radio System object
release(radio);

その他の調査

helperOFDMSetParamsSDR 関数と helperOFDMTxInit 関数で初期化パラメーターを変更できます。同様に、helperOFDMPilotSignal, helperOFDMRefSignal, and helperOFDMSyncSignal 補助関数を変更して、それぞれカスタム パイロット信号、参照信号、同期信号を生成できます。

参考

トピック