Main Content

ofdmmod

直交周波数分割多重 (OFDM) を使用した周波数領域信号の変調

説明

ofdmSig = ofdmmod(inSym,nfft,cplen) は、nfft で指定された FFT サイズと cplen で指定されたサイクリック プレフィックス長を使用して、周波数領域入力データ サブキャリア inSym で OFDM 復調を実行します。詳細については、OFDM 変調を参照してください。

ofdmSig = ofdmmod(inSym,nfft,cplen,nullidx) は、OFDM 変調を実行する前に、null サブキャリアを周波数領域入力データ信号に挿入します。null サブキャリアは、nullidx で指定された、1 ~ nfft のインデックス位置に挿入されます。この構文では、入力 inSym の行数は nfftlength(nullidx) でなければなりません。null 搬送波は、保護帯域と DC サブキャリアを考慮するために使用します。詳細については、サブキャリア割り当て、保護帯域、および保護間隔を参照してください。

ofdmSig = ofdmmod(inSym,nfft,cplen,nullidx,pilotidx,pilots) は、OFDM 変調を実行する前に、null サブキャリアとパイロット サブキャリアを周波数領域入力データ シンボルに挿入します。null サブキャリアは、nullidx で指定されたインデックス位置に挿入されます。パイロット サブキャリア pilots は、pilotidx で指定されたインデックス位置に挿入されます。この構文では、入力 inSym の行数は nfftlength(nullidx)length(pilotidx) でなければなりません。関数は、パイロット サブキャリアの位置が各 OFDM シンボルと送信アンテナで同じと仮定します。

ofdmSig = ofdmmod(inSym,nfft,cplen,___,OvesamplingFactor=Value) は、前の構文の入力引数に加えて、オプションのオーバーサンプリング係数の名前と値の引数を指定します。アップサンプリングされた出力信号のオーバーサンプリング係数は、正のスカラーとして指定しなければなりません。さらに、積 (OversamplingFactor×nfft) と積 (OversamplingFactor×cplen) は両方とも整数にならなければなりません。OversamplingFactor の既定値は 1 です。

たとえば、ofdmmod(inSym,nfft,cplen,OversamplingFactor=2) は出力信号を係数 2 でアップサンプリングします。

すべて折りたたむ

2 つの送信アンテナで完全にパックされた入力を OFDM 変調します。

入力パラメーターを初期化し、ランダム データを生成して、OFDM 変調を実行します。

M = 16;      % Modulation order for 16QAM
nfft  = 128; % Number of data carriers
cplen = 16;  % Cyclic prefix length
nSym  = 5;   % Number of symbols per RE
nt    = 2;   % Number of transmit antennas
dataIn = randi([0 M-1],nfft,nSym,nt);
qamSig = qammod(dataIn,M,'UnitAveragePower',true);
y1 = ofdmmod(qamSig,nfft,cplen);

null サブキャリアを割り当てる OFDM 変調を適用します。

入力パラメーターを初期化し、ランダム データを生成します。

M = 16;     % Modulation order for 16QAM
nfft  = 64; % FFT length
cplen = 16; % Cyclic prefix length
nSym  = 10; % Number of symbols per RE

nullIdx  = [1:6 33 64-4:64]';
numDataCarrs = nfft-length(nullIdx);
inSym = randi([0 M-1],numDataCarrs,nSym);

データを QAM 変調します。OFDM 変調を実行します。

qamSig = qammod(inSym,M,'UnitAveragePower',true);
outSig = ofdmmod(qamSig,nfft,cplen,nullIdx);

各シンボルに適用されたサイクリック プレフィックス長が異なる入力周波数領域データ信号に OFDM 変調を実行します。

入力パラメーターを初期化し、ランダム データを生成します。

M = 16; % Modulation order for 16QAM
nfft  = 64;
cplen = [4 8 10 7 2 2 4 11 16 3];
nSym  = 10;
nullIdx  = [1:6 33 64-4:64]';
numDataCarrs = nfft-length(nullIdx);
inSym = randi([0 M-1],numDataCarrs,nSym);

