最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

大まかな同期と細かな同期を使用した 16-QAM の位相オフセットと周波数オフセットの補正

AWGN チャネルにおける 16-QAM 信号の著しい位相と周波数のオフセットの補正は、2 つのステップで行われます。まず、大まかな周波数オフセット推定値を補正してから、搬送波同期を使用して補正を微調整します。周波数補正が大まかなため、正規化帯域幅が低い値に設定されていても、キャリア同期装置はすぐに収束します。正規化帯域幅の値が低いほど、残差が小さい搬送波オフセットをより良く補正できます。受信信号に位相と周波数のオフセットの補正を適用した後に、プリアンブルを使用して位相不確定性を解決します。

シミュレーション パラメーターを定義します。

fs = 10000;      % Sample rate (Hz)
sps = 4;         % Samples per symbol
M = 16;          % Modulation order
k = log2(M);     % Bits per symbol
rng(1996)        % Set seed for repeatable results
barker = comm.BarkerCode(...
    'Length',13,'SamplesPerFrame',13);  % For preamble
msgLen = 1e4;
numFrames = 10;
frameLen = msgLen/numFrames;    

データ ペイロードを生成し、各フレームにプリアンブルを追加します。このプリアンブルは、後で位相不確定性の解決に使用されます。

preamble = (1+barker())/2;  % Length 13, unipolar
data = zeros(msgLen, 1);
for idx = 1 : numFrames
    payload = randi([0 M-1],frameLen-barker.Length,1);
    data((idx-1)*frameLen + (1:frameLen)) = [preamble; payload];
end

送信パルス整形フィルター、受信パルス整形フィルター、QAM の大まかな周波数補正、搬送波同期、およびコンスタレーション ダイアグラムのための System object を作成します。

txFilter = comm.RaisedCosineTransmitFilter( ...
    'OutputSamplesPerSymbol',sps);
rxFilter = comm.RaisedCosineReceiveFilter(...
    'InputSamplesPerSymbol',sps,'DecimationFactor',sps);
coarse = comm.CoarseFrequencyCompensator('SampleRate',fs, ...
    'FrequencyResolution',10);
fine = comm.CarrierSynchronizer( ...
    'DampingFactor',0.4,'NormalizedLoopBandwidth',0.001, ...
    'SamplesPerSymbol',1,'Modulation','QAM');
axislimits = [-6 6];
constDiagram = comm.ConstellationDiagram('ReferenceConstellation',qammod(0:M-1,M), ...
    'ChannelNames',{'Before convergence','After convergence'}, ...
    'ShowLegend',true,'XLimits',axislimits,'YLimits',axislimits);

また、AWGN チャネルの System object と、位相と周波数のオフセットを作成して、信号に損失を追加します。90 度よりも大きい位相オフセットを追加して位相不確定性を引き起こすと、コンスタレーションの象限変化が起こります。

ebn0 = 8;
freqoffset = 110;
phaseoffset = 110;
awgnChannel = comm.AWGNChannel('EbNo',ebn0, ...
    'BitsPerSymbol',k,'SamplesPerSymbol',sps);
pfo = comm.PhaseFrequencyOffset('FrequencyOffset',freqoffset, ...
    'PhaseOffset',phaseoffset,'SampleRate',fs);

ランダム データ シンボルを生成し、16-QAM 変調を適用して、変調された信号を送信パルス整形フィルターを通じて渡します。

txMod = qammod(data,M);
txSig = txFilter(txMod);

pfo System object を使用して位相オフセットと周波数オフセットを適用し、次に AWGN チャネルを通して信号を渡してホワイト ガウス ノイズを付加します。

txSigOffset = pfo(txSig);
rxSig = awgnChannel(txSigOffset);

大まかな周波数補償器 System object は、周波数オフセットの大まかな補正を行います。この例の条件では、受信信号補正の周波数オフセットを、送信信号の 10 Hz 以内に修正するだけで十分です。

syncCoarse = coarse(rxSig);

受信パルス整形フィルターを通して信号を渡し、細かな周波数補正を適用します。

rxFiltSig = fine(rxFilter(syncCoarse));

信号内の最初と最後の 1000 個のシンボルのコンスタレーション ダイアグラムを表示します。同期ループの収束前は、ダイアグラムの表示が螺旋状であり、周波数オフセットが補正されていないことが示されています。キャリア同期装置が解に収束した後は、シンボルが基準コンスタレーションと一致します。

constDiagram([rxFiltSig(1:1000) rxFiltSig(9001:end)])

信号を復調します。受信データと送信データを一致させるために、送信フィルターと受信フィルターによる信号遅延を考慮します。ビット誤りの総数と BER を計算して表示します。ビット誤りをチェックするときは、受信信号の後半部分を使用して、同期ループが収束していることを確認します。

rxData = qamdemod(rxFiltSig,M);
delay = (txFilter.FilterSpanInSymbols + rxFilter.FilterSpanInSymbols) / 2;
idxSync = 2000; % Check BER for the received signal after the synchronization loop has converged
[syncDataTtlErr,syncDataBER] = biterr(data(idxSync:end-delay),rxData(idxSync+delay:end))
syncDataTtlErr = 16116
syncDataBER = 0.5042

使用されるランダム データによっては、同期ループが収束してロックされた後に、受信信号の位相不確定性によるビット誤りがある可能性があります。この場合は、プリアンブルを使用して同期信号の位相不確定性を判別してから削除し、ビット誤りを減らすことができます。位相不確定性がきわめて小さい場合は、ビット誤りの数が変わらないことがあります。

idx = 9000 + (1:barker.Length);
phOffset = angle(txMod(idx) .* conj(rxFiltSig(idx+delay)));

phOffsetEst = mean(phOffset);
disp(['Phase offset = ',num2str(rad2deg(phOffsetEst)),' degrees'])
Phase offset = -90.1401 degrees
resPhzSig = exp(1i*phOffsetEst) * rxFiltSig;

位相不確定性を解決した後は、信号を復調します。ビット誤りの総数と BER を再計算します。

resPhzData = qamdemod(resPhzSig,M);
[resPhzTtlErr,resPhzBER] = biterr(data(idxSync:end-delay),resPhzData(idxSync+delay:end))
resPhzTtlErr = 5
resPhzBER = 1.5643e-04