comm.CarrierSynchronizer
搬送波周波数オフセットの補正
説明
comm.CarrierSynchronizer
System object™ は、単一搬送波変調スキームを使用する信号の搬送波周波数と位相オフセットを補正します。キャリア同期装置のアルゴリズムは、BPSK、QPSK、OQPSK、8-PSK、PAM、および矩形 QAM 変調スキームと互換性があります。
メモ
同期アルゴリズムによって、変調タイプに依存する位相のあいまいさが生じる可能性があります。詳細については、潜在的な位相のあいまいさを参照してください。
単一搬送波変調スキームを使用する信号の周波数オフセットと位相オフセットを補正するには、次のようにします。
comm.CarrierSynchronizer
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、オブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
説明
は、単一搬送波変調スキームを使用する信号の搬送波周波数オフセットと位相オフセットを補正する System object を作成します。carrSynch
= comm.CarrierSynchronizer
は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各プロパティ名を引用符で囲みます。carrSynch
= comm.CarrierSynchronizer(Name
,Value
)
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 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
使用法
入力引数
入力信号。複素スカラーまたは複素数値のベクトルとして指定します。
このオブジェクトは可変サイズの入力を受け入れます。オブジェクトがロックされると、各入力チャネルのサイズは変更できますが、チャネルの数は変更できません。詳細については、Variable-Size Signal Support with System Objectsを参照してください。
データ型: double
| single
複素数のサポート: あり
出力引数
位相補正された出力信号。inSig
と同じデータ型と長さのスカラーまたは列ベクトルとして返されます。出力信号は入力信号を調整し、単一搬送波変調スキームを使用する信号の搬送波周波数と位相オフセットを補正します。
ラジアン単位の位相推定。inSig
と同じ長さの実数値スカラーまたは列ベクトルとして返されます。
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
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.PhaseFrequencyOffset
System 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)
シンボルあたりのサンプル数を 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.PhaseFrequencyOffset
System 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
を使用して周波数オフセットを特定し、位相誤差の近似微分を計算します。位相誤差はラジアン単位で測定されるため、微分は でスケーリングしなければなりません。
estFreqOffset = diff(phError)*fs/(2*pi);
推定された周波数オフセットのランニング平均をプロットします。同期装置が解に収束した後は、推定の平均値が入力周波数オフセット値 1000 Hz とほぼ等しくなります。
rmean = cumsum(estFreqOffset)./(1:length(estFreqOffset))'; plot(rmean) xlabel('Symbols') ylabel('Estimated Frequency Offset (Hz)') grid
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(... % 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 の大まかな周波数補正、搬送波同期、およびコンスタレーション ダイアグラムのための 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);
大まかな周波数補償器 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 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 信号の位相および周波数オフセットを補正します。次に、キャリア同期装置とおおまかな周波数補償器の両方を使用して、これらのオフセットを補正します。
例のパラメーターを設定します。
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);
キャリア同期装置を使用して信号に細かな周波数補正を適用します。
fineSync = comm.CarrierSynchronizer( ... DampingFactor=0.7, ... NormalizedLoopBandwidth=0.005, ... SamplesPerSymbol=sps, ... Modulation='QAM'); rxData = fineSync(rxSig);
最後の 4000 個のシンボルのコンスタレーション ダイアグラムを表示します。
constdiagram(rxData)
収束時間があるとしても、プロットの表示が螺旋状なことから、キャリア同期装置がまだこの大きな量の周波数オフセットの補正を終えていないことが分かります。400 Hz のオフセットはサンプル レートの 1% です。
キャリア同期装置の前に挿入されたおおまかな周波数補償器を使用して、この処理を繰り返します。
おおまかな周波数補償器を作成し、管理しやすいレベルまで周波数オフセットを減少させます。
coarseSync = comm.CoarseFrequencyCompensator( ... Modulation='QAM', ... FrequencyResolution=1, ... SampleRate=fs*sps);
受信信号をおおまかな周波数補償器に渡し、次にキャリア同期装置に渡します。
syncCoarse = coarseSync(rxSig); rxData = fineSync(syncCoarse);
おおまかな周波数補正と細かな周波数補正の後に信号のコンスタレーション ダイアグラムをプロットします。受信データが基準コンスタレーションに一致するようになりました。
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
詳細
次の表は、変調タイプに応じて同期装置によって導入される可能性のある潜在的な位相のあいまいさを示しています。
変調タイプ | 位相のあいまいさ (ラジアン) |
---|---|
BPSK または PAM | 0、π |
OQPSK、QPSK、または QAM | 0、π/2、π、3π/2 |
8PSK | 0、π/4、π/2、3π/4、π、5π/4、3π/2、7π/4 |
最適な結果を得るには、搬送波同期をオーバーサンプリングされていない信号に適用します。
アルゴリズム
このアルゴリズムは、[1] で説明されている PLL ベースのアルゴリズムを使用する閉ループ補償器を実装します。同期装置の出力 yn は、n 番目のサンプルの複素数入力信号 xn の周波数がシフトされたものです。同期装置の出力は となり、λn はダイレクト デジタル シンセサイザー (DDS) の出力です。DDS とは離散時間式の電圧制御発振器であり、離散時間位相同期回路における中核コンポーネントです。DDS は積分フィルターとして機能します。
周波数オフセットを補正するには、まずアルゴリズムが位相誤差 en を特定します。位相誤差の値は変調スキームによって異なります。
変調 | 位相誤差 |
---|---|
QAM または QPSK | この方程式の詳細については、[1] を参照してください。 |
BPSK または PAM | この方程式の詳細については、[1] を参照してください。 |
8-PSK | この方程式の詳細については、[2] を参照してください。 |
OQPSK | |
システムの安定性を確保するため、位相誤差は、以下で決定される双二次ループ フィルターを通過します。
ここで、ψn はサンプル n でのループ フィルターの出力で、gI は積分器のゲインです。積分器のゲインは次の方程式で決定されます。
ここで、
Bn は正規化されたループ帯域幅
ζ は減衰係数
K0 は位相回復ゲインであり、シンボルあたりのサンプル数に等しくなる。
Kp は位相誤差検出器ゲインであり、変調タイプによって決まる。
変調 | Kp |
---|---|
BPSK、PAM、QAM、QPSK、または OQPSK | 2 |
8-PSK | 1 |
ループ フィルターの出力はその後 DDS に渡されます。DDS は、前進オイラー法の積分規則に基づく式で表される、別の双二次ループ フィルターです。
ここで、gP は、次の式で表される比例ゲインです。
info
オブジェクト関数は、正規化されたプルイン レンジ、最大周波数同期遅延および最大位相同期遅延の推定値を返します。正規化されたプルイン レンジ (Δf)pull-in はラジアン単位で表され、次のように推定されます。
(Δf )pull-in の式は、 が 1 に近づくにつれて精度が低下します。
最大周波数同期遅延 TFL と最大位相同期遅延 TPL はサンプル単位で表され、次のように推定されます。
参照
[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.
拡張機能
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)を参照してください。
バージョン履歴
R2015a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)