このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 でのシステム設計を参照してください。
FFTLength
— FFT 点の数
64
(既定値) | 正の整数
高速フーリエ変換 (FFT) 点の数。正の整数スカラーとして指定します。FFT の長さは、8 以上で、かつサブキャリアの数と等しくなければなりません。
NumGuardBandCarriers
— 左右のガード バンドに割り当てられるサブキャリアの数
[6; 5]
(既定値) | 2 行 1 列の整数ベクトル
左右のガード バンドに割り当てられるサブキャリアの数。2 行 1 列の整数ベクトルとして指定します。左右のガードバンド サブキャリアの数 [NleftG; NrightG] は、[0,⌊NFFT / 2 ⌋ − 1] の範囲内でなければなりません。ここで、NFFT は、OFDM 信号に含まれるサブキャリアの総数で、FFTLength
によって指定されます。詳細については、サブキャリアの割り当て、ガード バンド、およびガード インターバルを参照してください。
RemoveDCCarrier
— DC サブキャリアを除去するオプション
false
または 0
(既定値) | true
または 1
null DC サブキャリアを除去するオプション。数値または logical を使用して、0
(false
) または 1
(true
) として指定します。null DC サブキャリアは、周波数帯域の中心に位置し、次のインデックス値をもちます。
NFFT が偶数の場合、(NFFT / 2) + 1。
NFFT が奇数の場合、(NFFT + 1) / 2。
NFFT は、OFDM 信号に含まれるサブキャリアの総数で、FFTLength
によって指定されます。
PilotOutputPort
— パイロット サブキャリアを出力するオプション
false
または 0
(既定値) | true
または 1
パイロット サブキャリアを出力するオプション。数値または logical を使用して、0
(false
) または 1
(true
) として指定します。このプロパティを設定する場合、次のようになります。
false
— パイロット情報は出力データに埋め込まれたまま残ります。true
— オブジェクトはPilotCarrierIndices
で指定されたパイロット サブキャリアを出力データから分離し、復調後のパイロット信号をpilot
出力変数に出力します。
PilotCarrierIndices
— パイロット サブキャリアの位置のインデックス
[12; 26; 40; 54]
(既定値) | 列ベクトル | 行列 | 3 次元配列
パイロット サブキャリアの位置を表すインデックス。次の範囲の整数要素値から成る列ベクトル、行列、または 3 次元配列として指定します。
ここで、NFFT はサブキャリアの総数で、FFTLength
によって指定されます。また、NleftG と NrightG は左右のガード バンドで、NumGuardBandCarriers
によって指定されます。
NPilot 個のパイロット キャリア インデックスを、各シンボルについて同じサブキャリアに割り当てることも、NSym 個の異なるサブキャリアに割り当てることもできます。また、このインデックスを NT 個の送信アンテナに割り当てることができます。
パイロット インデックスがすべてのシンボルと送信アンテナで同じ場合、プロパティの次元は NPilot-by-1 になります。
パイロット インデックスがシンボルによって異なる場合、プロパティの次元は NPilot-by-NSym になります。
受信信号が 1 つのシンボルと複数の送信アンテナに割り当てられている場合、プロパティの次元は NPilot-by-1-by-NT になります。
インデックスがシンボルの数と送信アンテナの数で異なる場合、プロパティの次元は NPilot-by-NSym-by-NT となります。
ヒント
複数の送信アンテナによる送信間の干渉を最小限にするため、各シンボルに割り当てるパイロット インデックスをアンテナ間で一意にしなければなりません。
依存関係
このプロパティは、PilotOutputPort
を 1
に設定した場合に適用されます。
CyclicPrefixLength
— サイクリック プレフィックスの長さ
16
(既定値) | 正の整数 | 行ベクトル
各 OFDM シンボルのサイクリック プレフィックス長。正の整数スカラー、または NumSymbols
個の要素から成る行ベクトルとして指定します。サイクリック プレフィックス長を指定する場合、次のようになります。
スカラー — サイクリック プレフィックス長はすべてのアンテナのすべてのシンボルで同じになります。
行ベクトル — サイクリック プレフィックス長をシンボルごとに変えることができますが、アンテナごとに変えることはできません。
OversamplingFactor
— オーバーサンプリング係数
1
(既定値) | 正のスカラー
オーバーサンプリング係数。正のスカラーとして指定します。オーバーサンプリング係数は次の制約を満たさなければなりません。
(
OversamplingFactor
×FFTLength
) は整数値でなければならない。(
OversamplingFactor
×CyclicPrefixLength
) は整数値でなければならない。
ヒント
オーバーサンプリング係数を無理数に設定する場合は、分数値を指定します。たとえば、FFT 長が 12
で、オーバーサンプリング係数が 4/3
の場合、その積は整数の 16
となります。しかし、オーバーサンプリング係数の設定時に 4/3
を 1.333
に丸めると、その積が非整数の 15.9960
になり、このコードはエラーとなります。
データ型: double
NumSymbols
— Number of OFDM symbols
1
(既定値) | 正の整数
時間周波数グリッド内の OFDM シンボルの数。正の整数スカラーとして指定します。
NumReceiveAntennnas
— 受信アンテナ数
1 (既定値) | 正の整数
OFDM 変調信号の受信に使用される受信アンテナの数。64
以下の正の整数スカラーとして指定します。
使用法
説明
[
は、Y
,pilot
] = ofdmDemod(X
)PilotCarrierIndices
プロパティ値によって指定されるサブキャリアの pilot
信号を分離します。この構文を有効にするには、PilotOutputPort
プロパティを true に設定します。
入力引数
X
— OFDM 変調されたベースバンド信号
行列
OFDM 変調されたベースバンド信号。行列 (NCPTotal + NFFT × NSym)-by-NR として指定します。
NCPTotal は、すべてのシンボルのサイクリック プレフィックス長を表します。
NCP は、
CyclicPrefixLength
によって決定されるサイクリック プレフィックス長を表します。CyclicPrefixLength
がスカラーの場合、NCPTotal = NCP × NSym。CyclicPrefixLength
が行ベクトルの場合、NCPTotal = ∑ NCP。
NFFT は、
FFTLength
によって決定されるサブキャリアの数を表します。NSym は、
NumSymbols
によって決定されるシンボルの数を表します。NR は、
NumReceiveAntennnas
によって決定される受信アンテナの数を表します。
次元はオブジェクト関数 info
を使用して決定できます。
データ型: double
| single
複素数のサポート: あり
出力引数
Y
— 出力ベースバンド信号
行列 | 3 次元配列
出力ベースバンド信号。入力信号と同じデータ型の行列または NData×NSym×NR の配列として返されます。NR が 1
である場合、出力は行列に縮小します。
NData はデータ サブキャリアの数。詳細については、オブジェクト関数
info
を参照してください。NSym はシンボルの数。
NumSymbols
によって指定される。NR は受信アンテナの数。
NumReceiveAntennnas
によって指定される。
詳細については、サブキャリアの割り当て、ガード バンド、およびガード インターバルを参照してください。
データ型: double
| single
複素数のサポート: あり
pilot
— パイロット信号
3 次元配列
パイロット信号。入力信号と同じデータ型の NPilot×NSym×NR の配列として返されます。
NPilot は各シンボルのパイロット サブキャリアの数。
size
(PilotCarrierIndices
,1
) によって指定される。NSym はシンボルの数。
NumSymbols
によって指定される。NR は受信アンテナの数。
NumReceiveAntennnas
によって指定される。
依存関係
この出力を返すには、PilotOutputPort
プロパティを true
に設定します。
データ型: double
| single
複素数のサポート: あり
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
OFDM 復調器の作成と変更
既定のプロパティを使用して OFDM 復調器 System object™ を作成します。プロパティの一部を変更します。オブジェクト関数info
を使用して、オブジェクトの構成を調べます。
ofdmDemod = comm.OFDMDemodulator
ofdmDemod = comm.OFDMDemodulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 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: [2x1 double] RemoveDCCarrier: false PilotOutputPort: true PilotCarrierIndices: [4x1 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]
OFDM 変調器からの OFDM 復調器の作成
構成済みの変調器を使用して復調器を作成することで、変調器と復調器のペアを必ず整合させることができます。
4 つの送信アンテナを指定して、OFDM 変調器を作成します。
ofdmMod = comm.OFDMModulator(NumTransmitAntennas=4);
OFDM 変調器を使用して OFDM 復調器を作成します。
ofdmDemod = comm.OFDMDemodulator(ofdmMod);
OFDM 変調器と OFDM 復調器のプロパティを表示し、適用可能なプロパティが一致するか確認します。送信アンテナの数は、受信アンテナの数とは無関係です。
ofdmMod
ofdmMod = comm.OFDMModulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 double] InsertDCNull: false PilotInputPort: false CyclicPrefixLength: 16 Windowing: false OversamplingFactor: 1 NumSymbols: 1 NumTransmitAntennas: 4
ofdmDemod
ofdmDemod = comm.OFDMDemodulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 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)
OFDM データの復調
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
SISO チャネルを通した OFDM 信号のオーバーサンプリングとフィルター処理
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 復調
直交周波数分割多重 (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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)を参照してください。
バージョン履歴
R2014a で導入R2023b: single データ型のサポート
入力信号が single 型だった場合、オブジェクトによる計算は単精度でネイティブに行われ、返される出力も single 型になります。
R2023a: オーバーサンプリングのサポートの追加
comm.OFDMDemodulator
は、オーバーサンプリングをサポートするようになりました。
参考
関数
オブジェクト
ブロック
関数
トピック
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)