Main Content

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

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 シンボル。NS 行 NR 列の数値配列、dlarray (Deep Learning Toolbox) オブジェクト、または gpuArray (Parallel Computing Toolbox) オブジェクトとして指定します。詳細については、配列のサポートを参照してください。

  • cplen がスカラーである場合、サンプル数 NS は (nfft + cplen) × NSym に等しくなります。

  • cplen が行ベクトルである場合、NS は (nfft × NSym) + sum(cplen) に等しくなります。

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

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

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

データ型: double

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

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

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

データ型: double

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

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

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

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

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

データ型: double

null サブキャリアの位置のインデックス。1 ~ nfft の要素値をもつ列ベクトルとして指定します。nullidx を指定した場合、Y の行数は (nfft-length(nullidx)) です。詳細については、サブキャリア割り当てと保護帯域を参照してください。

データ型: double

パイロット サブキャリアの位置のインデックス。1 ~ nfft の要素値をもつ列ベクトルとして指定します。pilotidx を指定した場合、Y の行数は (nfft – length(nullidx) – length(pilotidx)) です。詳細については、サブキャリア割り当てと保護帯域を参照してください。

データ型: double

出力引数

すべて折りたたむ

復調されたシンボルの出力。NData×NSym×NR の数値配列、dlarray (Deep Learning Toolbox)、または gpuArray (Parallel Computing Toolbox) として返されます。出力データの形式は入力信号 X と一致します。詳細については、配列のサポートを参照してください。

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

  • NSym は、アンテナあたりの OFDM シンボルの数です。

  • NR は、受信アンテナの数です。

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

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

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

  • NSym は、アンテナあたりの OFDM シンボルの数です。

  • NR は、受信アンテナの数です。

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

詳細

すべて折りたたむ

配列のサポート

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

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

  • X — 変調された OFDM シンボルは、最大 3 次元までの配列とすることができます。その場合、NS×NR×NB の配列として指定します。

NS は、サンプル数です。NR は、受信アンテナの数です。

アルゴリズム

すべて折りたたむ

OFDM 復調

直交周波数分割多重 (OFDM) メソッドは、N 個の並列データ ストリームを提供する FFT 演算を使用して、OFDM 入力信号を復調します。

次の図は、N 個の一連の相関器から構成されている OFDM 復調器を示しています。この復調器では、各 OFDM サブキャリアに 1 つの相関器が割り当てられています。一連の相関器の後に、パラレルからシリアルへの変換が行われます。

OFDM demodulator block diagram.

サブキャリア割り当てと保護帯域

個々の 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 に与える効果は、時間分散のスパンがサイクリック プレフィックスの期間を超えない限り有効です。

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

ウィンドウ処理とシンボル オフセット

送信機に適用された信号ウィンドウ処理によって生じた符号間干渉 (ISI) を低減するために、各 OFDM シンボルの復調前に非整数のシンボル オフセットが適用されます。信号ウィンドウ処理は多くの場合、連続する OFDM シンボル間の不連続を滑らかにするために、送信 OFDM シンボルに適用されます。ウィンドウ処理は、シンボル間の帯域外発射を低減しますが、ISI を増大させます。

ウィンドウ処理された OFDM シンボルは、サイクリック プレフィックス (CP)、ODFM シンボル データ、およびシンボルの先頭と末尾のウィンドウ処理領域で構成されます。先頭と末尾のウィンドウ処理の肩には、次の図に示すように、裾があります。

OFDM symbol windowing

ISI を低減するために、OFDM シンボルの復調前に適用されるシンボル サンプリング オフセットを指定することで、信号サンプル タイミングを揃えることができます。

OFDM symbol sampling offset

シンボル サンプリング オフセットを、範囲 [0, LCP] の値として指定します。ここで、LCP はサイクリック プレフィックス長です。

  • シンボル サンプリング オフセットがスカラーである場合、FFT ウィンドウはサイクリック プレフィックスの X+1 番目のサンプルから始まります。

  • シンボル サンプリング オフセットが 0 である場合、オフセットは適用されず、FFT ウィンドウはシンボルの 1 番目のサンプルから始まります。

  • シンボル サンプリング オフセットが LCP である場合、FFT ウィンドウは最後の CP サンプルの後から始まります。シンボル サンプリング オフセットが指定されていない場合、LCP が既定の設定になります。

拡張機能

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

バージョン履歴

R2018a で導入

すべて展開する