メインコンテンツ

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

comm.CarrierSynchronizer

R2026a

搬送波周波数オフセットの補正

説明

comm.CarrierSynchronizer System object™ は、単一搬送波変調スキームを使用する信号の搬送波周波数と位相オフセットを補正します。キャリア同期装置のアルゴリズムは、BPSK、QPSK、OQPSK、8-PSK、PAM、および矩形 QAM 変調スキームと互換性があります。

メモ

同期アルゴリズムによって、変調タイプに依存する位相のあいまいさが生じる可能性があります。詳細については、潜在的な位相のあいまいさを参照してください。

単一搬送波変調スキームを使用する信号の周波数オフセットと位相オフセットを補正するには、次のようにします。

  1. comm.CarrierSynchronizer オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、オブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

carrSynch = comm.CarrierSynchronizer は、単一搬送波変調スキームを使用する信号の搬送波周波数オフセットと位相オフセットを補正する System object を作成します。

carrSynch = comm.CarrierSynchronizer(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各プロパティ名を引用符で囲みます。

例

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

変調タイプ。'QAM'、'8PSK'、'BPSK'、'OQPSK'、'PAM'、または 'QPSK' として指定します。

例: comm.CarrierSynchronizer('Modulation','QPSK') は、QPSK 変調信号で使用するキャリア同期装置 System object を作成します。

調整可能: No

変調位相オフセット手法。'Auto' または 'Custom' として指定します。

  • 'Auto' — 指定した変調タイプに従来のオフセットが適用されます。

    変調位相オフセット (ラジアン)
    'BPSK'、'QAM' または 'PAM'0
    'OQPSK' または 'QPSK'π/4
    '8PSK'π/8
  • 'Custom' — CustomPhaseOffset プロパティを使用してユーザー定義の位相オフセットを指定します。

調整可能: Yes

ラジアン単位のカスタム位相オフセット。スカラーとして指定します。

依存関係

このプロパティは、ModulationPhaseOffset プロパティを 'Custom' に設定した場合に適用されます。

データ型: double

シンボルあたりのサンプル数。正の整数として指定します。

調整可能: Yes

データ型: double

ループの減衰係数。正のスカラーとして指定します。

調整可能: Yes

データ型: double

ループの正規化帯域幅。範囲 (0,1] のスカラーとして指定します。ループ帯域幅は、同期装置のサンプルレートにより正規化されます。

ループ帯域幅を小さくすると、同期装置の収束時間が短縮されますが、同期装置のプルイン レンジも減少します。

調整可能: Yes

データ型: double

使用法

説明

[outsig,phEst] = carrSynch(csync,insig) は、入力信号の搬送波位相オフセットを推定し、出力信号の補正信号と推定位相オフセットを返します。

例

入力引数

すべて展開する

入力信号。複素スカラーまたは複素数値のベクトルとして指定します。

このオブジェクトは可変サイズの入力を受け入れます。オブジェクトがロックされた後は、シミュレーション中に信号のフレーム サイズ (行数) を変更できますが、チャネル数 (列数) は一定のままでなければなりません。詳細については、Variable-Size Signals in Codeを参照してください。

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

出力引数

すべて展開する

位相補正された出力信号。inSig と同じデータ型と長さのスカラーまたは列ベクトルとして返されます。出力信号は入力信号を調整し、単一搬送波変調スキームを使用する信号の搬送波周波数と位相オフセットを補正します。

ラジアン単位の位相推定。inSig と同じ長さの実数値スカラーまたは列ベクトルとして返されます。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

infoキャリア同期装置の特性情報
cloneSystem object の複製
isLockedSystem object が使用中かどうかの判定
stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

例

すべて折りたたむ

AWGN チャネルを通過した QPSK 信号の位相と周波数のオフセットを補正します。プリアンブルを使用して、シンボル位相のあいまいさを解決します。

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

M = 4;                             % Modulation order
rng(1993)                          % For repeatable results
barker = comm.BarkerCode( ...
    Length=13,SamplesPerFrame=13); % For preamble
msgLen = 1e4;
numFrames = 10;
frameLen = msgLen/numFrames;

各フレームにプリアンブルを追加します。これは、後でシンボル位相のあいまいさの解決を実行するときに使用されます。ランダム データ シンボルを生成して QPSK 変調を適用します。

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

modSig = pskmod(data,4,pi/4);

comm.PhaseFrequencyOffsetSystem object™ を作成して、位相オフセットと周波数オフセットを変調入力信号に導入します。位相オフセットを 45 度、周波数オフセットを 1 kHz、サンプルレートを 10 kHz に設定します。周波数オフセットはサンプルレートの 1% に設定されます。

pfo = comm.PhaseFrequencyOffset( ...
    PhaseOffset=45, ...
    FrequencyOffset=1e4, ...
    SampleRate=1e6);

pfo オブジェクトを使用して位相と周波数のオフセットを適用し、ホワイト ガウス ノイズを付加します。

modSigOffset = pfo(modSig);
rxSig = awgn(modSigOffset,12);

受信した信号の散布図を表示します。周波数オフセットのため、データは各基準コンスタレーション点のまわりに集まる代わりに、1 つの円の中に表示されます。

scatterplot(rxSig)

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

シンボルあたりのサンプル数を 1 に設定したキャリア同期装置 System object を作成します。carrierSync オブジェクトを使用して、受信信号の位相オフセットと周波数オフセットを補正します。

carrierSync = comm.CarrierSynchronizer( ...
    SamplesPerSymbol=1, ...
    Modulation='QPSK');
syncSignal = carrierSync(rxSig);

コンスタレーション ダイアグラムを使用して、同期信号の最初と最後の 1000 個のシンボルを表示します。同期装置のループが収束する前は、プロットされたシンボルは各基準コンスタレーション点の周りに集まっていません。収束すると、プロットされたシンボルが各基準コンスタレーション点の周りに集まります。

constDiag = comm.ConstellationDiagram( ...
    SymbolsToDisplaySource='Property', ...
    SymbolsToDisplay=300, ...
    ChannelNames={'Before convergence','After convergence'}, ...
    ShowLegend=true, ...
    Position=[400 400 400 400]);

constDiag([syncSignal(1:1000) syncSignal(9001:10000)]);

同期信号を復調します。シンボル エラーの総数と SER を計算して表示します。

syncData = pskdemod(syncSignal,4,pi/4);
[syncDataTtlErr,syncDataSER] = biterr( ...
    data(6000:end),syncData(6000:end))
syncDataTtlErr = 
4000
syncDataSER = 
0.4999

キャリア同期装置オブジェクトは、シンボル位相のあいまいさを解決しません。受信信号のシンボル位相のあいまいさにより、シンボル エラーが発生する可能性があります。プリアンブルを使用して、シンボル位相のあいまいさを判別します。同期信号からシンボル位相のあいまいさを除去して、シンボル エラーを削減します。

idx = 9000 + (1:barker.Length);
phOffset = angle(modSig(idx) .* conj(syncSignal(idx)));
phOffset = round((2/pi) * phOffset); % -1, 0, 1, +/-2
phOffset(phOffset==-2) = 2;          % Prep for mean operation
phOffset = mean((pi/2) * phOffset);  % -pi/2, 0, pi/2, or pi
disp(['Estimated mean phase offset = ', ...
    num2str(phOffset*180/pi),' degrees'])
Estimated mean phase offset = -90 degrees
resPhzSig = exp(1i*phOffset) * syncSignal;

シンボル位相のあいまいさを解決した後、信号を復調します。更新された合計シンボル エラーと SER を再計算して表示します。位相のあいまいさが除去されると、SER が大幅に減少します。

resPhzData = pskdemod(resPhzSig,4,pi/4);
[resPhzTtlErr, resPhzSER] = biterr( ...
    data(6000:end),resPhzData(6000:end))
resPhzTtlErr = 
3
resPhzSER = 
3.7491e-04

キャリア同期装置 System object™ を使用して、ノイズを含む 8-PSK 信号に生じた周波数オフセットを推定します。

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

M = 8;                  % Modulation order
fs = 1e6;               % Sample rate (Hz)
foffset = 1000;         % Frequency offset (Hz)
phaseoffset = 15;       % Phase offset (deg)
snrdb = 20;             % Signal-to-noise ratio (dB)

comm.PhaseFrequencyOffsetSystem object を作成して、位相オフセットと周波数オフセットを変調信号に導入します。

pfo = comm.PhaseFrequencyOffset('PhaseOffset',phaseoffset, ...
    'FrequencyOffset',foffset,'SampleRate',fs);

キャリア同期装置 System object を作成して、位相と周波数のオフセットの補正に使用します。Modulation プロパティを 8PSK に設定します。

carrierSync = comm.CarrierSynchronizer('Modulation','8PSK');

ランダム データを生成して 8-PSK 変調を適用します。

data = randi([0 M-1],5000,1);
modSig = pskmod(data,M,pi/M);

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

modSigOffset = pfo(modSig);
rxSig = awgn(modSigOffset,snrdb);

キャリア同期装置を使用して、受信した信号の位相オフセットを推定します。

[~,phError] = carrierSync(rxSig);

関数diffを使用して周波数オフセットを特定し、位相誤差の近似微分を計算します。位相誤差はラジアン単位で測定されるため、微分は 2π でスケーリングしなければなりません。

estFreqOffset = diff(phError)*fs/(2*pi);

推定された周波数オフセットのランニング平均をプロットします。同期装置が解に収束した後は、推定の平均値が入力周波数オフセット値 1000 Hz とほぼ等しくなります。

rmean = cumsum(estFreqOffset)./(1:length(estFreqOffset))';
plot(rmean)
xlabel('Symbols')
ylabel('Estimated Frequency Offset (Hz)')
grid

Figure contains an axes object. The axes object with xlabel Symbols, ylabel Estimated Frequency Offset (Hz) contains an object of type line.

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

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

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(... % For preamble
    Length=13,SamplesPerFrame=13);
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 の coarse 周波数補償、搬送波同期、およびコンスタレーション ダイアグラムのための 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, ...
    AxesLimits=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);

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

