comm.RSEncoder

Закодируйте данные с помощью энкодера Тростника-Solomon

Описание

RSEncoder объект создает код Тростника-Solomon с сообщением и длинами кодовой комбинации, которые вы задаете.

Закодировать данные с помощью схемы кодирования Тростника-Solomon:

  1. Задайте и настройте свой объект энкодера Тростника-Solomon. Смотрите Конструкцию.

  2. Вызовите step закодировать данные согласно свойствам comm.RSEncoder. Поведение step характерно для каждого объекта в тулбоксе.

Примечание

Запуск в R2016b, вместо того, чтобы использовать step метод, чтобы выполнить операцию, заданную Системой object™, можно вызвать объект с аргументами, как будто это была функция. Например, y = step(obj,x) и y = obj(x) выполните эквивалентные операции.

Конструкция

enc = comm.RSEncoder создает Системный объект блочного энкодера, enc. Этот объект выполняет кодирование Тростника-Solomon (RS).

enc = comm.RSEncoder(N,K) создает объект энкодера RS, enc, с CodewordLength набор свойств к N и MessageLength набор свойств к K.

enc = comm.RSEncoder(N,K,GP) создает объект энкодера RS, enc, с CodewordLength набор свойств к N, MessageLength набор свойств к K, и GeneratorPolynomial набор свойств к GP.

enc = comm.RSEncoder(N,K,GP,S) создает объект энкодера RS, enc, с CodewordLength набор свойств к N, MessageLength набор свойств к K, GeneratorPolynomial набор свойств к GP, и ShortMessageLength набор свойств к S.

enc = comm.RSEncoder(N,K,GP,S,Name,Value) создает объект энкодера RS, enc, с CodewordLength набор свойств к N, MessageLength набор свойств к K, GeneratorPolynomial набор свойств к GP, ShortMessageLength набор свойств к S, и каждое заданное свойство Name установите на заданный Value.

enc = comm.RSEncoder(Name,Value) создает объект энкодера RS, enc, с каждым заданным набором имени свойства к заданному значению. Можно задать дополнительные аргументы пары "имя-значение" в любом порядке как (Name1, Value1..., NameN, ValueN).

Свойства

Примечание

Длины сигнала ввода и вывода перечислены в Длинах Сигнала Ввода и вывода в BCH и Системных объектах RS на comm.BCHDecoder страница с описанием.

BitInput

Примите, что вводит, биты

Задайте, включает ли вход биты или целые числа. Значением по умолчанию является false.

Когда вы устанавливаете это свойство на false, значение входных данных при выполнении объекта должно быть числовым, вектор-столбцом целых чисел. Каждый символ, который формирует входной сигнал и выходные кодовые комбинации, является целым числом в области значений [0, 2M–1]. Эти целые числа соответствуют элементу конечного Поля Галуа gf(2M), где M является степенью примитивного полинома, который вы задаете с PrimitivePolynomialSource и PrimitivePolynomial свойства.

Когда вы устанавливаете это свойство на true, входное значение должно быть числовым, вектор-столбцом битов. Закодированным результатом вывода данных является вектор-столбец битов.

CodewordLength

Длина кодовой комбинации

Задайте длину кодовой комбинации кода RS как положительное значение целочисленного скаляра с двойной точностью. Значением по умолчанию является 7.

Для кода RS во всю длину значение этого свойства должно быть 2M–1, где M является целым числом в области значений [3, 16].

MessageLength

Передайте длину

Задайте длину сообщения как положительное значение целочисленного скаляра с двойной точностью. Значением по умолчанию является 3.

ShortMessageLengthSource

Источник длины короткого сообщения

Задайте источник сокращенного сообщения как Auto или Property. Значением по умолчанию является Auto.

  • Когда вы устанавливаете это свойство на Auto, код RS задан CodewordLength, MessageLength, GeneratorPolynomial, и PrimitivePolynomial свойства.

  • Когда вы устанавливаете это свойство на Property, необходимо задать ShortMessageLength свойство, которое будет использоваться с другими свойствами задать код RS.

ShortMessageLength

Сокращенная длина сообщения

Задайте длину сокращенного сообщения как положительный целочисленный скаляр с двойной точностью, значение которого должно быть меньше чем или равно MessageLength. Значением по умолчанию является 3.

Когда ShortMessageLength <MessageLength, код RS сокращен.

GeneratorPolynomialSource

Источник полинома генератора

Задайте источник полинома генератора как Auto или Property. Значением по умолчанию является Auto.

  • Когда вы устанавливаете это свойство на Auto, объект выбирает полином генератора автоматически. Объект вычисляет полином генератора на основе значения PrimitivePolynomial свойство.

  • Когда вы устанавливаете это свойство на Property, необходимо задать полином генератора использование GeneratorPolynomial свойство.

