メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ofdmdemod

OFDM 法を使用した復調

説明

Y = ofdmdemod(X,nfft,cplen) は、nfft で指定された FFT サイズと cplen で指定されたサイクリック プレフィックス長を使用し、X で指定された時間領域入力信号に対して直交周波数分割多重 (OFDM) 復調を実行します。詳細については、OFDM 復調を参照してください。

Y = ofdmdemod(X,nfft,cplen,symOffset) は、入力の復調前に、各 OFDM シンボルに対してシンボル サンプリング オフセット symOffset を適用します。

Y = ofdmdemod(X,nfft,cplen,symOffset,nullidx) は、null サブキャリアを nullidx で指定された位置から除去します。この構文では、シンボル サンプリング オフセットが各 OFDM シンボルに適用され、出力の行数は null サブキャリアの除去を考慮して nfftlength(nullidx) になります。null サブキャリアは、保護帯域と DC サブキャリアを考慮するために使用します。詳細については、サブキャリア割り当てと保護帯域を参照してください。

[Y,pilots] = ofdmdemod(X,nfft,cplen,symOffset,nullidx,pilotidx) は、pilotidx で指定されたパイロット インデックスのパイロット サブキャリアを返します。この構文では、シンボル サンプリング オフセットが各 OFDM シンボルに適用され、出力 Y の行数は、null サブキャリアとパイロット サブキャリアの除去を考慮して nfftlength(nullidx)length(pilotidx) になります。関数は、パイロット サブキャリアの位置が各 OFDM シンボルと送信ストリームで同じであると仮定します。

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

たとえば、ofdmdemod(inSym,nfft,cplen,OversamplingFactor=2) は、入力信号が係数 2 でアップサンプリングされていると仮定して復調します。

ヒント

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

すべて折りたたむ

シンボルごとに CP 長が異なる信号を OFDM 復調します。

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

M = 16;
nfft = 64;
cplen = [16 32];
nSym = 2;
dataSym = randi([0 M-1],nfft,nSym);
qamSig = qammod(dataSym,M,UnitAveragePower=true);
y1 = ofdmmod(qamSig,nfft,cplen);

OFDM シンボルを復調します。結果と元の入力データを比較します。信号間の差はごくわずかです。

x1 = ofdmdemod(y1,nfft,cplen);
rxData = qamdemod(x1,M,UnitAveragePower=true);
isequal(rxData,dataSym)
ans = logical
   1

レイリー フェージングを使用して、SISO リンクによりフィルター処理された 16-QAM 信号に OFDM 多重化を適用します。

シミュレーション変数を初期化し、レイリー フェージング チャネルおよび constellation diagram オブジェクトを作成します。

s1 = RandStream('mt19937ar',Seed=12345);
nFFT = 64;
cpLen = 16;
nullIdx = [1:6 33 64-4:64].';
numTones = nFFT-length(nullIdx);

k = 4; % bits per symbol
M = 2^k;
constSym = qammod((0:M-1),M, ...
    UnitAveragePower=true); % reference constellation symbols

maxDopp = 1;
pathDelays = [0 4e-3 8e-3];
pathGains = [0 -2 -3];
sRate = 1000;
sampIdx = round(pathDelays/(1/sRate)) + 1;

chan = comm.RayleighChannel(PathGainsOutputPort=true, ...
    MaximumDopplerShift=maxDopp, ...
    PathDelays=pathDelays, ...
    AveragePathGains=pathGains, ...
    SampleRate=sRate, ...
    RandomStream='mt19937ar with seed');

cdScope = comm.ConstellationDiagram( ...
    ShowReferenceConstellation=true, ...
    ReferenceConstellation=constSym);

信号データを生成して 16-QAM 変調を適用します。

data = randi(s1,[0 M-1],numTones,1);
modOut = qammod(data,M,UnitAveragePower=true);

OFDM 変調を適用し、チャネルを通して信号を渡します。

y = ofdmmod(modOut,nFFT,cpLen,nullIdx);
[fadSig,pg] = chan(y);

シンボル サンプリング オフセットを決定します。

symOffset = min(max(sampIdx),cpLen)
symOffset = 
9

時間シフトを使用して受信信号を OFDM 復調します。イコライズの前にコンスタレーション ダイアグラムを表示します。

x = ofdmdemod(fadSig,nFFT,cpLen,symOffset,nullIdx);
cdScope(x);

パス ゲインのベクトル pg をスカラー タップ ゲインに変換します。このスカラー タップ ゲインは、データ サブキャリア h_datasubcarr に対応しています。h_datasubcarr タップ ゲインは信号復元中のイコライズで使用します。

