Этот пример показывает реализацию передатчика QPSK и приемника с MATLAB®. В частности, этот пример иллюстрирует методы, чтобы решить реальные проблемы радиосвязей как несущая частота и смещение фазы, синхронизируя восстановление и кадровую синхронизацию. Для реализации Simulink® той же системы обратитесь к Передатчику QPSK и Приемнику в примере Simulink.
Переданные данные о QPSK подвергаются ухудшениям, которые симулируют эффекты беспроводной передачи, такие как сложение Аддитивного белого Гауссова шума (AWGN), введение несущей частоты и смещение фазы, и синхронизирующий дрейф. Чтобы справиться с этими ухудшениями, этот пример обеспечивает исходный проект практического цифрового приемника. Приемник включает основанную на корреляции крупную компенсацию частоты, основанную на PLL прекрасную компенсацию частоты, основанное на PLL восстановление символьной синхронизации, кадровую синхронизацию и разрешение неоднозначности фазы.
Этот пример служит двум основным целям:
Смоделировать общую систему радиосвязи, которая может успешно восстановить сообщение, которое было повреждено различными симулированными ухудшениями канала.
Проиллюстрировать использование компонентов синхронизации ключа Communications Toolbox™ включая крупную и прекрасную компенсацию несущей частоты, восстановление синхронизации с обратной связью с заполнением битами и разделением, кадровой синхронизацией и разрешением неоднозначности фазы несущей.
commqpsktxrx_init.m скрипт инициализирует параметры симуляции и генерирует структуру prmQPSKTxRx.
prmQPSKTxRx = commqpsktxrx_init %#ok<*NOPTS> % QPSK system parameters useScopes = true; % true if scopes are to be used printReceivedData = false; %true if the received data is to be printed compileIt = false; % true if code is to be compiled useCodegen = false; % true to run the generated mex file
prmQPSKTxRx = struct with fields: ModulationOrder: 4 Interpolation: 2 Decimation: 1 Rsym: 50000 Tsym: 2.0000e-05 Fs: 100000 TotalFrame: 1000 BarkerCode: [1 1 1 1 1 -1 -1 1 1 -1 1 -1 1] BarkerLength: 13 HeaderLength: 26 Message: 'Hello world' MessageLength: 16 NumberOfMessage: 20 PayloadLength: 2240 FrameSize: 1133 FrameTime: 0.0227 RolloffFactor: 0.5000 ScramblerBase: 2 ScramblerPolynomial: [1 1 1 0 1] ScramblerInitialConditions: [0 0 0 0] RaisedCosineFilterSpan: 10 PhaseOffset: 47 EbNo: 13 FrequencyOffset: 5000 DelayType: 'Triangle' DesiredPower: 2 AveragingLength: 50 MaxPowerGain: 20 MaximumFrequencyOffset: 6000 PhaseRecoveryLoopBandwidth: 0.0100 PhaseRecoveryDampingFactor: 1 TimingRecoveryLoopBandwidth: 0.0100 TimingRecoveryDampingFactor: 1 TimingErrorDetectorGain: 5.4000 PreambleDetectorThreshold: 20 MessageBits: [11200x1 double] BerMask: [1540x1 double]
Этот пример демонстрирует систему цифровой связи с помощью модуляции QPSK. Функция runQPSKSystemUnderTest.m моделирует эту среду передачи. Модель приемопередатчика QPSK в этом скрипте разделена на следующие четыре основных компонента.
1) QPSKTransmitter.m: генерирует поток битов и затем кодирует, модулирует и фильтрует его.
2) QPSKChannel.m: моделирует канал со смещением несущей, синхронизируя смещение и AWGN.
3) QPSKReceiver.m: моделирует приемник, включая компоненты для восстановления фазы, синхронизируя восстановление, декодирование, демодуляцию, и т.д.
4) QPSKScopes.m: опционально визуализирует сигнал, использующий осциллографы времени, осциллографы частоты и схемы созвездия.
Каждый компонент моделируется с помощью Системного объекта. Чтобы видеть конструкцию четырех компонентов объекта основной системы, обратитесь к runQPSKSystemUnderTest.m.
Передатчик
Этот компонент генерирует сообщение с помощью символов ASCII, преобразует символы вдребезги и предварительно ожидает код Баркера для кадровой синхронизации приемника. Эти данные затем модулируются с помощью QPSK и фильтруются с фильтром приподнятого косинуса квадратного корня.
Канал
Этот компонент симулирует эффекты беспроводной передачи. Это ухудшает переданный сигнал и с фазой и со смещением частоты, изменяющаяся во времени задержка, чтобы подражать расфазировке тактовых сигналов между передатчиком и приемником и AWGN.
Приемник
Этот компонент регенерирует исходное переданное сообщение. Это разделено на семь субкомпонентов.
1) Автоматическое Управление Усилением: Устанавливает его выходную мощность на уровень, гарантирующий, что эквивалентные усиления фазы и детекторов ошибок синхронизации сохраняют постоянными в зависимости от времени. AGC помещается перед Повышенным Косинусом Получают Фильтр так, чтобы амплитуда сигнала могла быть измерена с фактором сверхдискретизации два. Этот процесс улучшает точность оценки.
2) Крупная компенсация частоты: Использует основанный на корреляции алгоритм, чтобы примерно оценить смещение частоты и затем компенсировать его. Предполагаемое крупное смещение частоты усреднено так, чтобы прекрасной компенсации частоты позволили блокировать/сходиться. Следовательно, крупное смещение частоты оценивается с помощью comm.CoarseFrequencyCompensator Системного объекта и формулы усреднения; компенсация выполняется с помощью comm.PhaseFrequencyOffset Системного объекта.
3) Синхронизация восстановления: Выполняет восстановление синхронизации со скалярной обработкой с обратной связью, чтобы преодолеть эффекты задержки, введенной каналом, с помощью comm.SymbolSynchronizer Системного объекта. Объект реализует PLL, чтобы откорректировать ошибку символьной синхронизации в полученном сигнале. Вращательно инвариантный Гарднер, синхронизирующий детектор ошибок, выбран для объекта в этом примере; таким образом синхронизация восстановления может предшествовать прекрасной компенсации частоты. Вход к объекту является системой координат фиксированной длины выборок. Выход объекта является системой координат символов, длина которых может варьироваться из-за заполнения битами и разделяющий, в зависимости от фактических задержек канала.
4) Прекрасная компенсация частоты: Выполняет скалярную обработку с обратной связью и компенсирует смещение частоты точно, с помощью comm.CarrierSynchronizer Системного объекта. Объект реализует фазовую подстройку частоты (PLL), чтобы отследить остаточное смещение частоты и смещение фазы во входном сигнале.
5) Обнаружение преамбулы: Обнаруживает местоположение известного кода Баркера во входе с помощью comm.PreambleDetector Системного объекта. Объект реализует основанный на взаимной корреляции алгоритм, чтобы обнаружить известную последовательность символов во входе.
6) Кадровая синхронизация: Выполняет кадровую синхронизацию и, также, преобразует входные параметры символа переменной длины в фиксированную длину выходные параметры, с помощью Системного объекта FrameSynchronizer. Объект имеет вторичный выход, который является булевым скаляром, указывающим, допустима ли первая система координат выход.
7) Декодер данных: Выполняет разрешение неоднозначности фазы и демодуляцию. Кроме того, декодер данных сравнивает регенерированное сообщение с переданным и вычисляет BER.
Осциллографы
Этот компонент обеспечивает дополнительную визуализацию, чтобы построить:
Осциллограф спектра, изображающий полученный сигнал до и после квадратного корня, повысил фильтрацию косинуса,
Схемы созвездия, показывающие полученный сигнал после фильтрации приемника, после синхронизации восстановления и затем после прекрасной компенсации частоты.
Для получения дополнительной информации о компонентах системы, отошлите к Передатчику QPSK и Приемнику в Simulink пример Simulink.
Основной цикл в системе в соответствии с тестовым скриптом обрабатывает покадровые данные. Установите переменную MATLAB compileIt
к истине для того, чтобы сгенерировать код. Это может быть выполнено при помощи codegen команды, обеспеченной продуктом MATLAB Coder™. codegen команда переводит функции MATLAB® в файл MEX, производя код для ускоренного выполнения. Сгенерированный код C запускается несколько раз быстрее, чем оригинальный код MATLAB. В данном примере установите useCodegen
к истинному, чтобы использовать код, сгенерированный codegen вместо кода MATLAB.
Внутренний цикл runQPSKSystemUnderTest.m использует эти четыре Системных объекта, ранее упомянутые. В этом файле существует цикл for вокруг системы под тестом, чтобы обработать один кадр за один раз.
for count = 1:prmQPSKTxRx.FrameCount transmittedSignal = qpskTx(); rcvdSignal = qpskChan(transmittedSignal, count); [RCRxSignal, timingRecSignal, freqRecSignal, BER] = qpskRx(rcvdSignal); % Receiver if useScopes runQPSKScopes(qpskScopes, rcvdSignal, RCRxSignal, timingRecSignal, freqRecSignal); % Plots all the scopes end end
Чтобы запустить Систему В соответствии с Тестовым скриптом и получить значения BER для симулированной коммуникации QPSK, следующий код выполнен. Когда вы запускаете симуляции, это отображает данные о частоте ошибок по битам и некоторые графические результаты. Отображенные осциллографы являются схемами созвездия Raised Cosine Receive Filter выход, Symbol Synchronizer выход и Fine Frequency Compensation выход и спектр мощности Raised Cosine Receive Filter выход.
if compileIt codegen -report runQPSKSystemUnderTest.m -args {coder.Constant(prmQPSKTxRx),coder.Constant(useScopes),coder.Constant(printReceivedData)} %#ok end if useCodegen BER = runQPSKSystemUnderTest_mex(prmQPSKTxRx,useScopes,printReceivedData); else BER = runQPSKSystemUnderTest(prmQPSKTxRx,useScopes,printReceivedData); end fprintf('Error rate = %f.\n',BER(1)); fprintf('Number of detected errors = %d.\n',BER(2)); fprintf('Total number of compared samples = %d.\n',BER(3));
Error rate = 0.000238. Number of detected errors = 366. Total number of compared samples = 1536920.
Как уже упомянуто в разделе System Under Test, при помощи переменных в начале примера, возможно взаимодействовать с кодом, чтобы исследовать различные аспекты опций кодирования и Системных объектов.
По умолчанию, переменные useScopes
и printReceivedData
установлены в истину и ложь, соответственно. useScopes
переменная позволяет осциллографам MATLAB быть открытыми во время выполнения в качестве примера. Используя осциллографы, вы видите, как симулированные субкомпоненты ведут себя и также получают лучшее понимание как системные функции во времени симуляции. Когда вы установите эту переменную на ложь, осциллографы не откроются во время выполнения в качестве примера. Когда вы устанавливаете printReceivedData
к истине можно также видеть декодируемые полученные пакеты, распечатанные в командном окне. Другие две переменные, compileIt и useCodegen
, связаны с быстродействием и может использоваться, чтобы анализировать компромиссы проекта.
Когда вы установите compileIt на истину, этот скрипт в качестве примера будет использовать возможности MATLAB Coder™ скомпилировать скрипт runQPSKSystemUnderText для ускоренного выполнения. Эта команда создаст файл MEX (runQPSKSystemUnderTest_mex) и сохранит его в текущей папке. Если вы устанавливаете useCodegen на истинный запускать файл MEX, пример может запустить систему, реализованную в MATLAB намного быстрее. Эта функция важна для реализации систем реального времени и является важным инструментом симуляции. Чтобы максимизировать скорость симуляции, установите useScopes
ко лжи и useCodegen
к истинному, чтобы запустить файл MEX.
Для других опций исследования обратитесь к Передатчику QPSK и Приемнику в примере Simulink.
Этот пример симулирует цифровую связь по каналу AWGN. Это показывает, как смоделировать несколько частей системы QPSK, таких как модуляция, частота и восстановление фазы, синхронизировав восстановление и кадровую синхронизацию. Это измеряет производительность системы путем вычисления BER. Это также показывает, что сгенерированный код C запускается несколько раз быстрее, чем оригинальный код MATLAB.
Этот пример использует следующий скрипт и функции помощника:
1. Рис, Майкл. Цифровая связь - Подход Дискретного времени. 1-й редактор Нью-Йорк, Нью-Йорк: Prentice Hall, 2008.