GeneratorPolynomial

Полином генератора

Задайте полином генератора для кода RS как целочисленный вектор-строка с двойной точностью или как вектор-строка Галуа. Записи вектора-строки Поля Галуа должны быть в области значений [0, 2M–1] и представлять полином генератора в порядке убывания степеней. Каждый коэффициент является элементом Поля Галуа gf(2M), представленный в целочисленном формате. Длиной полинома генератора должен быть CodewordLengthMessageLength + 1. Значением по умолчанию является результат rsgenpoly(7,3, [], [], 'дважды'), который соответствует [1 3 1 2 3].

Это свойство применяется, когда вы устанавливаете GeneratorPolynomialSource к Property.

CheckGeneratorPolynomial

Включите проверку полинома генератора

Установите это свойство на true выполнять проверку полинома генератора. Значением по умолчанию является true.

Эта проверка проверяет это XCodewordLength + 1 является делимым полиномом генератора, заданным в GeneratorPolynomial свойство. Для кодов знатными полиномами генератора, отключая проверку ускоряет обработку. Как лучшая практика, выполните проверку, по крайней мере, однажды устанавливающую это свойство на false.

Это свойство применяется когда GeneratorPolynomialSource установлен в Property.

PrimitivePolynomialSource

Источник примитивного полинома

Задайте источник примитивного полинома как Auto или Property. Значением по умолчанию является Auto.

  • Когда вы устанавливаете это свойство на Auto, объект использует примитивный полином степени M = ceil (Fixed-Point Designer) (log2 (CodewordLength+1)).

  • Когда вы устанавливаете это свойство на Property, необходимо задать полином с помощью PrimitivePolynomial свойство.

PrimitivePolynomial

Примитивный полином

Задайте примитивный полином, который задает конечное поле gf(2M) соответствие целым числам, которые формируют сообщения и кодовые комбинации. Задайте это свойство как вектор строки двоичных знаков с двойной точностью, который представляет примитивный полином gf(2) из степени M в порядке убывания степеней.

Если CodewordLength меньше 2M–1, объект использует сокращенный код RS. Значением по умолчанию является результат fliplr(de2bi(primpoly(3))), который является [1 0 1 1] или полиномиальный x 3+x+1.

Это свойство применяется, когда вы устанавливаете PrimitivePolynomialSource к Property.

PuncturePatternSource

Источник шаблона прокола

Задайте источник шаблона прокола как None или Property. Значением по умолчанию является None.

  • Когда вы устанавливаете это свойство на None, объект не применяет прокалывание к коду.

  • Когда вы устанавливаете это свойство на Property, объект прокалывает код на основе вектора шаблона прокола, заданного в PuncturePattern свойство.

PuncturePattern

Проколите вектор шаблона

Укажите, что шаблон раньше прокалывал закодированные данные как вектор столбца двоичных данных с двойной точностью с длиной (CodewordLengthMessageLength). Значением по умолчанию является [ones(2,1); zeros(2,1)]. Нули в векторе шаблона прокола указывают на положение символов четности, которые проколоты или исключены из каждой кодовой комбинации.

Это свойство применяется, когда вы устанавливаете PuncturePatternSource свойство к Property.

OutputDataType

Тип данных выхода

Задайте тип выходных данных как Same as input'double', или logical. Значением по умолчанию является Same as input.

Это свойство применяется, когда вы устанавливаете BitInput свойство к true.

Методы

шагЗакодируйте данные с помощью энкодера Тростника-Solomon
Характерный для всех системных объектов
release

Позвольте изменения значения свойства Системного объекта

Примеры

свернуть все

