メインコンテンツ

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 変調します。

入力パラメーターを初期化し、すべての FFT ビンにデータ サブキャリアを割り当てて、ランダム データから成る入力信号を生成します。OFDM 変調を実行します。

M = 16;       % Modulation order for 16QAM
nfft = 128;   % FFT length
cplen = 16;   % Cyclic prefix length
nSym = 5;     % Number of symbols per RE
nStreams = 2; % Number of transmit streams
dataIn = randi([0 M-1],nfft,nSym,nStreams);
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;
nStreams = 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,nStreams);

stream1 = randi([0 M-1],numDataCarrs,nSym);
stream2 = randi([0 M-1],numDataCarrs,nSym);

ストリームごとに個別にデータを QPSK 変調します。OFDM 変調を実行します。

qpskSig(:,:,1) = pskmod(stream1,M);
qpskSig(:,:,2) = pskmod(stream2,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); 

入力引数

すべて折りたたむ

入力ベースバンド信号。NDataSC×NSym×NStreams の配列、または dlarray (Deep Learning Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

  • NDataSC はデータ サブキャリアの数です。NDataSC = nfft – length(nullidx) – length(pilotidx)

  • NSym は、送信ストリームあたりの OFDM シンボルの数です。

  • NStreams は送信ストリームの数です。送信アンテナの数以下でなければなりません。

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

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

FFT 長。8 以上の整数として指定します。nfft は、変調処理で使用されるサブキャリアの数 (NDataSC) の上限です。NDataSC = nfft – length(nullidx) – length(pilotidx)

データ型: double

サイクリック プレフィックス長。スカラーまたは長さ NSym の行ベクトルとして指定します。サイクリック プレフィックス長は非負でなければなりません。

  • cplen をスカラーとして指定した場合、値は [0, nfft] の範囲になければなりません。この場合、サイクリック プレフィックス長はすべてのストリームのすべてのシンボルで同じになります。

  • cplen を長さ NSym の行ベクトルとして指定した場合、サイクリック プレフィックス長はシンボルごとに変えられますが、ストリームごとに変えることはできません。

NSym は、ストリームあたりのシンボルの数です。

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

データ型: double

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

データ型: double

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

データ型: double

パイロット サブキャリア。シンボルの NPilot×NSym×NStreams の配列、または dlarray (Deep Learning Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

  • NPilotpilotidx の長さに等しくなければなりません。

  • NSym は、送信ストリームあたりの OFDM シンボルの数です。

  • NStreams は送信ストリームの数です。送信アンテナの数以下でなければなりません。

ヒント

関数は、パイロット サブキャリアの位置が各 OFDM シンボルと送信ストリームで同じであると仮定します。OFDM シンボル間またはストリーム間でパイロット サブキャリアの位置を変えるには、comm.OFDMModulatorSystem object™ を使用します。

データ型: double | single

出力引数

すべて折りたたむ

OFDM 変調されたベースバンド信号。複素シンボルの (osf × NOut) 行 NStreams 列の行列、または dlarray (Deep Learning Toolbox) オブジェクトとして返されます。X または pilotsdlarray の場合、出力 Ydlarray になります。詳細については、配列のサポートを参照してください。

  • osf は、OversamplingFactor によって決定されるオーバーサンプリング係数です。

  • cplen がスカラーである場合、NCP = cplen および NOut = NSym × (nfft + NCP) です。

  • cplen が行ベクトルである場合、NCPTotal = sum(cplen) および NOut = (NSym × nfft) + NCPTotal です。

  • NSym は、送信ストリームあたりのシンボルの数です。

  • NStreams は、送信ストリームの数です。送信アンテナの数以下になります。

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

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

拡張機能

すべて展開する

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

バージョン履歴

R2018a で導入

すべて展開する

参考

関数

オブジェクト

ブロック

トピック