comm.OFDMDemodulator
OFDM 法を使用した復調
説明
comm.OFDMDemodulator
System object™ は、直交周波数分割多重 (OFDM) 法を使用して時間領域信号を復調します。詳細については、OFDM 復調を参照してください。出力は、対になる comm.OFDMModulator
オブジェクトへの入力のベースバンド表現です。
OFDM 信号を復調するには、以下の手順に従います。
comm.OFDMDemodulator
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
構文
説明
は、直交周波数分割復調方式を使用して入力信号を変調する OFDM 復調器 System object を作成します。ofdmDemod
= comm.OFDMDemodulator
は、名前と値の引数を 1 つ以上使用してプロパティを指定します。たとえば、ofdmDemod
= comm.OFDMDemodulator(Name
=Value
)comm.OFDMDemodulator(FFTLength=128)
は、全部で 128 個のサブキャリアに対応したオブジェクトを構成します。
は、指定された OFDM 変調器オブジェクトに基づいて、OFDM 復調器オブジェクトのプロパティを設定します。ofdmDemod
= comm.OFDMDemodulator(odfmMod)
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
高速フーリエ変換 (FFT) 点の数。正の整数スカラーとして指定します。FFT の長さは、8 以上で、かつサブキャリアの数と等しくなければなりません。
左右のガード バンドに割り当てられるサブキャリアの数。2 行 1 列の整数ベクトルとして指定します。左右のガードバンド サブキャリアの数 [NleftG; NrightG] は、[0,⌊NFFT / 2 ⌋ − 1] の範囲内でなければなりません。ここで、NFFT は、OFDM 信号に含まれるサブキャリアの総数で、FFTLength
によって指定されます。詳細については、サブキャリアの割り当て、ガード バンド、およびガード インターバルを参照してください。
null DC サブキャリアを除去するオプション。数値または logical を使用して、0
(false
) または 1
(true
) として指定します。null DC サブキャリアは、周波数帯域の中心に位置し、次のインデックス値をもちます。
NFFT が偶数の場合、(NFFT / 2) + 1。
NFFT が奇数の場合、(NFFT + 1) / 2。
NFFT は、OFDM 信号に含まれるサブキャリアの総数で、FFTLength
によって指定されます。
パイロット サブキャリアを出力するオプション。数値または logical を使用して、0
(false
) または 1
(true
) として指定します。このプロパティを設定する場合、次のようになります。
false
— パイロット情報は出力データに埋め込まれたまま残ります。true
— オブジェクトはPilotCarrierIndices
で指定されたパイロット サブキャリアを出力データから分離し、復調後のパイロット信号をpilot
出力変数に出力します。
パイロット サブキャリアの位置を表すインデックス。次の範囲の整数要素値から成る列ベクトル、行列、または 3 次元配列として指定します。
ここで、NFFT はサブキャリアの総数で、FFTLength
によって指定されます。また、NleftG と NrightG は左右のガード バンドで、NumGuardBandCarriers
によって指定されます。
NPilot 個のパイロット キャリア インデックスを、各シンボルについて同じサブキャリアに割り当てることも、NSym 個の異なるサブキャリアに割り当てることもできます。また、このインデックスを NTxStreams 個の送信ストリームに割り当てることができます。
パイロット インデックスがすべてのシンボルと送信ストリームで同じ場合、プロパティの次元は NPilot-by-1 になります。
パイロット インデックスがシンボルによって異なる場合、プロパティの次元は NPilot-by-NSym になります。
受信信号が 1 つのシンボルと複数の送信ストリームに割り当てられている場合、プロパティの次元は NPilot-by-1-by-NTxStreams になります。
インデックスがシンボルの数と送信ストリームの数で異なる場合、プロパティの次元は NPilot-by-NSym-by-NTxStreams となります。
ヒント
複数の送信ストリームによる送信間の干渉を最小限にするため、各シンボルに割り当てるパイロット インデックスをストリーム間で一意にしなければなりません。
依存関係
このプロパティは、PilotOutputPort
を 1
に設定した場合に適用されます。
各 OFDM シンボルのサイクリック プレフィックス長。正の整数スカラー、または NumSymbols
個の要素から成る行ベクトルとして指定します。サイクリック プレフィックス長は、[0, NFFT] の範囲内でなければなりません。ここで、NFFT は、OFDM 信号に含まれるサブキャリアの総数で、FFTLength
によって指定されます。サイクリック プレフィックス長を指定する場合、次のようになります。
スカラー — サイクリック プレフィックス長はすべてのストリームのすべてのシンボルで同じになります。
行ベクトル — サイクリック プレフィックス長をシンボルごとに変えることができますが、ストリームごとに変えることはできません。
オーバーサンプリング係数。正のスカラーとして指定します。オーバーサンプリング係数は次の制約を満たさなければなりません。
(
OversamplingFactor
×FFTLength
) は整数値でなければならない。(
OversamplingFactor
×CyclicPrefixLength
) は整数値でなければならない。
ヒント
オーバーサンプリング係数を整数ではない有理数に設定する場合は、小数値ではなく分数値を指定します。たとえば、FFT 長が 12
で、オーバーサンプリング係数が 4/3
の場合、その積は整数の 16
となります。しかし、オーバーサンプリング係数の設定時に 4/3
を 1.333
に丸めると、その積が非整数の 15.9960
になり、このコードはエラーとなります。
データ型: double
時間周波数グリッド内の OFDM シンボルの数。正の整数スカラーとして指定します。
OFDM 変調信号の受信に使用される受信ストリームの数。64
以下の正の整数スカラーとして指定します。この値は受信アンテナの物理的な数以下でなければなりません。
使用法
説明
[
は、Y
,pilot
] = ofdmDemod(X
)PilotCarrierIndices
プロパティ値によって指定されるサブキャリアの pilot
信号を分離します。この構文を有効にするには、PilotOutputPort
プロパティを true に設定します。
入力引数
OFDM 変調されたベースバンド信号。行列 (osf × NIn)-by-NStreams として指定します。
osf は、
OversamplingFactor
によって決定されるオーバーサンプリング係数です。CyclicPrefixLength
がスカラーである場合、NCP =CyclicPrefixLength
および NIn = NSym × (NFFT + NCP) です。CyclicPrefixLength
が行ベクトルである場合、NCPTotal =sum
(CyclicPrefixLength
) および NIn = (NSym × NFFT) + NCPTotal です。NSym は、
NumSymbols
によって決定されるシンボルの数を表します。NFFT は、
FFTLength
によって決定されるサブキャリアの数を表します。NStreams は、
NumReceiveAntennnas
によって決定される受信ストリームの数を表します。NStreams は受信アンテナの物理的な数以下でなければなりません。
次元はオブジェクト関数 info
を使用して決定できます。
データ型: double
| single
複素数のサポート: あり
出力引数
出力ベースバンド信号。入力信号と同じデータ型の行列または NDataSC×NSym×NStreams の配列として返されます。NStreams が 1
である場合、出力は行列に縮小します。
NDataSC はデータ サブキャリアの数。詳細については、オブジェクト関数
info
を参照してください。NSym はシンボルの数。
NumSymbols
によって指定される。NStreams は受信ストリームの数。
NumReceiveAntennnas
によって指定される。NStreams は受信アンテナの物理的な数以下。
詳細については、サブキャリアの割り当て、ガード バンド、およびガード インターバルを参照してください。
データ型: double
| single
複素数のサポート: あり
パイロット信号。入力信号と同じデータ型をもつ次の形式で返されます。
PilotCarrierIndices
がベクトルまたは行列である場合、次元が NPilot×NSym×NStreams の 3 次元配列。PilotCarrierIndices
が 3 次元配列である場合、次元が NPilot×NSym×NT×NStreams の 4 次元配列。
ここで、
NPilot は各シンボルのパイロット サブキャリアの数。
size
(PilotCarrierIndices
,1
) によって指定される。NSym はシンボルの数。
NumSymbols
によって指定される。NStreams は受信ストリームの数。
NumReceiveAntennnas
によって指定される。NStreams は受信アンテナの物理的な数以下です。NT は、送信アンテナの数です。
依存関係
この出力を返すには、PilotOutputPort
プロパティを true
に設定します。
データ型: double
| single
複素数のサポート: あり
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
既定のプロパティを使用して OFDM 復調器 System object™ を作成します。プロパティの一部を変更します。オブジェクト関数info
を使用して、オブジェクトの構成を調べます。
ofdmDemod = comm.OFDMDemodulator
ofdmDemod = comm.OFDMDemodulator with properties: FFTLength: 64 NumGuardBandCarriers: [2×1 double] RemoveDCCarrier: false PilotOutputPort: false CyclicPrefixLength: 16 OversamplingFactor: 1 NumSymbols: 1 NumReceiveAntennas: 1
info(ofdmDemod)
ans = struct with fields:
InputSize: [80 1]
DataOutputSize: [53 1]
サブキャリアの数、シンボルの数、および受信ストリームの数を変更します。また、パイロット出力を有効にします。
ofdmDemod.FFTLength = 128; ofdmDemod.PilotOutputPort = 1; ofdmDemod.NumSymbols = 2; ofdmDemod.NumReceiveAntennas = 2;
サブキャリアの数とシンボルの数が変更されたことを確認します。オブジェクト関数info
を使用して、入力信号と出力信号の次元を再度調べます。情報構造体にパイロット出力の次元が追加されていることに注意してください。受信ストリームの数が 1 より大きいため、データとパイロット出力の次元は行列ではなく 3 次元配列になっています。
ofdmDemod
ofdmDemod = comm.OFDMDemodulator with properties: FFTLength: 128 NumGuardBandCarriers: [2×1 double] RemoveDCCarrier: false PilotOutputPort: true PilotCarrierIndices: [4×1 double] CyclicPrefixLength: 16 OversamplingFactor: 1 NumSymbols: 2 NumReceiveAntennas: 2
info(ofdmDemod)
ans = struct with fields:
InputSize: [288 2]
DataOutputSize: [113 2 2]
PilotOutputSize: [4 2 2]
構成済みの変調器を使用して復調器を作成することで、変調器と復調器のペアを必ず整合させることができます。
4 つの送信ストリームを指定して、OFDM 変調器を作成します。
ofdmMod = comm.OFDMModulator(NumTransmitAntennas=4);
OFDM 変調器を使用して OFDM 復調器を作成します。
ofdmDemod = comm.OFDMDemodulator(ofdmMod);
OFDM 変調器と OFDM 復調器のプロパティを表示し、適用可能なプロパティが一致するか確認します。送信ストリームの数は、受信ストリームの数とは無関係です。
ofdmMod
ofdmMod = comm.OFDMModulator with properties: FFTLength: 64 NumGuardBandCarriers: [2×1 double] InsertDCNull: false PilotInputPort: false CyclicPrefixLength: 16 Windowing: false OversamplingFactor: 1 NumSymbols: 1 NumTransmitAntennas: 4
ofdmDemod
ofdmDemod = comm.OFDMDemodulator with properties: FFTLength: 64 NumGuardBandCarriers: [2×1 double] RemoveDCCarrier: false PilotOutputPort: false CyclicPrefixLength: 16 OversamplingFactor: 1 NumSymbols: 1 NumReceiveAntennas: 1
showResourceMapping
オブジェクト関数は、送信ストリームごとの時間周波数リソース マッピングを表示します。
OFDM 復調器を作成します。
demod = comm.OFDMDemodulator;
オブジェクト関数 showResourceMapping
を使用して OFDM サブキャリア マッピングを表示します。
showResourceMapping(demod)
DC サブキャリアを取り除きます。
demod.RemoveDCCarrier = true;
DC サブキャリアを取り除いた後のリソース マッピングを表示します。
showResourceMapping(demod)
DC null が挿入され、保護帯域のサブキャリアが 7 つ、パイロット インデックスが異なるシンボルが 2 つある OFDM 変調器を作成します。
ofdmMod = comm.OFDMModulator( ... NumGuardBandCarriers=[4; 3], ... PilotInputPort=true, ... PilotCarrierIndices=cat(2,[12; 26; 40; 54],[11; 27; 39; 55]), ... NumSymbols=2, ... InsertDCNull=true);
入力データ、パイロットおよび出力データの次元を決定します。
modDim = info(ofdmMod)
modDim = struct with fields:
DataInputSize: [52 2]
PilotInputSize: [4 2]
OutputSize: [160 1]
OFDM 変調器のランダム データ シンボルを生成します。構造体変数 modDim
を使用してデータ シンボルの数を決定します。
dataIn = complex( ...
randn(modDim.DataInputSize),randn(modDim.DataInputSize));
正しい次元をもつパイロット信号を作成します。
pilotIn = complex( ...
rand(modDim.PilotInputSize),rand(modDim.PilotInputSize));
OFDM 変調をデータ信号とパイロット信号に適用します。
modSig = ofdmMod(dataIn,pilotIn);
OFDM 変調器オブジェクトを使用して、対応する OFDM 復調器を作成します。
ofdmDemod = comm.OFDMDemodulator(ofdmMod);
OFDM 信号を復調し、データ信号とパイロット信号を出力します。
[dataOut,pilotOut] = ofdmDemod(modSig);
入力データ シンボルおよび入力パイロット シンボルが出力データ シンボルおよび出力パイロット シンボルと一致することを確認します。
isSame = (max(abs([dataIn(:) - dataOut(:); ...
pilotIn(:) - pilotOut(:)])) < 1e-10)
isSame = logical
1
4 倍のサンプル レートで生成されたデータおよびパイロットの入出力の OFDM 変調信号を、単入力単出力 (SISO) チャネルを通してフィルター処理します。チャネルでフィルター処理した信号を復調し、元の信号と比較します。
3 つのシンボルをもち、シンボルごとに異なるパイロット サブキャリア インデックスとサイクリック プレフィックス長が設定された OFDM 復調器オブジェクトを作成します。
ofdmDemod = comm.OFDMDemodulator( ... NumGuardBandCarriers=[9;8], ... RemoveDCCarrier=true, ... PilotOutputPort=true, ... PilotCarrierIndices=[[12;26;40;54],[14;28;38;52],[12;26;40;54]], ... CyclicPrefixLength=[16 32 16], ... OversamplingFactor=4, ... NumSymbols=3);
OFDM 変調器 System object を OFDM 復調器オブジェクト ofdmDemod
から作成します。
ofdmMod = comm.OFDMModulator(ofdmDemod);
オブジェクト関数showResourceMapping
を使用して、データ、パイロット、ガード バンド、および null 信号について構成されたサブキャリア リソースのマッピングを表示します。オブジェクト関数info
を使用して、入力と出力の次元情報を取得します。
showResourceMapping(ofdmDemod);
modDim = info(ofdmMod);
ランダム データとパイロットの入力を作成し、QAM 変調を適用します。
M = 16; xd = randi([0 M-1],modDim.DataInputSize); dataIn = qammod(xd,M,UnitAveragePower=true); xp = randi([0 M-1],modDim.PilotInputSize); pilotIn = qammod(xp,M,UnitAveragePower=true);
データとパイロットの QAM 信号に対し、OFDM 変調を適用します。AWGN チャネルを通して信号をフィルター処理します。データとパイロットのシンボルを復元するため、OFDM 復調を適用してから QAM 復調を適用します。
modOut = ofdmMod(dataIn,pilotIn);
chanOut = awgn(modOut,20,"measured");
[dataOut, pilotOut] = ofdmDemod(chanOut);
yd = qamdemod(dataOut,M,UnitAveragePower=true);
yp = qamdemod(pilotOut,M,UnitAveragePower=true);
この処理によってデータとパイロットが変わっていないことを確認します。
dataSame = isequal(xd,yd)
dataSame = logical
1
pilotSame = isequal(xp,yp)
pilotSame = logical
1
アルゴリズム
直交周波数分割多重 (OFDM) メソッドは、N 個の並列データ ストリームを提供する FFT 演算を使用して、OFDM 入力信号を復調します。
次の図は、N 個の一連の相関器から構成されている OFDM 復調器を示しています。この復調器では、各 OFDM サブキャリアに 1 つの相関器が割り当てられています。一連の相関器の後に、パラレルからシリアルへの変換が行われます。
個々の OFDM サブキャリアは、データ、パイロット、または null サブキャリアとして割り当てられます。
以下に示すように、サブキャリアは、データ サブキャリア、DC サブキャリア、パイロット サブキャリア、またはガードバンド サブキャリアとして指定されています。
データ サブキャリアは、ユーザー データを送信します。
パイロット サブキャリアは、チャネル推定に使用されます。
null サブキャリアは、データを送信しません。データをもたないサブキャリアは、DC null を提供し、OFDM リソース ブロック間のバッファーとして機能します。
null DC サブキャリアは、周波数帯域の中心であり、
nfft
が偶数の場合は (nfft
/2 + 1)、nfft
が奇数の場合は ((nfft
+ 1) / 2) のインデックス値をもちます。ガード バンドでは、隣り合う帯域内の隣接する信号間にバッファーを提供することで、スペクトル漏れによって発生する干渉を低減します。
null サブキャリアでは、さまざまな 802.11 形式や LTE、WiMAX などの特定の規格またはカスタム割り当ての保護帯域と DC サブキャリアの位置をモデル化できます。null サブキャリア インデックスのベクトルを割り当てることで、null の位置を割り当てることができます。
ガード インターバルは、ガード バンドと同様に、符号間干渉を低減して OFDM 送信信号の整合性を確保します。
保護間隔の割り当ては、保護帯域の割り当てに似ています。保護間隔をモデル化して、OFDM シンボル間に時間的な区切りを設けることができます。保護間隔は、時間分散チャネルを介して信号を渡した後にシンボル間の直交性を保持するうえで役立ちます。ガード インターバルを作成するには、サイクリック プレフィックスを使用します。サイクリック プレフィックスの挿入では、OFDM シンボルの最後部が次の OFDM シンボルの最前部としてコピーされます。
サイクリック プレフィックスの挿入が OFDM に与える効果は、時間分散のスパンがサイクリック プレフィックスの期間を超えない限り有効です。
サイクリック プレフィックスはデータ送信に使用される可能性のある帯域幅を占めるため、サイクリック プレフィックスの挿入によりユーザー データのスループットがわずかに低下します。
参照
[1] Dahlman, E., S. Parkvall, and J. Skold. 4G LTE/LTE-Advanced for Mobile Broadband. London: Elsevier Ltd., 2011.
[2] Andrews, J. G., A. Ghosh, and R. Muhamed. Fundamentals of WiMAX. Upper Saddle River, NJ: Prentice Hall, 2007.
[3] IEEE® Standard 802.16-2017. "Part 16: Air Interface for Broadband Wireless Access Systems." March 2018.
拡張機能
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)を参照してください。
バージョン履歴
R2014a で導入入力信号が single 型だった場合、オブジェクトによる計算は単精度でネイティブに行われ、返される出力も single 型になります。
comm.OFDMDemodulator
は、オーバーサンプリングをサポートするようになりました。
参考
関数
オブジェクト
ブロック
関数
トピック
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)