Main Content

ofdmdemod

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

説明

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

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

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

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

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

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

すべて折りたたむ

シンボルごとに 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 シンボル。複素数シンボルの 2 次元配列として指定します。

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

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

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

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

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

データ型: double

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

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

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

データ型: double

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

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

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

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

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

データ型: double

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

データ型: double

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

データ型: double

出力引数

すべて折りたたむ

復調されたシンボルの出力。シンボルの ND x NSym x NR の配列として返されます。NDnfftlength(nullidx)length(pilotidx) と等しくなければなりません。NSym は、アンテナあたりの OFDM シンボルの数です。NR は、受信アンテナの数です。詳細については、OFDM 復調を参照してください。

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

詳細

すべて折りたたむ

OFDM 復調

OFDM 復調器は、直交周波数分割多重を使用して多重サブキャリアの時間領域信号を逆多重化します。

OFDM 復調では、N 個の並列データ ストリームを提供する FFT 演算を使用します。OFDM 復調器は、N 個の一連の相関器から構成されています。各 OFDM サブキャリアに 1 つの相関器が割り当てられ、続いてパラレルからシリアルに変換されます。

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

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

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

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

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

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

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

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

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

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

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

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

拡張機能

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

バージョン履歴

R2018a で導入