syncCoarse = coarse(rxSig);

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

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 after synchronization loop has converged
[syncDataTtlErr,syncDataBER] = biterr( ...
    data(idxSync:end-delay),rxData(idxSync+delay:end))
syncDataTtlErr = 
13280
syncDataBER = 
0.4155

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

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 = -65.8162 degrees
resPhzSig = exp(1i*phOffsetEst) * rxFiltSig;

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

resPhzData = qamdemod(resPhzSig,M);
[resPhzTtlErr,resPhzBER] = biterr( ...
    data(idxSync:end-delay),resPhzData(idxSync+delay:end))
resPhzTtlErr = 
13440
resPhzBER = 
0.4205

キャリア同期装置を使用して、ノイズを含む QAM 信号の位相および周波数オフセットを補正します。次に、キャリア同期装置と coarse 周波数補償器の両方を使用して、これらのオフセットを補正します。

例のパラメーターを設定します。

fs = 10000;   % Symbol rate (Hz)
sps = 4;      % Samples per symbol
M = 16;       % Modulation order
k = log2(M);  % Bits per symbol
EbNo = 20;    % Eb/No (dB)
SNR = convertSNR(EbNo,"ebno",BitsPerSymbol=k,SamplesPerSymbol=sps);

constellation diagram オブジェクトを作成し、オフセット補償手法の効果を可視化します。コンスタレーション ダイアグラムを指定して、最後の 4000 個のサンプルのみを表示します。

constdiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=qammod(0:M-1,M), ...
    SamplesPerSymbol=sps, ...
    SymbolsToDisplaySource='Property', ...
    SymbolsToDisplay=4000, ...
    AxesLimits=[-5 5]);

400 Hz の周波数オフセットと 30 度の位相オフセットを導入します。

phaseFreqOffset = comm.PhaseFrequencyOffset( ...
    FrequencyOffset=400, ...
    PhaseOffset=30, ...
    SampleRate=fs);

ランダム データ シンボルを生成して 16-QAM 変調を適用します。

data = randi([0 M-1],10000,1);
modSig = qammod(data,M);

レイズド コサイン フィルター オブジェクトを作成し、変調された信号をフィルター処理します。

txfilter = comm.RaisedCosineTransmitFilter( ...
    OutputSamplesPerSymbol=sps, ...
    Gain=sqrt(sps));
txSig = txfilter(modSig);

位相オフセットと周波数オフセットを適用し、次に AWGN チャネルを通して信号を渡します。

freqOffsetSig = phaseFreqOffset(txSig);
rxSig = awgn(freqOffsetSig,SNR);

キャリア同期装置を使用して信号に fine 周波数補正を適用します。

fineSync = comm.CarrierSynchronizer( ...
    DampingFactor=0.7, ...
    NormalizedLoopBandwidth=0.005, ...
    SamplesPerSymbol=sps, ...
    Modulation='QAM');