データ シンボルを QAM 変調し、その QAM 信号に対して OFDM 変調を実行します。

qamSig = qammod(inSym,M,UnitAveragePower=true);
outSig = ofdmmod(qamSig,nfft,cplen,nullIdx);

2 つの送信アンテナで空間的に多重化された QPSK 信号に OFDM 変調を適用します。

入力パラメーターを初期化し、各アンテナ用のランダム データを生成します。

M = 4;      % Modulation order for QPSK
nfft  = 64;
cplen = 16;
nSym  = 5;
nt    = 2;
nullIdx  = [1:6 33 64-4:64]';
pilotIdx = [12 26 40 54]';
numDataCarrs = nfft-length(nullIdx)-length(pilotIdx);
pilots = repmat(pskmod((0:M-1).',M),1,nSym,2);

ant1 = randi([0 M-1],numDataCarrs,nSym);
ant2 = randi([0 M-1],numDataCarrs,nSym);

アンテナごとに個別にデータを QPSK 変調します。OFDM 変調を実行します。

qpskSig(:,:,1) = pskmod(ant1,M);
qpskSig(:,:,2) = pskmod(ant2,M);
y1 = ofdmmod(qpskSig,nfft,cplen,nullIdx,pilotIdx,pilots);

null およびパイロット パッキングを指定して、データ入力を OFDM 変調します。

入力パラメーターを初期化し、null サブキャリアおよびパイロット サブキャリアの位置を定義します。ランダム データを生成し、データに 16-QAM を適用し、パイロットに QSPK を適用し、OFDM 変調を実行します。

M = 16;     % Modulation order
nfft = 64;  % FFT length
cplen = 16; % Cyclic prefix length
nSym  = 10; % Number of symbols per RE

nullIdx  = [1:6 33 64-4:64]';
pilotIdx = [12 26 40 54]';

numDataCarrs = nfft-length(nullIdx)-length(pilotIdx);
dataSym = randi([0 M-1],numDataCarrs,nSym);
qamSig = qammod(dataSym,M,UnitAveragePower=true);
pilots = repmat(pskmod((0:3).',4),1,nSym);

y2 = ofdmmod(qamSig,nfft,cplen,nullIdx,pilotIdx,pilots);

OFDM 変調をシンボルに適用します。OFDM グリッドに null を挿入し、出力信号をオーバーサンプリングします。

変調次数、オーバーサンプリング係数、FFT サイズ、サイクリック プレフィックス長、および null インデックスの変数を初期化します。

M = 64;      % Modulation order
osf = 3;     % Oversampling factor
nfft = 256;  % FFT length
cplen = 16;  % Cyclic prefix length

nullidx  = [1:6 nfft/2+1 nfft-5:nfft]';
numDataCarrs = nfft-length(nullidx);

データ シンボルを生成し、QAM を適用し、データを OFDM 変調します。

x = randi([0 M-1],numDataCarrs,1);
qamSig = qammod(x,M,UnitAveragePower=true);
y = ofdmmod(qamSig,nfft,cplen,nullidx,OversamplingFactor=osf); 

入力引数

すべて折りたたむ

入力データ サブキャリア。シンボルの ND x NSym x NT の配列として指定します。データ サブキャリアの数 ND は、nfftlength(nullidx)length(pilotidx) と等しくなければなりません。NSym は、送信アンテナあたりの OFDM シンボル数、NT は送信アンテナ数です。

OFDM 変調器への入力データ シンボルは通常、qammod などのベースバンド デジタル変調器で作成されます。

データ型: double | single
複素数のサポート: あり

FFT 長。8 以上の整数として指定します。nfft は、変調処理で使用されるサブキャリアの数に相当します。

データ型: double

サイクリック プレフィックス長。スカラーまたは長さ NSym の行ベクトルとして指定します。

  • cplen をスカラーとして指定した場合、サイクリック プレフィックス長はすべてのアンテナのすべてのシンボルで同じになります。

  • cplen を長さ NSym の行ベクトルとして指定した場合、サイクリック プレフィックス長はシンボルごとに変えられますが、アンテナ長はすべて同じ長さのままです。

詳細については、サブキャリア割り当て、保護帯域、および保護間隔を参照してください。

データ型: double

null サブキャリアの位置のインデックス。1 ~ nfft の要素値をもつ列ベクトルとして指定します。

データ型: double

パイロット サブキャリアの位置のインデックス。1 ~ nfft の要素値をもつ列ベクトルとして指定します。

データ型: double

パイロット サブキャリア。シンボルの NPilot x NSym x NT の配列として指定します。NPilotpilotidx の長さに等しくなければなりません。NSym は、送信アンテナあたりの OFDM シンボルの数です。NT は、送信アンテナの数です。関数は、パイロット サブキャリアの位置が各 OFDM シンボルと送信アンテナで同じと仮定します。OFDM シンボルまたはアンテナ間でパイロット サブキャリアの位置を変えるには、comm.OFDMModulator を使用します。

データ型: double | single

出力引数

すべて折りたたむ

変調された OFDM シンボル。複素数シンボルの 2 次元配列として返されます。

  • cplen がスカラーである場合、配列サイズは ((nfft + cplen) × NSym) 行 NT 列です。

  • cplen が行ベクトルである場合、配列サイズは ((nfft × NSym) + sum(cplen)) 行 NT 列です。

    NSym は送信アンテナあたりのシンボル数、NT は送信アンテナ数です。

データ型: double | single
複素数のサポート: あり

詳細

すべて折りたたむ

OFDM 変調

OFDM は、マルチキャリア変調方式のクラスに属しています。複数のデータ ストリームを複数の搬送波で同時に送信できるため、OFDM は単一搬送波変調と同じレベルでノイズによる影響を受けません。

OFDM 演算は、送信周波数帯を N 個の連続する個別に変調したサブキャリアに分解して、高レートのデータ ストリームを低データ レートのサブストリームに分割します。複数の並列および直交サブキャリアは、広帯域チャネルとほぼ同じ帯域幅でサンプルを伝送します。狭帯域の直交サブキャリアを使用して、OFDM 信号は周波数選択性フェージング チャネルでロバスト性を獲得し、隣接サブキャリアの干渉を排除します。低データ レートのサブストリームはチャネル遅延拡散よりシンボル区間が大きいため、符号間干渉 (ISI) が低減されます。

次のイメージは、OFDM 波形における直交サブキャリアの周波数領域表現を示したものです。

送信機は、逆高速フーリエ変換 (IFFT) を一度に N 個のシンボルに適用します。通常、IFFT の出力は、N 個の直交正弦波の和です。

x(t)=k=0N1Xkej2πkΔft,0tT,

ここで、{Xk} はデータ シンボル、および T は OFDM シンボル時間です。データ シンボル Xk は通常複素数で、任意のデジタル変調アルファベット (たとえば、QPSK、16-QAM、64-QAM、...) に基づくものになります。

メモ

離散フーリエ変換の MATLAB® 実装では、IFFT の出力が 1/N で正規化されます。詳細については、ifft リファレンス ページのベクトルの離散フーリエ変換を参照してください。

サブキャリア間隔は Δf = 1/T で、次に示すようにサブキャリアはシンボル周期ごとに直交します。

1T0T(ej2πmΔft)*(ej2πnΔft)dt=1T0Tej2π(mn)Δftdt=0formn.

OFDM 変調器は、シリアルからパラレルへの変換で構成され、それぞれが各 OFDM サブキャリアに対応する一連の N 個の複素数変調器が続きます。

サブキャリア割り当て、保護帯域、および保護間隔

個々の 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 シンボルの最前部としてコピーされます。

時間分散のスパンがサイクリック プレフィックスの期間を超えない限り、サイクリック プレフィックス挿入の効果は持続します。

サイクリック プレフィックスはデータ送信に使用される可能性のある帯域幅を占めるため、サイクリック プレフィックスの挿入によりユーザー データのスループットがわずかに低下します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2018a で導入