Передайте закодированный RS, 8 DPSK модулировали поток символа через канал AWGN. Затем демодулируйте, декодируйте, и ошибки количества.

    enc = comm.RSEncoder;
    mod = comm.DPSKModulator('BitInput',false);
    chan = comm.AWGNChannel(...
                'NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
    demod = comm.DPSKDemodulator('BitOutput',false);
    hDdecec = comm.RSDecoder;
    errorRate = comm.ErrorRate('ComputationDelay',3);

    for counter = 1:20
      data = randi([0 7], 30, 1);
      encodedData = step(enc, data);
      modSignal = step(mod, encodedData);
      receivedSignal = step(chan, modSignal);
      demodSignal = step(demod, receivedSignal);
      receivedSymbols = step(hDdecec, demodSignal);
      errorStats = step(errorRate, data, receivedSymbols);            
    end      
      
  fprintf('Error rate = %f\nNumber of errors = %d\n', ...
      errorStats(1), errorStats(2))
Error rate = 0.115578
Number of errors = 69

Передайте закодированные данные Тростника-Solomon с помощью QPSK по каналу AWGN. Демодулируйте и декодируйте полученный сигнал и соберите ошибочные статистические данные. Вычислите теоретическую частоту ошибок по битам (BER) для закодированных и незакодированных данных. Постройте результаты BER сравнить эффективность.

Задайте параметры в качестве примера.

rng(1993);     % Seed random number generator for repeatable results
M = 4;         % Modulation order
bps = log2(M); % Bits per symbol
N = 7;         % RS codeword length
K = 5;         % RS message length

Создайте модулятор, демодулятор, канал AWGN и объекты коэффициента ошибок.

pskModulator = comm.PSKModulator('ModulationOrder',M,'BitInput',true);
pskDemodulator = comm.PSKDemodulator('ModulationOrder',M,'BitOutput',true);
awgnChannel = comm.AWGNChannel('BitsPerSymbol',bps);
errorRate = comm.ErrorRate;

Создайте (7,5) энкодер Тростника-Solomon и пара декодера, которая принимает битные входные параметры.

rsEncoder = comm.RSEncoder('BitInput',true,'CodewordLength',N,'MessageLength',K);
rsDecoder = comm.RSDecoder('BitInput',true,'CodewordLength',N,'MessageLength',K);

Установите область значений Eb/N0 значения и счет на усиление кодирования RS. Инициализируйте ошибочную матрицу статистики.

ebnoVec = (3:0.5:8)';
ebnoVecCodingGain = ebnoVec + 10*log10(K/N); % Account for RS coding gain
errorStats = zeros(length(ebnoVec),3);

Оцените частоту ошибок по битам для каждого Eb/N0 значение. Запуски симуляции или до 100 ошибок или до 107 с битами сталкиваются. Основная обработка цикла симуляции включает кодирование, модуляцию, демодуляцию и декодирование.

for i = 1:length(ebnoVec)
    awgnChannel.EbNo = ebnoVecCodingGain(i);
    reset(errorRate)
    while errorStats(i,2) < 100 && errorStats(i,3) < 1e7
        data = randi([0 1],1500,1);                % Generate binary data
        encData = rsEncoder(data);                 % RS encode
        modData = pskModulator(encData);           % Modulate
        rxSig = awgnChannel(modData);              % Pass signal through AWGN
        rxData = pskDemodulator(rxSig);            % Demodulate
        decData = rsDecoder(rxData);               % RS decode
        errorStats(i,:) = errorRate(data,decData); % Collect error statistics
    end
end

Соответствуйте кривой к данным о BER с помощью berfit. Сгенерируйте оценку эффективности QPSK с и не кодируя использование bercoding и berawgn функции.

berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1));
berwCoding = bercoding(ebnoVec,'RS','hard',N,K,'psk',M,'nondiff');
berNoCoding = berawgn(ebnoVec,'psk',M,'nondiff');

Отобразите закодированные данные о BER RS на графике, припадок кривой данных о BER, теоретической эффективности с кодированием RS и теоретической эффективности без кодирования RS. (7,5) код RS улучшается Eb/N0 требуемый достигнуть a 10-2 частота ошибок по битам приблизительно на 1,2 дБ.

semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ...
ebnoVecCodingGain,berCurveFit,'c-',ebnoVecCodingGain,berwCoding,'r',ebnoVec,berNoCoding)
ylabel('BER')
xlabel('Eb/No (dB)')
legend('RS coded BER','Curve Fit','Theory with coding','Theory no coding')
grid

Figure contains an axes. The axes contains 4 objects of type line. These objects represent RS coded BER, Curve Fit, Theory with coding, Theory no coding.

Передайте закодированный RS сокращенный, 256-QAM-modulated поток символа через канал AWGN. Затем демодулируйте, декодируйте, и ошибки количества.

Установите параметры для кода Тростника-Solomon, где N длина кодовой комбинации, K номинальная длина сообщения и S сокращенная длина сообщения. Установите порядок модуляции, M, и количество систем координат, L.

N = 255;
K = 239;
S = 188;
M = 256;
L = 50;

Создайте Системный объект канала AWGN и Системный объект коэффициента ошибок.

awgnChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'EbNo',15,'BitsPerSymbol',log2(M));
errorRate = comm.ErrorRate('ComputationDelay',3);

Создайте полином генератора Тростника-Solomon из стандарта DVB-T.

gp = rsgenpoly(N,K,[],0);

Создайте пару энкодера и декодера Тростника-Solomon использование сокращенной длины сообщения, S, и полином генератора DVB-T, gp.

enc = comm.RSEncoder(N,K,gp,S);
dec = comm.RSDecoder(N,K,gp,S);

Сгенерируйте случайные системы координат символа, длина которых равняется одному блоку сообщения. Закодируйте, модулируйте, примените AWGN, демодулируйте, декодируйте и соберите статистические данные.