rxData = fineSync(rxSig);

最後の 4000 個のシンボルのコンスタレーション ダイアグラムを表示します。

constdiagram(rxData)

収束時間があるとしても、プロットの表示が螺旋状なことから、キャリア同期装置がまだこの大きな量の周波数オフセットの補正を終えていないことが分かります。400 Hz のオフセットはサンプル レートの 1% です。

キャリア同期装置の前に挿入された coarse 周波数補償器を使用して、この処理を繰り返します。

coarse 周波数補償器を作成し、管理しやすいレベルまで周波数オフセットを減少させます。

coarseSync = comm.CoarseFrequencyCompensator( ...
    Modulation='QAM', ...
    FrequencyResolution=1, ...
    SampleRate=fs*sps);

受信信号を coarse 周波数補償器に渡し、次にキャリア同期装置に渡します。

syncCoarse = coarseSync(rxSig);
rxData = fineSync(syncCoarse);

coarse 周波数補償と fine 周波数補償の後に信号のコンスタレーション ダイアグラムをプロットします。受信データが基準コンスタレーションに一致するようになりました。

constdiagram(rxData)

comm.SymbolSynchronizer および comm.CarrierSynchronizer System object を使用して、シンボル タイミングおよび周波数オフセットの誤りを補正します。

構成

シミュレーション パラメーターを初期化します。

M = 16;       % Modulation order
nSym = 2000;  % Number of symbols in a packet
sps = 2;      % Samples per symbol
spsFilt = 8;  % Samples per symbol for filters and channel
spsSync = 2;  % Samples per symbol for synchronizers
lenFilt = 10; % RRC filter length

送信機と受信機に対してルート レイズド コサイン (RRC) フィルター System object の対応するペアを作成します。

txfilter = comm.RaisedCosineTransmitFilter( ...
    FilterSpanInSymbols=lenFilt, ...
    OutputSamplesPerSymbol=spsFilt, ...
    Gain=sqrt(spsFilt));
rxfilter = comm.RaisedCosineReceiveFilter( ...
    FilterSpanInSymbols=lenFilt, ...
    InputSamplesPerSymbol=spsFilt, ...
    DecimationFactor=spsFilt/2, ...
    Gain=sqrt(1/spsFilt));

位相周波数オフセット System object を作成し、100 Hz のドップラー シフトを導入します。

doppler = comm.PhaseFrequencyOffset( ...
    FrequencyOffset=100, ...
    PhaseOffset=45, ...
    SampleRate=1e6);

可変遅延 System object を作成し、タイミング オフセットを導入します。

varDelay = dsp.VariableFractionalDelay;

キャリア同期装置 System object とシンボル同期装置 System object を作成し、ドップラー シフトとタイミング オフセットをそれぞれ補正します。

carrierSync = comm.CarrierSynchronizer( ...
    SamplesPerSymbol=spsSync);
symbolSync = comm.SymbolSynchronizer( ...
    TimingErrorDetector='Early-Late (non-data-aided)', ...
    SamplesPerSymbol=spsSync);

コンスタレーション ダイアグラム System object を作成し、結果を表示します。

refConst = qammod(0:M-1,M,UnitAveragePower=true);
cdReceive = comm.ConstellationDiagram( ...
    ReferenceConstellation=refConst, ...
    SamplesPerSymbol=spsFilt,Title='Received Signal');
cdDoppler = comm.ConstellationDiagram( ...
    ReferenceConstellation=refConst, ...
    SamplesPerSymbol=spsSync, ...
    Title='Frequency Corrected Signal');
cdTiming = comm.ConstellationDiagram( ...
    ReferenceConstellation=refConst, ...
    SamplesPerSymbol=spsSync, ...
    Title='Frequency and Timing Synchronized Signal');

主処理ループ

