Main Content

MSK 信号再生

最小偏移変調 (MSK) 信号のタイミング位相オフセット、搬送波周波数オフセット、搬送波位相オフセットなどのチャネル障害をモデル化します。comm.MSKTimingSynchronizer および comm.CarrierSynchronizer System object を使用して、受信機でそれらの信号を同期します。MSK タイミング同期装置はタイミング オフセットを再生し、キャリア同期装置は搬送波周波数オフセットと搬送波位相オフセットを再生します。

MATLAB® スクリプト configureMSKSignalRecoveryEx を実行してシステム変数を初期化します。論理制御変数 recoverTimingPhase を定義してタイミング位相再生を有効にし、recoverCarrier を定義して搬送波周波数および搬送波位相再生を有効にします。

configureMSKSignalRecoveryEx;
recoverTimingPhase = true;
recoverCarrier = true;

チャネル障害のモデル化

チャネル モデルが適用するサンプル遅延 timingOffset を指定します。可変非整数遅延オブジェクトを作成して、タイミング遅延を送信信号に導入します。

timingOffset = 0.2;
varDelay = dsp.VariableFractionalDelay;

comm.PhaseFrequencyOffset System object™ を作成して、搬送波位相オフセットと周波数オフセットを変調信号に導入します。MSK 変調器は送信されたシンボルをアップサンプリングするため、SampleRate プロパティを samplesPerSymbol とサンプル時間 Ts の比率に設定します。

freqOffset = 50;
phaseOffset = 30;
pfo = comm.PhaseFrequencyOffset(...
    'FrequencyOffset',freqOffset, ...
    'PhaseOffset',phaseOffset, ...
    'SampleRate',samplesPerSymbol/Ts);

シミュレーション SNR を 20 dB に設定します。MSK 変調器は 1 ワットの電力でシンボルを生成するため、信号強度は 1 W (0 dBW) になります。これは、awgn チャネルの信号強度入力の既定値です。

SNR = 20;

タイミング位相、搬送波周波数、搬送波位相同期

MSK タイミング同期装置を作成し、4 次非線形法を使用して、シンボル タイミング位相を再生します。

timeSync = comm.MSKTimingSynchronizer(...
    'SamplesPerSymbol',samplesPerSymbol, ...
    'ErrorUpdateGain',0.02);

キャリア同期装置を作成し、搬送波周波数と搬送波位相の両方を再生します。MSK コンスタレーションは位相オフセットが 0 度の QPSK であるため、それに応じて comm.CarrierSynchronizer を設定します。

phaseSync = comm.CarrierSynchronizer(...
    'Modulation','QPSK', ...
    'ModulationPhaseOffset','Custom', ...
    'CustomPhaseOffset',0, ...
    'SamplesPerSymbol',1);

ストリーム処理ループ

シミュレーションは MSK 変調を使用して、データを変調します。変調シンボルは、タイミング遅延、搬送波周波数と位相シフト、および加法性ホワイト ガウス ノイズに適用されるチャネル モデルを通過します。受信機がタイミング位相と搬送波周波数および搬送波位相の再生を実行します。最後に、信号シンボルが復調され、ビット エラー レートが計算されます。plotResultsMSKSignalRecoveryEx スクリプトは、以下の影響を示す散布図を以下の順序で生成します。

  1. チャネル障害

  2. タイミング同期

  3. 搬送波同期

この例は、シミュレーションの最後に、タイミング位相、周波数および位相推定をシミュレーション時の関数として表示します。

for p = 1:numFrames
    %------------------------------------------------------
    % Generate and modulate data
    %------------------------------------------------------
    txBits = randi([0 1],samplesPerFrame,1);
    txSym = modem(txBits);
    %------------------------------------------------------
    % Transmit through channel
    %------------------------------------------------------
    %
    % Add timing offset
    rxSigTimingOff = varDelay(txSym,timingOffset*samplesPerSymbol);
    %
    % Add carrier frequency and phase offset
    rxSigCFO = pfo(rxSigTimingOff);
    %
    % Pass the signal through an AWGN channel
    rxSig = awgn(rxSigCFO,SNR);
    %
    % Save the transmitted signal for plotting
    plot_rx = rxSig;
    %
    %------------------------------------------------------
    % Timing recovery
    %------------------------------------------------------
    if recoverTimingPhase
        % Recover symbol timing phase using 
        % fourth-order nonlinearity method
        [rxSym,timEst] = timeSync(rxSig);
        % Calculate the timing delay estimate for each sample
        timEst = timEst(1)/samplesPerSymbol;
    else
        % Do not apply timing recovery and 
        % simply downsample the received signal
        rxSym = downsample(rxSig,samplesPerSymbol);
        timEst = 0;
    end
    
    % Save the timing synchronized received signal for plotting
    plot_rxTimeSync = rxSym;
    
    %------------------------------------------------------
    % Carrier frequency and phase recovery
    %------------------------------------------------------
    if recoverCarrier
        % The following script applies carrier frequency and 
        % phase recovery using a second order phase-locked 
        % loop (PLL), and removes phase ambiguity
        [rxSym,phEst] = phaseSync(rxSym);
        removePhaseAmbiguityMSKSignalRecoveryEx;
        freqShiftEst = mean(diff(phEst)/(Ts*2*pi));
        phEst = mod(mean(phEst),360); % in degrees
    else
        freqShiftEst = 0;
        phEst = 0;
    end
    
    % Save the phase synchronized received signal for plotting
    plot_rxPhSync = rxSym;
    %------------------------------------------------------
    % Demodulate the received symbols
    %------------------------------------------------------
    rxBits = demod(rxSym);
    %------------------------------------------------------
    % Calculate the bit error rate
    %------------------------------------------------------
    errorStats = BERCalc(txBits,rxBits);
    %------------------------------------------------------
    % Plot results
    %------------------------------------------------------
    plotResultsMSKSignalRecoveryEx;
end

Figure contains 3 axes objects. Axes object 1 with title Timing Phase Estimate, ylabel Symbols contains an object of type line. Axes object 2 with title Frequency Estimate, ylabel Hz contains an object of type line. Axes object 3 with title Phase Estimate, xlabel simulation time (s), ylabel degrees contains an object of type line.

ビット エラー レートとエラー レート計算機によって処理されたシンボルの合計数を表示します。

BitErrorRate = errorStats(1)
BitErrorRate = 2.0001e-06
TotalNumberOfSymbols = errorStats(3)
TotalNumberOfSymbols = 499982

まとめおよび追加の実験

再生アルゴリズムは、タイミング、搬送波周波数および搬送波位相の同期後に取得されるコンスタレーション プロットを使用することによって実証されます。

この例の書き込み可能なコピーとそのサポート ファイルを作成するには、このスクリプトを開きます。これにより、再生アルゴリズムの効果を示すため、論理制御変数 recoverTimingPhaserecoverCarrier を有効化および無効化してシミュレーションを再実行することができます。

付録

この例では、以下のスクリプトを使用しています。

  • configureMSKSignalRecoveryEx

  • plotResultsMSKSignalRecoveryEx

  • removePhaseAmbiguityMSKSignalRecoveryEx