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 シンボルと送信アンテナで同じと仮定します。

すべて折りたたむ

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

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

nfft = 64;
cplen = [16 32];
nSym = 2;
dataIn = complex(randn(nfft,nSym),randn(nfft,nSym));
y1 = ofdmmod(dataIn,nfft,cplen);

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

x1 = ofdmdemod(y1,nfft,cplen);
max(x1-dataIn)
ans = 1×2 complex
10-15 ×

   0.2220 - 0.7772i   0.2498 - 0.8882i

レイリー フェージングを使用して OFDM 多重化を 16-QAM 信号 SISO リンクに適用します。

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);

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');

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); % with a time shift

パス ゲイン pg をスカラー タップ ゲインに変換します。タップ ゲインは信号復元中のイコライズで使用します。

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

信号をイコライズします。

eqH = conj(h)./(conj(h).*h);
eqSig = eqH.*x;

cdScope = comm.ConstellationDiagram('ShowReferenceConstellation',true, ...
    'ReferenceConstellation',constSym);
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 変調を実行します。

nfft     = 64;
cplen    = 16;
nSym     = 10;
nullIdx  = [1:6 33 64-4:64]';
pilotIdx = [12 26 40 54]';
numDataCarrs = nfft-length(nullIdx)-length(pilotIdx);
dataIn = complex(randn(numDataCarrs,nSym),randn(numDataCarrs,nSym));
pilots = repmat(pskmod((0:3).',4),1,nSym);
y2 = ofdmmod(dataIn,nfft,cplen,nullIdx,pilotIdx,pilots);

OFDM シンボルを復調します。結果と元の入力データを比較して、復調された信号と元のデータとパイロット信号の間にわずかな差があることを表示します。

symOffset = cplen;
[x2,rxPilots] = ofdmdemod(y2,nfft,cplen,symOffset,nullIdx,pilotIdx);
max(x2-dataIn)
ans = 1×10 complex
10-15 ×

   0.5551 + 0.2220i   0.2220 + 0.4441i   0.4441 - 0.2220i   0.4718 - 0.3331i  -0.1665 - 0.4441i  -0.3331 - 0.8049i   0.6661 - 0.2220i   0.0000 + 0.5829i   0.2220 + 0.4441i   0.3331 + 0.4441i

max(rxPilots-pilots)
ans = 1×10 complex
10-15 ×

   0.0000 + 0.3331i   0.1837 - 0.2220i  -0.4441 - 0.2776i   0.2220 + 0.2220i   0.2220 - 0.1665i   0.0000 - 0.3445i   0.3331 + 0.0441i  -0.4441 - 0.1225i   0.4441 + 0.1943i   0.4441 + 0.3192i

入力引数

すべて折りたたむ

変調された 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) のインデックス値をもちます。

    • 保護帯域は、連続する OFDM シンボル間のバッファーを提供し、符号間干渉を低減することで送信される信号の整合性を保護します。

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 で導入