主処理ループでは以下を行います。

  • ランダムなシンボルを生成し、QAM 変調を適用します。

  • 変調した信号をフィルター処理します。

  • 周波数とタイミングのオフセットを適用します。

  • AWGN チャネルを通して、送信された信号を渡します。

  • 受信した信号をフィルター処理します。

  • ドップラー シフトを補正します。

  • タイミング オフセットを補正します。

for k = 1:15
    data = randi([0 M-1],nSym,1);
    modSig = qammod(data,M,UnitAveragePower=true);         
    txSig = txfilter(modSig);            
    
    txDoppler = doppler(txSig);          
    txDelay = varDelay(txDoppler,k/15);  
    
    rxSig = awgn(txDelay,25);            
    
    rxFiltSig = rxfilter(rxSig);         
    rxCorr = carrierSync(rxFiltSig); 
    rxData = symbolSync(rxCorr);  
end

可視化

受信した信号、周波数を補正した信号および周波数とタイミングを同期した信号のコンスタレーション ダイアグラムをプロットします。特定のコンスタレーション点は、受信した信号内では識別できず、周波数を補正した信号内で一部のみを識別できます。ただし、タイミングと周波数を同期した信号は予想された QAM コンスタレーション点と一致します。

cdReceive(rxSig)

cdDoppler(rxCorr)

cdTiming(rxData)

キャリア同期装置オブジェクトを使用して、周波数オフセットを補正します。同期装置の減衰係数を増やして、オフセットが補正されたかどうかを判断します。

変調次数、サンプル レート、周波数オフセットおよび S/N 比の各パラメーターを設定します。

M = 8;
fs = 1e6;
foffset = 1000;
snrdb = 20;

変調信号に周波数オフセットを導入する位相周波数オフセット オブジェクトを作成します。constellation diagram オブジェクトを作成します。

pfo = comm.PhaseFrequencyOffset(SampleRate=fs, ...
    FrequencyOffset=foffset);
constDiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=pskmod(0:M-1,M,pi/M));

周波数オフセットを補正するキャリア同期装置オブジェクトを作成します。

carriersync = comm.CarrierSynchronizer(Modulation='8PSK', ...
    DampingFactor=0.05,NormalizedLoopBandwidth=0.01);

主処理ループには以下のステップが含まれます。

  • ランダム データを生成します。

  • 8-PSK 変調を適用します。

  • 周波数オフセットを導入します。

  • AWGN チャネルを通して信号を渡します。

  • 周波数オフセットを補正します。

  • コンスタレーション ダイアグラムを表示します。

for k = 1:200
    data = randi([0 M-1],1000,1);
    modSig = pskmod(data,M);
    txSig = pfo(modSig);
    rxSig = awgn(txSig,snrdb);
    syncOut = carriersync(rxSig);
    constDiagram(syncOut)
end

コンスタレーション点が明確に判別できないことから、キャリア同期装置が周波数オフセットを補正できないことが分かります。

関数 info を使用して、正規化されたプルイン レンジ、最大周波数同期遅延および最大位相同期遅延を求めます。

syncInfo = info(carriersync)
syncInfo = struct with fields:
    NormalizedPullInRange: 0.0044
    MaxFrequencyLockDelay: 78.9568
        MaxPhaseLockDelay: 130

正規化されたプルイン レンジをラジアンからサイクルに変換します。正規化周波数オフセットをプルイン レンジと比較します。

[foffset/fs syncInfo.NormalizedPullInRange/(2*pi)]
ans = 1×2
10-3 ×

    1.0000    0.7071

オフセットがプルイン レンジより大きくなっています。これが、キャリア同期装置が周波数オフセットの補正に失敗した理由です。

同期装置の減衰係数を 0.707 に変更します。

carriersync.DampingFactor = 0.707;

主処理ループを繰り返します。

for k = 1:200
    data = randi([0 M-1],1000,1);
    modSig = pskmod(data,M);
    txSig = pfo(modSig);
    rxSig = awgn(txSig,snrdb);
    syncOut = carriersync(rxSig);
    constDiagram(syncOut)
end

今度は観測可能な 8 つのクラスターがあり、周波数オフセットが補正されたことを示しています。

新しいプルイン レンジを特定します。正規化オフセットはプルイン レンジより小さくなります。これが、キャリア同期装置がオフセットを補正できた理由です。