for counter = 1:L
    data = randi([0 1],S,log2(M));
    encodedData = step(enc,bi2de(data));
    modSignal = qammod(encodedData,M,'UnitAveragePower',true);
    rxSignal = awgnChan(modSignal);
    demodSignal = qamdemod(rxSignal,M,'UnitAveragePower',true);
    rxBits = dec(demodSignal);
    dataOut = de2bi(rxBits);
    errorStats = errorRate(data(:),dataOut(:));
end

Отобразите коэффициент ошибок и количество ошибок.

fprintf('Error rate = %5.2e\nNumber of errors = %d\n', ...
    errorStats(1), errorStats(2))
Error rate = 2.01e-02
Number of errors = 1509

В этом примере показано, как сконфигурировать comm.RSEncoder и comm.RSDecoder Системные объекты, чтобы выполнить блочное кодирование Тростника-Solomon (RS) со стираниями при симуляции системы связи. Декодеры RS могут откорректировать и ошибки и стирания. Приемник, который идентифицирует самые ненадежные символы в данной кодовой комбинации, может сгенерировать стирания. Когда приемник стирает символ, он заменяет тот символ на нуль. Приемник затем передает флаг декодеру, указывая, что символ является стиранием, не допустимым кодовым знаком. Кроме того, энкодер может сгенерировать проколы, для которых определенные символы четности всегда удаляются из ее выхода. Декодер, который знает шаблон прокола, вставляет нули в положения прокола и обрабатывает те символы как стирания. Декодер обрабатывает сгенерированные энкодером проколы и сгенерированные приемником стирания тот же самый путь, когда это декодирует символ. Прокалывание также обладает дополнительным преимуществом создания более гибкого уровня кода, за счет некоторой возможности исправления ошибок. Сокращенные коды достигают той же гибкости уровня кода, не ухудшая эффективность исправления ошибок, учитывая ту же входную энергию демодулятора на бит к шумовой степени спектральное отношение плотности (Eb/N0). Обратите внимание на то, что прокалывание является удалением символов четности от кодовой комбинации, и сокращение является удалением символов сообщения от кодовой комбинации.

Этот пример показывает симуляцию системы связи, состоящей из случайного источника, энкодера RS, 64-QAM модулятора, канала AWGN, 64-QAM демодулятора и декодера RS. Это включает анализ кодирования RS со стираниями путем сравнения эффективности частоты ошибок по битам (BER) канала по сравнению с закодированной эффективностью BER. Этот пример получает BER Канала путем сравнения входных параметров для модулятора QAM к выходным параметрам от демодулятора QAM и получает Закодированный BER путем сравнения входных параметров для энкодера RS к выходным параметрам от декодера RS.

Инициализация

helperRSCodingConfig.m функция помощника инициализирует параметры симуляции и конфигурирует comm.AWGNChannel и comm.ErrorRate Системные объекты раньше симулировали систему связи. Незакодированное отношение Eb/N0 является набором EbNoUncoded = 15 дБ. Критерии, чтобы остановить остановку симуляции заданы, чтобы остановить симуляцию, если 500 ошибок происходят или максимум 5e6, биты передаются.

helperRSCodingConfig;

Сконфигурируйте энкодер/Декодер RS

Этот пример использует (63,53) код RS, действующий с 64-QAM схемой модуляции. Этот код может откорректировать (63-53)/2 = 5 ошибок, или это может альтернативно откорректировать (63-53) = 10 стираний. Для каждой кодовой комбинации при выходе 64-QAM демодулятора приемник определяет шесть наименее надежных символов с помощью helperRSCodingGetErasures.m функции помощника. Индексы, которые указывают на местоположение этих ненадежных символов, передаются как вход декодеру RS. Декодер RS обрабатывает эти символы как стирания, приводящие к возможности исправления ошибок (10-6)/2 = 2 ошибки на кодовую комбинацию.

Создайте comm.RSEncoder Системный объект и набор BitInput свойство ко лжи, чтобы указать, что вводы и выводы энкодера являются целочисленными символами.

N = 63;  % Codeword length
K = 53;  % Message length
rsEncoder = comm.RSEncoder(N,K,'BitInput',false);
numErasures = 6;

Создайте comm.RSDecoder Системный объект, совпадающий с настройкой comm.RSEncoder объект.

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);

Установите ErasuresInputPort свойство к истине, чтобы задать стирания как вход к объекту декодера.

rsDecoder.ErasuresInputPort = true;

Установите NumCorrectedErrorsOutputPort свойство к истине так, чтобы декодер вывел количество откорректированных ошибок. Не отрицательная величина в выводе ошибок обозначает количество откорректированных ошибок во входной кодовой комбинации. Значение –1 в выводе ошибок указывает на ошибку декодирования. Ошибка декодирования происходит, когда входная кодовая комбинация имеет больше ошибок, чем поддержка исправления ошибок кода RS.

