nrPUCCHDecode

Декодируйте символы модуляции PUCCH

    Описание

    пример

    [uciBits,symbols,detMet] = nrPUCCHDecode(carrier,pucch,ouci,sym) декодирует физический восходящий канал управления (PUCCH) специфичное для формата декодирование и возвращает биты восходящей управляющей информации (UCI), uciBits, как задано в Разделах TS 38.211 6.3.2.3 к 6.3.2.6 для всех форматов PUCCH. Функция также возвращает полученные символы созвездия, symbols, и метрика обнаружения, detMet. Введите carrier задает настройку несущей. Введите pucch задает специфичную для формата настройку PUCCH. Введите ouci задает незакодированные биты UCI. Когда количество битов UCI меньше 12, функция выполняет прерывистую передачу (DTX) обнаружение путем нахождения нормированного коэффициента корреляции всех возможных ссылочных последовательностей и затем сравнивает максимальное значение с порогом.

    [uciBits,symbols,detMet] = nrPUCCHDecode(carrier,pucch,ouci,sym,nVar) задает отклонение аддитивного белого Гауссова шума (AWGN) на полученных символах.

    пример

    [uciBits,symbols,detMet] = nrPUCCHDecode(___,'DetectionThreshold',detectionThreshold) задает порог обнаружения, чтобы выполнить DTX в дополнение к любой из комбинаций входных аргументов в предыдущих синтаксисах.

    Примеры

    свернуть все

    Создайте объект настройки несущей по умолчанию.

    carrier = nrCarrierConfig;

    Задайте несущую на 15 кГц с нормальным циклическим префиксом. Установите номер слота на 63.

    carrier.SubcarrierSpacing = 15;
    carrier.CyclicPrefix = 'normal';
    carrier.NSlot = 63;

    Создайте объект настройки формата 0 PUCCH по умолчанию.

    pucch = nrPUCCH0Config;

    Задайте первый индекс символа в пазе передачи PUCCH как 11 и количество выделенных символов PUCCH как 2. Включите скачкообразное движение частоты внутрипаза и скачкообразное движение группы. Установите скачкообразно двигающуюся идентичность на 512 и начальный циклический сдвиг к 5.

    pucch.SymbolAllocation = [11 2];
    pucch.FrequencyHopping = 'intraSlot';
    pucch.GroupHopping = 'enable';
    pucch.HoppingID = 512;
    pucch.InitialCyclicShift = 5;

    Задайте передачу без гибридного автоматического повторного подтверждения запроса (HARQ-ACK) и с положительным планированием запроса (SR).

    ack = zeros(0,1);
    sr = 1;           % Positive SR transmission

    Сгенерируйте символы модуляции формата 0 PUCCH.

    sym = nrPUCCH(carrier,pucch,{ack sr});

    Декодируйте символы модуляции формата 0 PUCCH.

    uci = nrPUCCHDecode(carrier,pucch,[numel(ack) numel(sr)],sym); 

    Проверьте, что полученные биты UCI совпадают с переданными битами UCI.

    isequal(uci{1},ack)
    ans = logical
       1
    
    
    isequal(uci{2},sr)
    ans = logical
       1
    
    

    Создайте объект настройки несущей по умолчанию.

    carrier = nrCarrierConfig;

    Задайте несущую на 60 кГц с расширенным циклическим префиксом. Установите номер слота на 7.

    carrier.SubcarrierSpacing = 60;
    carrier.CyclicPrefix = 'extended';
    carrier.NSlot = 7;

    Создайте объект настройки формата 1 PUCCH по умолчанию.

    pucch = nrPUCCH1Config;

    Задайте первый индекс символа в пазе передачи PUCCH как 3 и количество выделенных символов PUCCH как 9. Включите скачкообразное движение частоты внутрипаза и скачкообразное движение группы. Установите скачкообразно двигающуюся идентичность на 512, начальный циклический сдвиг к 9 и ортогональный индекс кода покрытия к 1.

    pucch.SymbolAllocation = [3 9];
    pucch.FrequencyHopping = 'intraSlot';
    pucch.GroupHopping = 'enable';
    pucch.HoppingID = 512;
    pucch.InitialCyclicShift = 9;
    pucch.OCCI = 1;

    Сгенерируйте символы модуляции формата 1 PUCCH для 1-битного UCI.

    uci = 1;
    sym = nrPUCCH(carrier,pucch,uci);

    Декодируйте символы модуляции формата 1 PUCCH с порогом обнаружения 0,7.

    rxUCI = nrPUCCHDecode(carrier,pucch,numel(uci),sym,'DetectionThreshold',0.7);

    Проверьте, что полученные биты UCI совпадают с переданными битами UCI.

    isequal(rxUCI{1},uci)
    ans = logical
       1
    
    

    Создайте объект настройки несущей по умолчанию.

    carrier = nrCarrierConfig;

    Создайте объект настройки формата 2 PUCCH по умолчанию.

    pucch = nrPUCCH2Config;

    Задайте идентичность шифрования данных как 1 000 и радиосеть временный идентификатор как 160.

    pucch.NID = 1000;
    pucch.RNTI = 160;

    Получите случайные биты UCI.

    ouci = 20;
    uci = randi([0 1],ouci,1);

    Закодируйте биты UCI.

    uciCW = nrUCIEncode(uci,100);

    Сгенерируйте символы формата 2 модуляции PUCCH.

    sym = nrPUCCH(carrier,pucch,uciCW);

    Декодируйте символы формата 2 модуляции PUCCH.

    rxUCI = nrPUCCHDecode(carrier,pucch,ouci,sym);

    Проверьте, что полученные биты UCI совпадают с переданными битами UCI.

    isequal(uciCW,double(rxUCI{1}<0))
    ans = logical
       1
    
    

    Создайте объект настройки несущей по умолчанию.

    carrier = nrCarrierConfig;

    Задайте несущую на 30 кГц с расширенным циклическим префиксом. Определите номер блоков ресурса в сетке ресурса несущей к 80.

    carrier.SubcarrierSpacing = 30;
    carrier.NSizeGrid = 80;

    Создайте объект настройки формата 3 PUCCH по умолчанию.

    pucch = nrPUCCH3Config;

    Задайте схему модуляции как pi/2-BPSK, выделение физических блоков ресурса (PRB) PUCCH, чтобы лежать в диапазоне от 70 до 74 (занятие 5 блоков ресурса), и радиосеть временный идентификатор как 2 560.

    pucch.Modulation = 'pi/2-BPSK';
    pucch.PRBSet = 70:74;
    pucch.RNTI = 2560;

    Сгенерируйте индексы элемента ресурса формата 3 PUCCH.

    [pucchIndices,pucchInfo] = nrPUCCHIndices(carrier,pucch);
    G = pucchInfo.G;                                          % Rate-matched length

    Получите случайные биты UCI.

    ouci = 30;
    uciBits = randi([0 1],ouci,1);

    Закодируйте биты UCI.

    codedUCI = nrUCIEncode(uciBits,G);

    Сгенерируйте модулируемые символы формата 3 PUCCH.

    sym = nrPUCCH(carrier,pucch,codedUCI);

    Сгенерируйте опорный сигнал демодуляции (DM-RS) символы и индексы.

    dmrsSym = nrPUCCHDMRS(carrier,pucch);
    dmrsInd = nrPUCCHDMRSIndices(carrier,pucch);

    Создайте сетку ресурса. Сопоставьте символы PUCCH и символы DM-RS к сетке.

    resGrid = nrResourceGrid(carrier);
    resGrid(pucchIndices) = sym;
    resGrid(dmrsInd) = dmrsSym;

    Выполните модуляцию ортогонального мультиплексирования деления частоты (OFDM).

    txWaveform = nrOFDMModulate(carrier,resGrid);

    Выполните спина к спине декодирование.

    rxWaveform = txWaveform;
    rxGrid = nrOFDMDemodulate(carrier,rxWaveform);

    Извлеките символы формата 3 PUCCH из полученной сетки.

    rxSym = nrExtractResources(pucchIndices,rxGrid);

    Декодируйте символы модуляции формата 3 PUCCH, и затем декодируйте биты UCI.

    rxUCI = nrPUCCHDecode(carrier,pucch,ouci,rxSym);
    rxUCIBits = nrUCIDecode(rxUCI{1},ouci);

    Проверьте, что полученные биты UCI совпадают с переданными битами UCI.

    isequal(uciBits,rxUCIBits)
    ans = logical
       1
    
    

    Создайте объект настройки несущей по умолчанию, и затем установите идентичность ячейки как 140.

    carrier = nrCarrierConfig;
    carrier.NCellID = 140;

    Создайте объект настройки формата 4 PUCCH по умолчанию.

    pucch = nrPUCCH4Config;

    Задайте распространяющийся фактор как 4, OCCI как 3, и радиосеть временный идентификатор как 750.

    pucch.SpreadingFactor = 4;
    pucch.OCCI = 3;
    pucch.RNTI = 750;

    Получите случайные биты UCI.

    ouci = 20;
    uci = randi([0 1],ouci,1);

    Закодируйте биты UCI.

    uciCW = nrUCIEncode(uci,60);

    Сгенерируйте символы формата 4 модуляции PUCCH.

    sym = nrPUCCH(carrier,pucch,uciCW);

    Декодируйте символы формата 4 модуляции PUCCH.

    rxUCI = nrPUCCHDecode(carrier,pucch,ouci,sym);

    Проверьте, что полученные биты UCI совпадают с переданными битами UCI.

    isequal(uciCW,double(rxUCI{1}<0))
    ans = logical
       1
    
    

    Сравните передачу и прием форматов 0 и 2 PUCCH для двух различного оборудования пользователя.

    Настройка несущей

    Создайте объект настройки несущей по умолчанию, и затем установите идентичность ячейки на 10.

    carrier = nrCarrierConfig;
    carrier.NCellID = 10;

    Настройка PUCCH

    Создайте объект настройки формата 0 PUCCH с заданными свойствами для оборудования пользователя (UE) 1.

    pucch0 = nrPUCCH0Config;
    pucch0.PRBSet = 0;
    pucch0.HoppingID = 0;

    Создайте объект настройки формата 2 PUCCH с заданными свойствами для UE 2.

    pucch2 = nrPUCCH2Config;
    pucch2.PRBSet = 0;
    pucch2.RNTI = 10;

    Настройка модели распространения канала

    Задайте конфигурационную структуру канала с помощью nrTDLChannel Системный объект.

    channel = nrTDLChannel;
    channel.NumReceiveAntennas = 4;
    info1 = nrOFDMInfo(carrier);
    channel.SampleRate = info1.SampleRate;                         % Set waveform sample rate
    chInfo = info(channel);
    maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate));
    maxChDelay = maxChDelay + chInfo.ChannelFilterDelay;

    Шумовая настройка

    Нормируйте шумовую мощность несущей и конфигурировать генератор случайных чисел.

    SNRdB = 21.0;
    SNR = 10^(SNRdB/20);
    N = 1/(SNR*sqrt(double(info1.Nfft)))/sqrt(2.0);
    rng('default');

    Символы PUCCH и генерация индексов для формата 0 и формата 2

    Задайте биты HARQ-ACK для формата 0 PUCCH.

    hi1 = [0;1];
    disp('hi1:');
    hi1:
    
    disp(hi1.');
         0     1
    

    Сгенерируйте символы модуляции формата 0 PUCCH.

    pucch0Sym = nrPUCCH(carrier,pucch0,hi1);

    Сгенерируйте символы DM-RS для форматов 0 и 2 PUCCH.

    pucch0DMRSSym = nrPUCCHDMRS(carrier,pucch0);
    pucch2DRSSym = nrPUCCHDMRS(carrier,pucch2);

    Сгенерируйте индексы элемента ресурса формата 2 PUCCH.

    [pucch2Ind,pucch2Info] = nrPUCCHIndices(carrier,pucch2);

    Создайте биты информации о качестве канала (CQI).

    cqi = [0; 1; 1; 0; 0; 1];
    disp('cqi:');
    cqi:
    
    disp(cqi.');
         0     1     1     0     0     1
    

    Закодируйте биты CQI.

    codedcqi = nrUCIEncode(cqi,pucch2Info.G);

    Сгенерируйте символы модуляции формата 2 PUCCH.

    pucch2Sym = nrPUCCH(carrier,pucch2,codedcqi);

    PUCCH индексируют генерацию для формата 0 и формата 2

    Сгенерируйте индексы PUCCH для форматов 0 и 2.

    pucch0Indices = nrPUCCHIndices(carrier,pucch0);    
    pucch2Indices = nrPUCCHIndices(carrier,pucch2);        

    Сгенерируйте индексы DM-RS для форматов 0 и 2 PUCCH.

    pucch0DMRSIndices = nrPUCCHDMRSIndices(carrier,pucch0);  
    pucch2DMRSIndices = nrPUCCHDMRSIndices(carrier,pucch2);

    Передача с форматом 0 PUCCH

    Создайте сетку ресурса. Сопоставьте символы PUCCH и символы DM-RS формата 0 к сетке.

    grid1 = nrResourceGrid(carrier);
    grid1(pucch0Indices) = pucch0Sym;
    grid1(pucch0DMRSIndices) = pucch0DMRSSym;

    Выполните модуляцию OFDM и передайте форму волны через канал коснувшейся линии задержки (TDL).

    txwave1 = nrOFDMModulate(carrier,grid1);
    txwave1 = [txwave1; zeros(maxChDelay,size(txwave1,2))];
    [rxwave1,pathGains1,sampleTimes1] = channel(txwave1);

    Передача с форматом 2 PUCCH

    Создайте сетку ресурса. Сопоставьте символы PUCCH и символы DM-RS формата 2 к сетке.

    grid2 = nrResourceGrid(carrier);
    grid2(pucch2Indices) = pucch2Sym;            
    grid2(pucch2DMRSIndices) = pucch2DRSSym; 

    Выполните модуляцию OFDM, и затем передайте форму волны через канал TDL.

    txwave2 = nrOFDMModulate(carrier,grid2);
    release(channel);
    channel.Seed = 15;
    txwave2 = [txwave2; zeros(maxChDelay,size(txwave2,2))];
    [rxwave2,pathGains,sampleTimes] = channel(txwave2);

    Прием в базовой станции

    Добавьте AWGN в полученный сигнал.

    rxwave = rxwave1 + rxwave2;                                  % Add both the faded signals      
    noise = N*complex(randn(size(rxwave)),randn(size(rxwave)));
    rxwave = rxwave + noise;

    Демодулируйте полученный сигнал и извлеките формат 0 PUCCH индексы RE.

    rxgrid1 = nrOFDMDemodulate(carrier,rxwave(1:end,:));
    rxpucch0 = nrExtractResources(pucch0Indices,rxgrid1);

    Декодируйте символы формата 0 PUCCH

    Декодируйте символы формата 0 PUCCH.

    rxhi1 = nrPUCCHDecode(carrier,pucch0,length(hi1),rxpucch0);
    disp('rxhi1:');
    rxhi1:
    
    disp(rxhi1{1}.');
       0   1
    

    Проверьте, что полученные биты HARQ-ACK совпадают с переданными битами HARQ-ACK.

    if isequal(hi1,rxhi1{1})
        disp('PUCCH format 0 data decoded')
    else
        disp('PUCCH format 0 data not decoded')
    end
    PUCCH format 0 data decoded
    

    Декодируйте символы формата 2 PUCCH

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

    [t,mag] = nrTimingEstimate(carrier,rxwave,pucch2DMRSIndices,pucch2DRSSym);
    if t > maxChDelay
        t = 0;
    end
    rxgrid2 = nrOFDMDemodulate(carrier,rxwave(1+t:end,:));

    Получите практическую оценку канала, и затем извлеките формат 2 PUCCH индексы RE.

    [H2, n0] = nrChannelEstimate(carrier,rxgrid2,pucch2DMRSIndices,pucch2DRSSym);
    [pucchrx2, pucchH2] = nrExtractResources(pucch2Indices,rxgrid2,H2);

    Выполните эквализацию минимальной среднеквадратичной погрешности (MMSE) на извлеченных элементах ресурса формата 2 PUCCH.

    pucch2eq = nrEqualizeMMSE(pucchrx2,pucchH2,n0);

    Декодируйте символы модуляции формата 2 PUCCH, и затем декодируйте биты CQI.

    rxcodedcqi = nrPUCCHDecode(carrier,pucch2,length(cqi),pucch2eq);
    rxcqi = nrUCIDecode(rxcodedcqi{1},length(cqi));
    disp('rxcqi:');
    rxcqi:
    
    disp(rxcqi.');
       0   1   1   0   0   1
    

    Проверьте, что полученные биты CQI совпадают с переданными битами CQI.

    if isequal(cqi,rxcqi)
        disp('PUCCH format 2 data decoded')
    else
        disp('PUCCH format 2 data not decoded')
    end
    PUCCH format 2 data decoded
    

    Входные параметры

    свернуть все

    Параметры конфигурации несущей для определенной нумерологии OFDM в виде nrCarrierConfig объект. Эта функция использует только их nrCarrierConfig свойства объектов.

    Параметры конфигурации PUCCH в виде одной из этих опций.

    Количество незакодированных битов UCI в виде неотрицательного целого числа или в зависимости от типа формата.

    • Для формата 0 необходимо задать неотрицательное целое число или двухэлементный вектор из неотрицательных целых чисел.

      • Когда вы задаете это значение, когда скаляр, незакодированные биты UCI представляют гибридное автоматическое повторное подтверждение запроса (HARQ-ACK) биты.

      • Когда вы задаете это значение как вектор, первый элемент представляет биты HARQ-ACK, и второй элемент представляет бит планирования запроса (SR).

    • Для формата 1 необходимо задать неотрицательное целое число. Когда вы задаете это значение, незакодированные биты UCI представляет биты HARQ-ACK или биты SR.

    • Для форматов 2, 3, и 4, незакодированные биты UCI представляют количество битов UCI в обеих частях.

    Типы данных: double

    Символы модуляции PUCCH для заданного формата, возвращенного как вектор-столбец с комплексным знаком или матрица с комплексным знаком.

    Для форматов 0 и 1, sym аргумент должен быть матрицей с количеством столбцов, равных количеству, получают антенны. Для форматов 2, 3, и 4, sym аргумент должен быть вектор-столбцом.

    Типы данных: single | double
    Поддержка комплексного числа: Да

    Шумовое отклонение в виде неотрицательного скаляра. Функция масштабирует символы с отклонением аддитивного белого Гауссова шума (AWGN). Значение по умолчанию соответствует сигналу к шумовому отношению (ОСШ) 100 дБ, приходя к модульной власти сигнала.

    Когда шумовое значение отклонения меньше 1e-10, функция использует значение 1e-10.

    Типы данных: double

    Порог обнаружения в виде [] или скаляр в диапазоне от 0 до 1. Когда вы не задаете вход, или вы устанавливаете его на [], функция выбирает одно из этих значений по умолчанию на основе типа формата.

    • Для формата 0 значением по умолчанию является 0.49 для одного символа OFDM и 0.42 для двух символов OFDM.

    • Для формата 1 значением по умолчанию является 0.36.

    • Для форматов 2, 3, и 4, значением по умолчанию является 0.45.

    Типы данных: double

    Выходные аргументы

    свернуть все

    Биты UCI, возвращенные как один - или двухэлементный массив ячеек в зависимости от типа формата. Для формата 0 и 1, типа данных uciBits int8. Для формата 2, 3, и 4, uciBits наследовал тип данных sym входной параметр.

    • Для формата 0, uciBits один - или двухэлементный массив ячеек с UCI твердые биты.

      • Для массива ячеек с одним элементом функция возвращает HARQ-ACK твердые биты.

      • Для двухэлементного массива ячеек функция возвращает первый элемент как HARQ-ACK твердые биты и второй элемент как бит SR.

      Декодирование формата 0 PUCCH включает обнаружение DTX, сопровождаемое путем нахождения последовательности, которая имеет максимальную нормированную метрику корреляции.

    • Для формата 1, uciBits массив ячеек с одним элементом с UCI твердые биты. Декодирование формата 1 PUCCH включает обнаружение DTX, сопровождаемое согласованной фильтрацией.

    • Для форматов 2, 3, и 4, uciBits массив ячеек с одним элементом с мягкими битами UCI. Для форматов 2, 3 PUCCH, и 4, UCI мягкие биты возвращены сообщение обнаружение DTX (применимый до 12 незакодированных uci битов) и обратная обработка кодирования PUCCH.

    Типы данных: cell

    Полученные символы созвездия, возвращенные как вектор-столбец со знаком столбца. symbols наследовал тип данных sym входной параметр.

    Типы данных: double | single
    Поддержка комплексного числа: Да

    Метрика обнаружения, возвращенная как целое число. Для форматов 2, 3 PUCCH, и 4, когда ouci вход не находится в диапазоне от 3 до 11, этим выходом является 0.

    Типы данных: double | single

    Ссылки

    [1] 3GPP TS 38.211. “NR; Физические каналы и модуляция”. Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

    Расширенные возможности

    Введенный в R2021b