Матрица проверки четности квазициклического кода LDPC
Создайте матрицу проверки четности квазициклического кода LDPC. Установите размер блока на 3 и прототипная матрица к [0 -1 1 2; 2 1 -1 0].
blockSize = 3; p = [0 -1 1 2; 2 1 -1 0]; pcmatrix = ldpcQuasiCyclicMatrix(blockSize,p)
pcmatrix = 6x12 sparse logical array
(1,1) 1
(5,1) 1
(2,2) 1
(6,2) 1
(3,3) 1
(4,3) 1
(6,4) 1
(4,5) 1
(5,6) 1
(3,7) 1
(1,8) 1
(2,9) 1
(2,10) 1
(4,10) 1
(3,11) 1
(5,11) 1
(1,12) 1
(6,12) 1
Подтвердите, что получившаяся матрица проверки четности является разреженной и логической матрицей.
issparse(pcmatrix) & islogical(pcmatrix)
ans = logical
1
Матрицы проверки четности могут быть большими, и отображение их, когда полная матрица обычно не желательна. Поскольку матрица проверки четности в этом примере только 6 12, отобразите его как полную матрицу.
full(pcmatrix)
ans = 6x12 logical array
1 0 0 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 0 0 1 1 0 0
0 0 1 0 0 0 1 0 0 0 1 0
0 0 1 0 1 0 0 0 0 1 0 0
1 0 0 0 0 1 0 0 0 0 1 0
0 1 0 1 0 0 0 0 0 0 0 1
Инициализируйте параметры для прототипной матрицы и размера блока, чтобы сконфигурировать уровень 3/4 LDPC код, заданный в IEEE 802.11. Создайте матрицу проверки четности при помощи ldpcQuasiCyclicMatrix функция.
P = [16 17 22 24 9 3 14 -1 4 2 7 -1 26 -1 2 -1 21 -1 1 0 -1 -1 -1 -1
25 12 12 3 3 26 6 21 -1 15 22 -1 15 -1 4 -1 -1 16 -1 0 0 -1 -1 -1
25 18 26 16 22 23 9 -1 0 -1 4 -1 4 -1 8 23 11 -1 -1 -1 0 0 -1 -1
9 7 0 1 17 -1 -1 7 3 -1 3 23 -1 16 -1 -1 21 -1 0 -1 -1 0 0 -1
24 5 26 7 1 -1 -1 15 24 15 -1 8 -1 13 -1 13 -1 11 -1 -1 -1 -1 0 0
2 2 19 14 24 1 15 19 -1 21 -1 2 -1 24 -1 3 -1 2 1 -1 -1 -1 -1 0
];
blockSize = 27;
pcmatrix = ldpcQuasiCyclicMatrix(blockSize,P);Создайте объект настройки энкодера LDPC, отобразив его свойства. Сгенерируйте случайные информационные биты при помощи NumInformationBits свойство настройки возражает, чтобы задать количество информационных битов в кодовой комбинации LPDC. Закодируйте информационные биты кодом LDPC, заданным объектом настройки энкодера LDPC.
cfgLDPCEnc = ldpcEncoderConfig(pcmatrix)
cfgLDPCEnc =
ldpcEncoderConfig with properties:
ParityCheckMatrix: [162x648 logical]
Read-only properties:
BlockLength: 648
NumInformationBits: 486
NumParityCheckBits: 162
CodeRate: 0.7500
infoBits = rand(cfgLDPCEnc.NumInformationBits,1) < 0.5; codeword = ldpcEncode(infoBits, cfgLDPCEnc);
Инициализируйте параметры для прототипной матрицы и размера блока, чтобы сконфигурировать уровень 3/4 LDPC код, заданный в IEEE 802.11. Создайте матрицу проверки четности при помощи ldpcQuasiCyclicMatrix функция.
P = [
16 17 22 24 9 3 14 -1 4 2 7 -1 26 -1 2 -1 21 -1 1 0 -1 -1 -1 -1
25 12 12 3 3 26 6 21 -1 15 22 -1 15 -1 4 -1 -1 16 -1 0 0 -1 -1 -1
25 18 26 16 22 23 9 -1 0 -1 4 -1 4 -1 8 23 11 -1 -1 -1 0 0 -1 -1
9 7 0 1 17 -1 -1 7 3 -1 3 23 -1 16 -1 -1 21 -1 0 -1 -1 0 0 -1
24 5 26 7 1 -1 -1 15 24 15 -1 8 -1 13 -1 13 -1 11 -1 -1 -1 -1 0 0
2 2 19 14 24 1 15 19 -1 21 -1 2 -1 24 -1 3 -1 2 1 -1 -1 -1 -1 0
];
blockSize = 27;
pcmatrix = ldpcQuasiCyclicMatrix(blockSize,P);Создайте объекты настройки энкодера и декодера LDPC, отобразив их свойства.
cfgLDPCEnc = ldpcEncoderConfig(pcmatrix)
cfgLDPCEnc =
ldpcEncoderConfig with properties:
ParityCheckMatrix: [162x648 logical]
Read-only properties:
BlockLength: 648
NumInformationBits: 486
NumParityCheckBits: 162
CodeRate: 0.7500
cfgLDPCDec = ldpcDecoderConfig(pcmatrix)
cfgLDPCDec =
ldpcDecoderConfig with properties:
ParityCheckMatrix: [162x648 logical]
Algorithm: 'bp'
Read-only properties:
BlockLength: 648
NumInformationBits: 486
NumParityCheckBits: 162
CodeRate: 0.7500
Передайте LDPC-закодированный, модулируемый QPSK поток битов через канал AWGN. Демодулируйте сигнал, декодируйте полученные кодовые комбинации, и затем считайте битовые ошибки. Используйте вложил for циклы, чтобы обработать несколько настроек SNR и систем координат с и без кодирования прямого исправления ошибок (FEC) LDPC передаваемых данных.
M = 4; maxnumiter = 10; snr = [20 6 3]; numframes = 10; qpskmod = comm.PSKModulator(M,'BitInput',true); qpskmod2 = comm.PSKModulator(M); ber = comm.ErrorRate; ber2 = comm.ErrorRate; for ii = 1:length(snr) qpskdemod = comm.PSKDemodulator(M,'BitOutput',true, ... 'DecisionMethod','Approximate log-likelihood ratio', ... 'Variance',1/10^(snr(ii)/10)); qpskdemod2 = comm.PSKDemodulator(M); for counter = 1:numframes data = randi([0 1],cfgLDPCEnc.NumInformationBits,1,'int8'); % Transmit and receive with LDPC coding encodedData = ldpcEncode(data,cfgLDPCEnc); modSignal = qpskmod(encodedData); receivedSignal = awgn(modSignal,snr(ii)); demodSignal = qpskdemod(receivedSignal); receivedBits = ldpcDecode(demodSignal,cfgLDPCDec,maxnumiter); errStats = ber(data,receivedBits); % Transmit and receive with no LDPC coding noCoding = qpskmod2(data); rxNoCoding = awgn(noCoding,snr(ii)); rxBitsNoCoding = qpskdemod2(rxNoCoding); errStatsNoCoding = ber2(data,int8(rxBitsNoCoding)); end fprintf(['SNR = %2d\n Coded: Error rate = %1.2f, ' ... 'Number of errors = %d\n'], ... snr(ii),errStats(1),errStats(2)) fprintf(['Noncoded: Error rate = %1.2f, ' ... 'Number of errors = %d\n'], ... errStatsNoCoding(1),errStatsNoCoding(2)) end
SNR = 20 Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.00, Number of errors = 0
SNR = 6 Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.02, Number of errors = 196
SNR = 3 Coded: Error rate = 0.02, Number of errors = 353
Noncoded: Error rate = 0.07, Number of errors = 976
blocksize — Размер блокаРазмер блока квазициклического кода LDPC в виде положительной скалярной величины.
Типы данных: double
P — Прототипная матрицаПрототипная матрица в виде матрицы. Количество столбцов в P должен быть больше количества строк в P. Все значения в P должен быть -1, 0, или положительные целые числа меньше, чем вход blocksize. Значение -1 производит blocksize с нулевым знаком- blocksize субматрица. Другие значения указывают что количество столбцов blocksize- blocksize диагональная матрица должна циклически быть смещена направо. Каждая субматрица является или нулевой матрицей или циклически переключенной версией диагональной матрицы.
Типы данных: double
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.