rsDecoder.NumCorrectedErrorsOutputPort = true;

Запустите потоковый цикл обработки

Симулируйте систему связи для незакодированного отношения Eb/N0 15 дБ. Незакодированный Eb/N0 является отношением, которое было бы измерено во входе канала, если бы не было никакого кодирования в системе.

Сигнал, входящий в канал AWGN, является кодируемым сообщением, таким образом, необходимо преобразовать незакодированные значения Eb/N0 так, чтобы они соответствовали энергетическому отношению в энкодере выход. Это отношение является закодированным отношением Eb/N0. Если вы, символы входа K к энкодеру и получают N символы выхода, то энергетическое отношение дано уровнем K/N. Установите EbNo свойство объекта канала AWGN к вычисленному закодировало значение Eb/N0.

EbNoCoded = EbNoUncoded + 10*log10(K/N);
channel.EbNo = EbNoCoded;

Цикл до симуляции достигает целевого количества ошибок или максимального количества передач.

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

Символы данных передают одно слово сообщения за один раз. Каждое слово сообщения имеет символы K в области значений [на 0 Н].

    data = randi([0 N],K,1);

Закодируйте слово сообщения. Закодированное слово, encData, (N-numPunc) символы долго.

    encData = rsEncoder(data);

Модулируйте закодированные данные и добавьте шум. затем демодулируйте канал выход.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте helperRSCodingGetErasures.m функцию помощника, чтобы найти 6 наименее надежных символов и сгенерировать вектор стираний. Длина вектора стираний должна быть равна количеству символов в демодулируемой кодовой комбинации. Тот в i-ом элементе вектора стирает i-ый символ в кодовой комбинации. Нули в векторе не указывают ни на какие стирания.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

Декодируйте данные. Накопите количество откорректированных ошибок объект совокупной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и закодированного BERs, преобразуйте целые числа вдребезги.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

Объекты измерения коэффициента ошибок, chanBERCalc и codedBERCalc, выведите векторы 3 на 1, содержащие обновления измерения BER, количество ошибок и общее количество битных передач. Отобразите BER канала, закодированный BER и общее количество ошибок, откорректированных декодером RS.

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0017
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 882

Можно добавить цикл for вокруг цикла обработки выше, чтобы запустить симуляции для набора значений Eb/N0. Симуляции были запущены оффлайн для незакодированных значений Eb/N0 в 4:15 дБ, целевое количество ошибок, равных 5 000, и максимальное количество передач, равных 50e6. Результаты симуляции показывают. BER канала хуже, чем теоретический 64-QAM BER, потому что Eb/N0 уменьшается уровнем кода.

Сводные данные

Этот пример использовал несколько Системных объектов, чтобы симулировать 64-QAM систему связи по каналу AWGN с блочным кодированием RS. Это показало, как сконфигурировать декодер RS, чтобы декодировать символы со стираниями. Производительность системы была измерена с помощью канала и закодированных кривых BER, полученных с помощью объектов системы измерения коэффициента ошибок.

Помощник функционирует используемый в этом примере:

В этом примере показано, как сконфигурировать comm.RSEncoder и comm.RSDecoder Системные объекты, чтобы выполнить блочное кодирование Тростника-Solomon (RS) со стираниями и кодами прокола при симуляции системы связи. Энкодер может сгенерировать проколы, чтобы удалить определенные символы четности из ее выхода. учитывая шаблон прокола, декодер вставляет нули в положения прокола и обрабатывает те символы как стирания. Декодер обрабатывает сгенерированные энкодером проколы и сгенерированные приемником стирания точно таким же образом, когда он декодирует. Прокалывание обладает дополнительным преимуществом создания более гибкого уровня кода, за счет некоторой возможности исправления ошибок.

Этот пример показывает симуляцию системы связи, состоящей из случайного источника, энкодера RS, 64-QAM модулятора, канала AWGN, 64-QAM демодулятора и декодера RS. Это включает анализ кодирования RS со стираниями и прокалывания путем сравнения эффективности частоты ошибок по битам (BER) канала по сравнению с закодированной эффективностью BER. Этот пример получает BER Канала путем сравнения входных параметров для модулятора QAM к выходным параметрам от демодулятора QAM. Этот пример получает Закодированный BER путем сравнения входных параметров для энкодера RS к выходным параметрам от декодера RS.

Инициализация

