Восстановление сигнала MSK

Ухудшения канала модели, такие как синхронизация смещения фазы, смещения несущей частоты и фазы несущей возмещены для сигнала минимального манипулирования сдвига (MSK). Используйте comm.MSKTimingSynchronizer и comm.CarrierSynchronizer Системные объекты, чтобы синхронизировать такие сигналы в приемнике. Синхронизатор синхронизации MSK восстанавливает смещение синхронизации, в то время как синхронизатор несущей восстанавливает смещения фазы и несущая частота.

Инициализируйте системные переменные путем выполнения configureMSKSignalRecoveryEx скрипта MATLAB. Задайте логическую контрольную переменную recoverTimingPhase позволять синхронизировать восстановление фазы и recoverCarrier включить восстановление фазы и несущая частота.

configureMSKSignalRecoveryEx;
recoverTimingPhase = true;
recoverCarrier = true;

Моделирование ухудшений канала

Задайте демонстрационную задержку, timingOffset, то, что модель канала применяется. Создайте переменный дробный объект задержки ввести задержку синхронизации с переданным сигналом.

timingOffset = 0.2;
varDelay = dsp.VariableFractionalDelay;

Создайте comm.PhaseFrequencyOffset Системный объект, чтобы ввести фазу несущей и частоту возмещает к модулируемому сигналу. Поскольку модулятор MSK сверхдискретизировал переданные символы, установите SampleRate свойство к отношению samplesPerSymbol и шаг расчета, Ts.

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

Создайте comm.AWGNChannel Системный объект, чтобы добавить белый Гауссов шум в модулируемый сигнал. Шумовая мощность определяется EbNo свойство, которое является энергией, подведенной к долоту к отношению спектральной плотности мощности шума. Поскольку модулятор MSK генерирует символы с 1 ваттом мощности, установите свойство степени сигнала Системного объекта канала AWGN к 1.

EbNo = 20 + 10*log10(samplesPerSymbol);
chAWGN = comm.AWGNChannel(...
    'NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'EbNo',EbNo,...
    'SignalPower',1, ...
    'SamplesPerSymbol',samplesPerSymbol);

Синхронизируя фазу, несущую частоту и синхронизацию фазы несущей

Создайте синхронизатор синхронизации MSK, чтобы восстановить фазу символьной синхронизации с помощью метода нелинейности четвертого порядка.

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

Создайте синхронизатор несущей, чтобы восстановить и несущую частоту и фазу. Поскольку созвездие MSK является QPSK со смещением фазы с 0 степенями, установите 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 = chAWGN(rxSigCFO);
    %
    % 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

Отобразите частоту ошибок по битам и общее количество символов, обработанных калькулятором коэффициента ошибок.

BitErrorRate = errorStats(1)
TotalNumberOfSymbols = errorStats(3)
BitErrorRate =

   4.0001e-06


TotalNumberOfSymbols =

      499982

Заключение и дальнейшее экспериментирование

Алгоритмы восстановления продемонстрированы при помощи графиков созвездия, взятых после синхронизации, несущей частоты и синхронизации фазы несущей.

Откройте скрипт, чтобы создать перезаписываемую копию этого примера и его вспомогательных файлов. Затем чтобы показать эффекты алгоритмов восстановления, можно включить и отключить логические контрольные переменные recoverTimingPhase и recoverCarrier и повторно выполненный симуляция.

Приложение

Этот пример использует эти скрипты:

  • configureMSKSignalRecoveryEx

  • plotResultsMSKSignalRecoveryEx

  • removePhaseAmbiguityMSKSignalRecoveryEx