Main Content

ofdmmod

OFDM 法を使用した変調

説明

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

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

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

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

ヒント

オーバーサンプリング係数を無理数に設定する場合は、分数値を指定します。たとえば、FFT 長が 12 で、オーバーサンプリング係数が 4/3 の場合、その積は整数の 16 となります。しかし、オーバーサンプリング係数の設定時に 4/31.333 に丸めると、その積が非整数の 15.9960 になり、このコードはエラーとなります。

すべて折りたたむ

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 を適用し、パイロットに QPSK を適用し、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); 

入力引数

すべて折りたたむ

入力データ サブキャリア。NData×NSym×NT の数値配列、dlarray (Deep Learning Toolbox) オブジェクト、または gpuArray (Parallel Computing Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

  • NData はデータ サブキャリアの数。NDatanfftlength(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×NSym×NT の配列、dlarray (Deep Learning Toolbox) オブジェクト、または gpuArray (Parallel Computing Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

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

データ型: double | single

出力引数

すべて折りたたむ

変調された OFDM シンボル。複素シンボルの 2 次元配列dlarray (Deep Learning Toolbox)、または gpuArray (Parallel Computing Toolbox) として返されます。X または pilotsdlarray の場合、出力 Ydlarray になります。dlarraygpuArray の組み合わせとして入力を指定した場合、返される行列は GPU の dlarray オブジェクトになります。詳細については、配列のサポートを参照してください。

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

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

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

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

詳細

すべて折りたたむ

配列のサポート

関数 ofdmmod は、数値配列、dlarray (Deep Learning Toolbox)、または gpuArray (Parallel Computing Toolbox) で表された入力信号をサポートします。

バッチ観測値の数 (NB) はオプションの次元で、サポートされているどのデータ タイプであってもこの入力に追加することができます。

  • X — 入力データ サブキャリアは最大 4 次元までの配列とすることができます。その場合、nfft×NSym×NT×NB の配列として指定します。

  • pilots — パイロット サブキャリアは最大 4 次元までの配列とすることができます。その場合、NPilot×NSym×NT×NB の配列として指定します。

NPilot はパイロットの数です。具体的には、pilotidx の長さです。NSym は、送信アンテナあたりの OFDM シンボルの数です。NT は、送信アンテナの数です。

アルゴリズム

すべて折りたたむ

OFDM 変調

OFDM は、マルチキャリア変調スキームのクラスに属しています。この演算では複数のキャリアを同時に送信できるため、単一キャリアの変調と比べて OFDM に与えるノイズの影響は小さくなります。

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

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

Orthagonally spaced overlapping subcarriers with nulls aligned

送信機は、逆高速フーリエ変換 (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 modulator showing serial-to-parallel conversion followed by a bank of N complex modulators, individually corresponding to each OFDM subcarrier, which are then summed

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

個々の OFDM サブキャリアは、データ、パイロット、または null サブキャリアとして割り当てられます。

以下に示すように、サブキャリアは、データ サブキャリア、DC サブキャリア、パイロット サブキャリア、またはガードバンド サブキャリアとして指定されています。

Individual data, DC, pilot, and guard-band subcarriers

  • データ サブキャリアは、ユーザー データを送信します。

  • パイロット サブキャリアは、チャネル推定に使用されます。

  • 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 symbol period

サイクリック プレフィックスの挿入が OFDM に与える効果は、時間分散のスパンがサイクリック プレフィックスの期間を超えない限り有効です。

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

拡張機能

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

バージョン履歴

R2018a で導入

すべて展開する

参考

関数

オブジェクト

ブロック