helperRSCodingConfig.m функция помощника инициализирует параметры симуляции и конфигурирует comm.AWGNChannel и comm.ErrorRate Системные объекты раньше симулировали систему связи. Незакодированный Eb/N0 отношение, EbNoUncoded установлен в 15 дБ. Критерии, чтобы остановить остановку симуляции заданы, чтобы остановить симуляцию, если 500 ошибок происходят или максимум 5×106 биты передаются.

helperRSCodingConfig;

Сконфигурируйте энкодер/Декодер RS

Этот пример использует тот же (63,53) код RS, действующий с 64-QAM схемой модуляции, которая сконфигурирована для прокалывания кода и стираний. RS algortihm декодирует сгенерированные приемником стирания и корректирует сгенерированные энкодером проколы. Для каждой кодовой комбинации сумма проколов и стираний не может превысить дважды поддержку с коррекцией ошибок кода.

Создайте comm.RSEncoder Системный объект и набор BitInput свойство ко лжи, чтобы указать, что вводы и выводы энкодера являются целочисленными символами.

N = 63;  % Codeword length
K = 53;  % Message length
rsEncoder = comm.RSEncoder(N,K,'BitInput',false);
numErasures = 6;

Создайте comm.RSDecoder Системный объект, совпадающий с настройкой comm.RSEncoder объект. Затем установите ErasuresInputPort свойство к истине, чтобы задать стирания как вход к объекту декодера.

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);
rsDecoder.ErasuresInputPort = true;

Чтобы включить прокалывание кода, установите PuncturePatternSource свойство к 'Property' и набор PuncturePattern свойство к желаемому вектору шаблона прокола. Тот же вектор прокола должен быть задан и в энкодере и в декодере. Этот пример прокалывает два символа от каждой кодовой комбинации. Значения 1 в проколе вектор шаблона указывают на непроколотые символы и значения 0 укажите на проколотые символы.

numPuncs = 2;
rsEnc.PuncturePatternSource = 'Property';
rsEnc.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];

rsDec.PuncturePatternSource = 'Property';
rsDec.PuncturePattern = rsEnc.PuncturePattern;

Запустите потоковый цикл обработки

Симулируйте систему связи для незакодированного Eb/N0 отношение 15 дБ. Незакодированный Eb/N0 отношение, которое было бы измерено во входе канала, если бы не было никакого кодирования в системе.

Сигнал, входящий в канал AWGN, является кодируемым сообщением, таким образом, необходимо преобразовать незакодированный Eb/N0 значения так, чтобы они соответствовали энергетическому отношению в энкодере выход. Это отношение является закодированным Eb/N0 отношение. Если вы вход K символы к энкодеру и получают N выведите символы, затем энергетическое отношение дано KN уровень. Поскольку длина кодовых комбинаций, сгенерированных энкодером RS, уменьшается количеством проколов, заданных в векторе шаблона прокола, значении закодированного Eb/N0 отношение должно быть настроено с учетом этих проколов. В этом примере количество выходных символов (N - numPuncs) и незакодированный Eb/N0 отношение относится к закодированному Eb/N0 как показано ниже. Установите EbNo свойство AWGN образовывает канал объект к закодированному вычисленному Eb/N0 значение.

EbNoCoded = EbNoUncoded + 10*log10(K/(N - numPuncs));
channel.EbNo = EbNoCoded;

Цикл до симуляции достигает целевого количества ошибок или максимального количества передач.

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

