Этот пример показывает реализацию передатчика и приемника QPSK с MATLAB ®. В частности, этот пример иллюстрирует способы решения проблем реальной радиосвязи, таких как частота несущей и смещение фазы, восстановление синхронизации и синхронизация системы координат. Для реализации Simulink ® той же системы смотрите пример передатчика и приемника QPSK в Simulink.
Переданные данные QPSK подвергаются нарушениям, которые моделируют эффекты беспроводной передачи, такие как сложение аддитивного белого гауссова шума (AWGN), введение несущей частоты и смещения фазы и дрейф синхронизации. Чтобы справиться с этими нарушениями, этот пример предоставляет исходный проект практичного цифрового приемника. Приемник включает в себя основанную на корреляции компенсацию грубой частоты, основанную на ФАПЧ компенсацию мелкой частоты, восстановление временных параметров символа на основе ФАПЧ, синхронизацию системы координат и разрешение неоднозначности фазы.
Этот пример служит двум основным целям:
Чтобы смоделировать общую систему радиосвязи, которая способна успешно восстановить сообщение, которое было повреждено различными имитированными нарушениями канала.
Для иллюстрации использования ключевых компонентов синхронизации 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) QPSCReceiver.m: моделирует приемник, включая компоненты для восстановления фазы, восстановления синхронизации, декодирования, демодуляции и т.д.
4) QPSKScopes.m: опционально визуализирует сигнал с помощью временных возможностей, частотных возможностей и созвездия схем.
Каждый компонент моделируется с помощью Системного объекта. Для просмотра конструкции четырех основных компонентов системного объекта см. runQPSKSystemUnderTest.m.
Передатчик
Этот компонент генерирует сообщение с использованием символов ASCII, преобразует символы в биты и готовит код Баркера для синхронизации системы координат приемника. Эти данные затем модулируются с использованием QPSK и фильтруются с помощью квадратного корня фильтра приподнятого косинуса.
Канал
Этот компонент имитирует эффекты беспроводной передачи. Это ухудшает переданный сигнал как со смещением фазы, так и со смещением частоты, изменяющейся во времени задержкой для имитации синхроимпульса между передатчиком и приемником и AWGN.
Приемник
Этот компонент регенерирует исходное переданное сообщение. Она разделена на семь подкомпонентов.
1) Автоматическое управление усилением: Устанавливает свою выходную степень на уровень, гарантирующий, что эквивалентные усиления фазы и детекторы временных ошибок остаются постоянными с течением времени. АРУ помещается перед приёмным фильтром приподнятого косинуса, так что амплитуда сигнала может быть измерена с коэффициентом избыточной дискретизации двух. Этот процесс улучшает точность оценки.
2) Грубая частотная компенсация: Использует основанный на корреляции алгоритм, чтобы примерно оценить смещение частоты и затем компенсировать его. Оценочное смещение грубой частоты усредняется так, что точная частотная компенсация может блокироваться/сходиться. Следовательно, смещение грубой частоты оценивается с помощью Системного объекта comm.CoarseFrequencyCompensator и формулы усреднения; компенсация выполняется с помощью Системного объекта comm.PhaseFrequencyOffset.
3) Восстановление синхронизации: Выполняет восстановление синхронизации с обратной связью скаляра обработки, чтобы преодолеть эффекты задержки, введенные каналом, используя Системный объект comm.SymbolSynchronizer. Объект реализует ФАП, чтобы исправить ошибку синхронизации символа в принятом сигнале. Для объекта в этом примере выбран вращательно-инвариантный детектор временных ошибок Гарднера; таким образом, восстановление синхронизации может предшествовать тонкой частотной компенсации. Вход к объекту является системой координат выборок фиксированной длины. Выходом объекта является система координат символов, длина которого может варьироваться из-за набивки и зачистки битов, в зависимости от фактических задержек канала.
4) Точная компенсация частоты: Выполняет скалярную обработку с обратной связью и точно компенсирует смещение частоты, используя Системный объект comm.CarrierSynchronizer. Объект реализует цикл фазовой автоподстройки (ФАП), чтобы отслеживать смещение остаточной частоты и смещение фазы в входном сигнале.
5) Обнаружение преамбулы: Обнаруживает местоположение известного кода Баркера во входе с помощью Системного объекта comm.PreambleDetector. Объект реализует алгоритм, основанный на перекрестной корреляции, чтобы обнаружить известную последовательность символов во входе.
6) Система координат Синхронизация: Выполняет систему координат синхронизацию и, кроме того, преобразует входы символа переменной длины в выходы фиксированной длины, используя Системный объект FrameSynchronizer. Объект имеет вторичный выход, который является булевым скаляром, указывающим, является ли первый вывод системы координат допустимым.
7) Декодер данных: Выполняет разрешение неоднозначности фазы и демодуляцию. Кроме того, декодер данных сравнивает регенерированное сообщение с переданным и вычисляет BER.
Возможности
Этот компонент обеспечивает необязательную визуализацию для построения:
Область возможностей, изображающая принятый сигнал до и после квадратного корня, повышенная фильтрация косинуса,
Диаграммы созвездия, показывающие принятый сигнал после фильтрации приемника, после восстановления синхронизации и затем после точной компенсации частоты.
Для получения дополнительной информации о компонентах системы см. пример передатчика и приемника QPSK в Simulink Simulink.
Основной цикл в системе под тестовый скрипт обрабатывает данные кадр за кадром. Установите переменный MATLAB compileIt
true в порядок для генерации кода. Это может быть достигнуто с помощью команды codegen, предоставляемой MATLAB Coder™ продуктом. Команда codegen переводит функции MATLAB ® в файл MEX, создавая код для ускоренного выполнения. Сгенерированный код C запускается в несколько раз быстрее, чем оригинальный код MATLAB. В данном примере задайте useCodegen
true, чтобы использовать код, сгенерированный codegen вместо кода MATLAB.
Внутренний цикл runQPSKSystemUnderTest.m использует четыре Системных объектов, упомянутые ранее. В этом файле существует цикл for-loop вокруг тестируемой системы для обработки одной системы координат за раз.
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
Чтобы запустить скрипт System Under Test и получить значения BER для моделируемой связи QPSK, выполняется следующий код. Когда вы запускаете симуляции, он отображает данные о вероятности битовой ошибки и некоторые графические результаты. Отображаемые возможности являются сигналами созвездия Приподнятого выхода Приёмного Фильтра Косина, выхода Symbol Synchronizer и выхода Точной Компенсации Частот и степени спектра Приёмного выхода Приёма Косина.
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.
Как уже упоминалось в разделе Система в процессе тестирования, при помощи переменных в начале примера можно взаимодействовать с кодом, чтобы исследовать различные аспекты системных объектов и опций кодирования.
По умолчанию переменные useScopes
и printReceivedData
заданы значения true и false, соответственно. The useScopes
переменная позволяет открывать возможности MATLAB во время выполнения примера. Используя возможности, можно увидеть, как ведут себя моделируемые подкомпоненты, а также получить лучшее понимание того, как система функционирует во времени симуляции. Когда вы задаете для этой переменной значение false, возможности не откроются во время выполнения примера. Когда вы задаете printReceivedData
на true можно также увидеть декодированные полученные пакеты, напечатанные в командном окне. Другие две переменные, compileIt и useCodegen
, связаны со скоростью эффективности и могут использоваться для анализа компромиссов проекта.
Когда вы устанавливаете compileIt на true, этот пример скрипта будет использовать Coder™ возможности MATLAB, чтобы скомпилировать скрипт runQPSKSystemUnderText для ускоренного выполнения. Эта команда создаст файл MEX (runQPSKSystemUnderTest_mex) и сохранит его в текущей папке. Если установить значение true для useCodegen, чтобы запустить файл MEX, то пример сможет запустить систему, реализованную в MATLAB намного быстрее. Эта функция необходима для реализации систем в реальном времени и является важным инструментом симуляции. Чтобы максимизировать скорость симуляции, установите useScopes
к ложным и useCodegen
true, чтобы запустить файл mex.
Для других вариантов исследования опции пример передатчика и приемника QPSK в Simulink.
Этот пример моделирует цифровую связь по каналу AWGN. Это показывает, как смоделировать несколько частей системы QPSK, таких как модуляция, восстановление частоты и фазы, восстановление синхронизации и синхронизация системы координат. Он измеряет производительность системы путем вычисления BER. Также показано, что сгенерированный код C запускается в несколько раз быстрее, чем оригинальный код MATLAB.
В этом примере используются следующие скрипты и вспомогательные функции:
1. Райс, Майкл. Цифровые коммуникации - подход в дискретном времени. 1-й эд. Нью-Йорк, Нью-Йорк: Prentice Hall, 2008.