syncInfo = info(carriersync);
[foffset/fs syncInfo.NormalizedPullInRange/(2*pi)]
ans = 1×2

    0.0010    0.0100

詳細

すべて展開する

アルゴリズム

このアルゴリズムは、[1] で説明されている PLL ベースのアルゴリズムを使用する閉ループ補償器を実装します。同期装置の出力 yn は、n 番目のサンプルの複素数入力信号 xn の周波数がシフトされたものです。同期装置の出力は yn=xneiλn , となり、λn はダイレクト デジタル シンセサイザー (DDS) の出力です。DDS とは離散時間式の電圧制御発振器であり、離散時間位相同期回路における中核コンポーネントです。DDS は積分フィルターとして機能します。

Carrier synchronizer input to phase shifter. Feedback loop includes a phase error detector, a loop filter and a direct digital synthesizer.

周波数オフセットを補正するには、まずアルゴリズムが位相誤差 en を特定します。位相誤差の値は変調スキームによって異なります。

変調位相誤差
QAM または QPSK

en=sgn(Re{xn})×Im{xn}−sgn(Im{xn})×Re{xn}

この方程式の詳細については、[1] を参照してください。

BPSK または PAM

en=sgn(Re{xn})×Im{xn}

この方程式の詳細については、[1] を参照してください。

8-PSK

en={sgn(Re{xn})×Im{xn}−(2−1)sgn(Im{xn})×Re{xn}, for |Re{xn}|≥|Im{xn}|(2−1)sgn(Re{xn})×Im{xn}−sgn(Im{xn})×Re{xn}, for |Re{xn}|<|Im{xn}|

この方程式の詳細については、[2] を参照してください。

OQPSK

en=sgn(Re{xn-SamplePerSymbol/2})×Im{xn-SamplePerSymbol/2}−sgn(Im{xn})×Re{xn}

システムの安定性を確保するため、位相誤差は、以下で決定される双二次ループ フィルターを通過します。

ψn=gIen+ψn−1 ,

ここで、ψn はサンプル n でのループ フィルターの出力で、gI は積分器のゲインです。積分器のゲインは次の方程式で決定されます。

gI=4(θ2/d)KpK0 ,

ここで、

  • θ = BnT(ζ+14ζ) and d = 1+2ζθ+θ2,

  • Bn は正規化されたループ帯域幅

  • ζ は減衰係数

  • K0 は位相回復ゲインであり、シンボルあたりのサンプル数に等しくなる。

  • Kp は位相誤差検出器ゲインであり、変調タイプによって決まる。

変調Kp
BPSK、PAM、QAM、QPSK、または OQPSK2
8-PSK1

ループ フィルターの出力はその後 DDS に渡されます。DDS は、前進オイラー法の積分規則に基づく式で表される、別の双二次ループ フィルターです。

λn=(gPen-1+ψn-1)+λn-1 ,

ここで、gP は、次の式で表される比例ゲインです。

gP=4ζ(θ/d)KpK0 .

info オブジェクト関数は、正規化されたプルイン レンジ、最大周波数同期遅延および最大位相同期遅延の推定値を返します。正規化されたプルイン レンジ (Δf)pull-in はラジアン単位で表され、次のように推定されます。

(Δf)pull-in≈min(1,2π2ζBn) .

(Δf )pull-in の式は、2π2ζBn が 1 に近づくにつれて精度が低下します。

最大周波数同期遅延 TFL と最大位相同期遅延 TPL はサンプル単位で表され、次のように推定されます。

TFL≈4(Δf)pull-in2Bn3 and TPL≈1.3Bn .

参照

[1] Rice, Michael. Digital Communications: A Discrete-Time Approach. Upper Saddle River, NJ: Prentice Hall, 2008. pp. 359–393.

[2] Huang Zhijie, Yi Zhiqiang, Zhang Ming and Wang Kuang, "8PSK demodulation for new generation DVB-S2," 2004 International Conference on Communications, Circuits and Systems (IEEE Cat. No.04EX914), Chengdu, 2004, pp. 1447-1450 Vol.2, doi: 10.1109/ICCCAS.2004.1346447.

拡張機能

すべて展開する

バージョン履歴

R2015a で導入