Символы данных передают одно слово сообщения за один раз. Каждое слово сообщения имеет символы K в [0 NОбласть значений.

    data = randi([0 N],K,1);

Закодируйте слово сообщения. Закодированное слово, encData, (NnumPunc) символы долго.

    encData = rsEncoder(data);

Модулируйте закодированные данные и добавьте шум. затем демодулируйте канал выход.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте helperRSCodingGetErasures.m функцию помощника, чтобы найти 6 наименее надежных символов и сгенерировать вектор стираний. Длина вектора стираний должна быть равна количеству символов в демодулируемой кодовой комбинации. Тот в i-ом элементе вектора стирает i-ый символ в кодовой комбинации. Нули в векторе не указывают ни на какие стирания.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

Декодируйте данные. Накопите количество откорректированных ошибок объект совокупной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и закодированного BERs, преобразуйте целые числа вдребезги.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

Объекты измерения коэффициента ошибок, chanBERCalc и codedBERCalc, выведите векторы 3 на 1, содержащие обновления измерения BER, количество ошибок и общее количество битных передач. Отобразите BER канала, закодированный BER и общее количество ошибок, откорректированных декодером RS.

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0015
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 632

Можно добавить цикл for вокруг цикла обработки выше, чтобы запустить симуляции для ряда Eb/N0 значения. Симуляции были запущены оффлайн для незакодированного Eb/N0 значения в 4:15 дБ, предназначайтесь для количества ошибок, равных 5 000, и максимальное количество передач, равных 50×106. Этот рисунок сравнивает результаты, достигнутые для

  • Кодирование RS только со стираниями

  • Кодирование RS со стираниями и прокалывание

  • Теоретический BER для 64-QAM

Закодированный Eb/N0 немного выше, чем канал Eb/N0, таким образом, BER канала немного лучше в проколотом случае. С другой стороны, закодированный BER хуже в проколотом случае, потому что два прокола уменьшают поддержку с коррекцией ошибок кода одним, оставляя способным откорректировать только (10 – 6 – 2) / 2 = 1 ошибка на кодовую комбинацию.

Сводные данные

Этот пример использовал функции и Системные объекты, чтобы симулировать 64-QAM систему связи по каналу AWGN с блочным кодированием RS. Это показало, как сконфигурировать Системные объекты энкодера/декодера RS, чтобы получить проколотые коды. Производительность системы была измерена с помощью канала и закодированных кривых BER, полученных с помощью объектов системы измерения коэффициента ошибок.

Помощник функционирует используемый в этом примере:

В этом примере показано, как сконфигурировать comm.RSEncoder и comm.RSDecoder Системные объекты, чтобы выполнить блочное кодирование Тростника-Solomon (RS), чтобы сократиться (63,53) код к (28,18) код. Симуляция системы связи, состоящей из случайного источника, энкодера RS, 64-QAM модулятора, канала AWGN, 64-QAM демодулятора и декодера RS, представлена.

Эффекты кодирования RS со стираниями, прокалывания и сокращения анализируются путем сравнения эффективности частоты ошибок по битам (BER) канала по сравнению с закодированной эффективностью BER. Этот пример получает BER Канала путем сравнения входных параметров для модулятора QAM к выходным параметрам от демодулятора QAM и получает Закодированный BER путем сравнения входных параметров для энкодера RS к выходным параметрам от декодера RS. Прокалывание является удалением символов четности от кодовой комбинации, и сокращение является удалением символов сообщения от кодовой комбинации. Прокалывание обладает преимуществом создания более гибкого уровня кода, за счет некоторой возможности исправления ошибок. Сокращенные коды достигают той же гибкости уровня кода, не ухудшая эффективность исправления ошибок для того же входа демодулятора Eb/N0.

Инициализация

helperRSCodingConfig.m функция помощника инициализирует параметры симуляции и конфигурирует comm.AWGNChannel и comm.ErrorRate Системные объекты раньше симулировали систему связи. НезакодированныйEb/N0 отношение является набором EbNoUncoded = 15 дБ. Критерии, чтобы остановить остановку симуляции заданы, чтобы остановить симуляцию, если 500 ошибок происходят или максимум 5×106 биты передаются.

helperRSCodingConfig;

Сконфигурируйте энкодер/Декодер RS

Этот пример использует (63,53) код RS, действующий с 64-QAM схемой модуляции. Операция кодирования RS включает стирания, прокалывание и сокращение кода. В этом примере показано, как сократиться (63,53) код к (28,18) код.

Чтобы сократиться (63,53) код 10 символами к (53,43) код, можно просто войти 53 и 43 для CodewordLength и MessageLength свойства, соответственно (поскольку 2log2(53+1)-1=63). Однако, чтобы сократить его 35 символами к (28,18) код, необходимо явным образом указать, что символы принадлежат GF Поля Галуа (26). В противном случае блоки RS примут, что код сокращен от (31,21) код (поскольку 2log2(28+1)-1=31).

Создайте пару comm.RSEncoder и comm.RSDecoder Системные объекты так, чтобы они выполнили блочное кодирование с (28,18) код, сокращенный от (63,53) код, который сконфигурирован к целочисленным символам ввода и вывода. Сконфигурируйте декодер, чтобы принять вход стирания и два прокола. Для каждой кодовой комбинации при выходе 64-QAM демодулятора приемник определяет шесть наименее надежных символов с помощью helperRSCodingGetErasures.m функции помощника. Индексы, которые указывают на местоположение этих ненадежных символов, передаются как вход декодеру RS.

N = 63;  % Codeword length
K = 53;  % Message length
S = 18;  % Shortenened message length
numErasures = 6;
numPuncs = 2; 
rsEncoder = comm.RSEncoder(N, K, 'BitInput', false);
rsDecoder = comm.RSDecoder(N, K, 'BitInput', false, 'ErasuresInputPort', true);
rsEncoder.PuncturePatternSource = 'Property';
rsEncoder.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];
rsDecoder.PuncturePatternSource = 'Property';
rsDecoder.PuncturePattern = rsEncoder.PuncturePattern;

Установите сокращенную длину кодовой комбинации и значения длины сообщения.

rsEncoder.ShortMessageLength = S;
rsDecoder.ShortMessageLength = S;