hImp = complex(zeros(nFFT,1));
hImp(sampIdx) = mean(pg,1);
hall = fftshift(fft(hImp));
dataIdx = setdiff((1:nFFT)',nullIdx);
h_datasubcarr = hall(dataIdx);

信号をイコライズします。イコライズの後にコンスタレーション ダイアグラムを表示します。

eqSig = x ./ h_datasubcarr;
cdScope(eqSig);

16-QAM シンボルを復調して、信号を復元します。シンボル エラー レートを計算します。

rxSym = qamdemod(eqSig,M,UnitAveragePower=true);
numErr = symerr(data,rxSym);
disp(['Number of symbol errors: ' num2str(numErr) ...
    ' out of ' num2str(length(data)) ' symbols.'])
Number of symbol errors: 2 out of 52 symbols.

null およびパイロット パッキングを含むデータ入力を OFDM 復調します。

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

Mqam = 16;
Mpsk = 4;
nfft = 64;
cplen = 16;
nSym = 10;
nullIdx = [1:6 33 64-4:64]';
pilotIdx = [12 26 40 54]';
numDataCarrs = nfft-length(nullIdx)-length(pilotIdx);
dataSym = randi([0 Mqam-1],numDataCarrs,nSym);
qamSig = qammod(dataSym,Mqam,UnitAveragePower=true);
pilotSym = repmat((0:Mpsk-1).',1,nSym);
pilots = pskmod(pilotSym,Mpsk);
y2 = ofdmmod(qamSig,nfft,cplen,nullIdx,pilotIdx,pilots);

OFDM シンボルを復調します。結果を元の入力データと比較し、復調された信号が元のデータおよびパイロット信号と等しいことを示します。

symOffset = cplen;
[x2,rxPilots] = ofdmdemod(y2,nfft,cplen,symOffset,nullIdx,pilotIdx);
rxData = qamdemod(x2,Mqam,UnitAveragePower=true);
isequal(rxData,dataSym)
ans = logical
   1

rxPilotSym = pskdemod(rxPilots,Mpsk);
isequal(rxPilotSym,repmat((0:Mpsk-1).',1,nSym))
ans = logical
   1

サンプル オフセットをもつオーバーサンプリングされた OFDM 変調を復調します。OFDM グリッドに null を挿入し、出力信号をオーバーサンプリングします。

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

M = 64;
osf = 4/3;
nfft = 768;
cplen = 24;
sampOffset = 5;
symOffset = cplen - (sampOffset/osf);

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

dataSym = randi([0 M-1],nfft,1);
qamSig = qammod(dataSym,M,UnitAveragePower=true);
y3 = ofdmmod(qamSig,nfft,cplen,OversamplingFactor=osf);

信号を復調し、復調されたデータ シンボルが元の入力データ シンボルと一致することを示します。

x3 = ofdmdemod(y3,nfft,cplen,symOffset,OversamplingFactor=osf);
rxSym = qamdemod(x3,M,UnitAveragePower=true);
isequal(rxSym,dataSym)
ans = logical
   1

入力引数

すべて折りたたむ

OFDM 変調されたベースバンド信号。(osf × NIn) 行 NStreams 列の数値配列、または dlarray (Deep Learning Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

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

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

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

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

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

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

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

データ型: double

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

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

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

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

データ型: double

シンボル サンプリング オフセット。0 ~ cplen の値として指定します。

  • symOffset を指定しない場合の既定値は cplen と等しいオフセットです。

  • symOffset をスカラーとして指定した場合、すべてのシンボルで同じオフセットが使用されます。

  • symOffset を行ベクトルとして指定した場合、各シンボルでオフセット値を変えられます。

詳細については、ウィンドウ処理とシンボル オフセットを参照してください。

データ型: double

null サブキャリアの位置のインデックス。範囲 [1, nfft] の要素値をもつ列ベクトルとして指定します。詳細については、サブキャリア割り当てと保護帯域を参照してください。

データ型: double

パイロット サブキャリアの位置のインデックス。範囲 [1, nfft] の要素値をもつ列ベクトルとして指定します。詳細については、サブキャリア割り当てと保護帯域を参照してください。

データ型: double

出力引数

すべて折りたたむ

出力ベースバンド信号。NDataSC×NSym×NStreams の数値配列、または dlarray (Deep Learning Toolbox) として返されます。出力データの形式は入力信号 X と一致します。詳細については、配列のサポートを参照してください。

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

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

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

詳細については、OFDM 復調を参照してください。

パイロット サブキャリア。NPilot×NSym×NStreams の数値配列、dlarray (Deep Learning Toolbox)、または gpuArray (Parallel Computing Toolbox) として返されます。詳細については、配列のサポートを参照してください。出力データの形式は入力信号 X と一致します。

  • NPilotpilotidx の長さに等しくなります。

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

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

ヒント

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

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

拡張機能

すべて展開する

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

バージョン履歴

R2018a で導入

すべて展開する