Задайте поле GF(26) в Системных объектах энкодера/декодера RS, путем установки PrimitivePolynomialSource свойство к 'Property' и PrimitivePolynomial свойство до 6-й степени примитивный полином.

primPolyDegree = 6;
rsEncoder.PrimitivePolynomialSource = 'Property';
rsEncoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

rsDecoder.PrimitivePolynomialSource = 'Property';
rsDecoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

Запустите потоковый цикл обработки

Симулируйте систему связи для незакодированного Eb/N0 отношение 15 дБ. Незакодированный Eb/N0 отношение, которое было бы измерено во входе канала, если бы не было никакого кодирования в системе.

Сигнал, входящий в канал AWGN, является кодируемым сообщением, таким образом, необходимо преобразовать незакодированный Eb/N0 значения так, чтобы они соответствовали энергетическому отношению в энкодере выход. Это отношение является закодированным Eb/N0 отношение. Если вы вход K символы к энкодеру и получают N выведите символы, затем энергетическое отношение дано KN уровень. он значение закодированного Eb/N0 отношение должно быть настроено с учетом сокращенных и проколотых кодовых комбинаций. Количество выходных символов (N - numPuncs S) и незакодированный Eb/N0 отношение относится к закодированному Eb/N0 как показано ниже. Установите EbNo свойство AWGN образовывает канал объект к закодированному вычисленному Eb/N0 значение.

EbNoCoded = EbNoUncoded + 10*log10(S/(N - numPuncs - K + S));
channel.EbNo = EbNoCoded;

Цикл до симуляции достигает целевого количества ошибок или максимального количества передач.

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

Символы данных передают одно слово сообщения за один раз. Каждое слово сообщения имеет K-S символы в [0 (2^primPolyDegree)-1] область значений.

    data = randi([0 2^primPolyDegree-1],S,1);

Закодируйте сокращенное слово сообщения. Закодированное слово encData (N- numPuncsS) символы долго.

    encData = rsEncoder(data);

Модулируйте закодированные данные и добавьте шум. затем демодулируйте канал выход.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте helperRSCodingGetErasures.m функцию помощника, чтобы найти 6 наименее надежных символов и сгенерировать вектор стираний. Длина вектора стираний должна быть равна количеству символов в демодулируемой кодовой комбинации. Тот в i-ом элементе вектора стирает i-ый символ в кодовой комбинации. Нули в векторе не указывают ни на какие стирания.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);    

Декодируйте данные. Накопите количество откорректированных ошибок объект совокупной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и закодированного BERs, преобразуйте целые числа вдребезги.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1), ...
        reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1), ...
        reshape(de2bi(estData,log2(M))',[],1));
end

Объекты измерения коэффициента ошибок, chanBERCalc и codedBERCalc, выведите векторы 3 на 1, содержащие обновления измерения BER, количество ошибок и общее количество битных передач. Отобразите BER канала, закодированный BER и общее количество ошибок, откорректированных декодером RS.

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0036
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 9.6599e-05
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 1436

Можно добавить цикл for вокруг цикла обработки выше, чтобы запустить симуляции для ряда Eb/N0 значения. Симуляции были запущены оффлайн для незакодированного Eb/N0 значения в 4:15 дБ, предназначайтесь для количества ошибок, равных 5 000, и максимальное количество передач, равных 50×106. Этот рисунок сравнивает результаты, достигнутые для

  • Кодирование RS только со стираниями

  • Кодирование RS со стираниями и прокалывание

  • Кодирование RS со стираниями, прокалывание и shotening

  • Теоретический BER для 64-QAM

BER канала с сокращением, потому что закодированный Eb/N0 ddegraded. Это ухудшилось закодированный Eb/N0 происходит, потому что уровень кода сокращенного кода ниже, чем тот из несокращенного кода. Сокращение также приводит к ухудшенному закодированному BER, больше всего noticably в ниже Eb/N0 значения.

Сводные данные

Этот пример использовал несколько Системных объектов, чтобы симулировать 64-QAM систему связи по каналу AWGN с сокращенным блочным кодом RS. Это показало, как сконфигурировать декодер RS, чтобы сократиться (63,53) код к (28,18) код. Производительность системы была измерена с помощью канала и закодированных кривых BER, полученных с помощью объектов системы измерения коэффициента ошибок.

Помощник функционирует используемый в этом примере:

Алгоритмы

Этот объект реализует алгоритм, входные параметры и выходные параметры, описанные в Алгоритмах для BCH и RS Декодирование Только для ошибок.

Ссылки

[1] Кларк, Джордж К. и J. Затвор Каин. Кодирование с коррекцией ошибок для цифровой связи. Приложения коммуникационной теории. Нью-Йорк: нажатие пленума, 1981.

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

Представленный в R2012a