Jump to content

    
Sign in to follow this  
uriy

Посоветуйте помехоустойчивый код

Recommended Posts

On 12/24/2020 at 9:58 AM, uriy said:

Посоветуйте помехоустойчивый код. Имеется блок данных длиной 132 бита, его можно дополнить до 216 бит.

Reed-solomon не подходит ?

https://opencores.org/projects?expanded=Arithmetic%20core%2CECC%20core

А Где в Ижевске работаете ?

Share this post


Link to post
Share on other sites
On 12/24/2020 at 12:58 PM, uriy said:

Посоветуйте помехоустойчивый код. Имеется блок данных длиной 132 бита, его можно дополнить до 216 бит.

для начала определитесь с тем от чего вы хотите защищаться и для какой системы, а потом уже жесткий/мягкий код вам нужен, желаемый ЭВК/характерные точки по битовым ошибкам. ну а дальше кодов разных громадье)

Share this post


Link to post
Share on other sites

Да я никогда не имел дел с помехоустойчивым кодированием. Я передаю данные через радиоканал. Факт обнаружения ошибки для меня бесполезен, нужно уметь восстанавливать как можно больше бит. 

Работаю в частной шараге.

Share this post


Link to post
Share on other sites
30 minutes ago, uriy said:

Да я никогда не имел дел с помехоустойчивым кодированием. Я передаю данные через радиоканал. Факт обнаружения ошибки для меня бесполезен, нужно уметь восстанавливать как можно больше бит. 

Работаю в частной шараге.

В Simulink не стоит по- экспериментировать с помехозащищенным кодированием  ?

https://www.ijltet.org/wp-content/uploads/2014/07/10.pdf

https://uk.mathworks.com/help/comm/ug/transmit-and-receive-shortened-reed-solomon-codes.html

https://fr.mathworks.com/matlabcentral/fileexchange/32127-reed-solomon-coding-_16-psk-using-simulink

N = 63;  % Codeword length
K = 51;  % Message length
S = 39;  % Shortened message length
M = 64;  % Modulation order
numErrors = 200;
numBits = 1e7;
ebnoVec = (8:13)';
[ber0,ber1] = deal(zeros(size(ebnoVec)));
errorRate = comm.ErrorRate;
rsEncoder = comm.RSEncoder(N,K,'BitInput',true);
rsDecoder = comm.RSDecoder(N,K,'BitInput',true);
rate = K/N;
for k = 1:length(ebnoVec)
    
    % Convert the coded Eb/No to an SNR. Initialize the error statistics
    % vector.
    snrdB = ebnoVec(k) + 10*log10(rate) + 10*log10(log2(M));
    errorStats = zeros(3,1);
    
    while errorStats(2) < numErrors && errorStats(3) < numBits
        
        % Generate binary data.
        txData = randi([0 1],K*log2(M),1);
        
        % Encode the data.
        encData = rsEncoder(txData);
        
        % Apply 64-QAM modulation.
        txSig = qammod(encData,M, ...
            'UnitAveragePower',true,'InputType','bit');
        
        % Pass the signal through an AWGN channel.
        rxSig = awgn(txSig,snrdB);
        
        % Demodulated the noisy signal.
        demodSig = qamdemod(rxSig,M, ...
            'UnitAveragePower',true,'OutputType','bit');
        
        % Decode the data.
        rxData = rsDecoder(demodSig);
        
        % Compute the error statistics.
        errorStats = errorRate(txData,rxData);
    end
    
    % Save the BER data, and reset the errorRate counter.
    ber0(k) = errorStats(1);
    reset(errorRate)
end

gp = rsgenpoly(N,K,[],0);
rsEncoder = comm.RSEncoder(N,K,gp,S,'BitInput',true);
rsDecoder = comm.RSDecoder(N,K,gp,S,'BitInput',true);
rate = S/(N-(K-S));

for k = 1:length(ebnoVec)
    
    % Convert the coded Eb/No to an SNR. Initialize the error statistics
    % vector.
    snrdB = ebnoVec(k) + 10*log10(rate) + 10*log10(log2(M));
    errorStats = zeros(3,1);
    
    while errorStats(2) < numErrors && errorStats(3) < numBits
        
        % Generate binary data.
        txData = randi([0 1],S*log2(M),1);
        
        % Encode the data.
        encData = rsEncoder(txData);
        
        % Apply 64-QAM modulation.
        txSig = qammod(encData,M, ...
            'UnitAveragePower',true,'InputType','bit');
        
        % Pass the signal through an AWGN channel.
        rxSig = awgn(txSig,snrdB);
        
        % Demodulated the noisy signal.
        demodSig = qamdemod(rxSig,M, ...
            'UnitAveragePower',true,'OutputType','bit');
        
        % Decode the data.
        rxData = rsDecoder(demodSig);
        
        % Compute the error statistics.
        errorStats = errorRate(txData,rxData);
    end
    
    % Save the BER data, and reset the errorRate counter.
    ber1(k) = errorStats(1);
    reset(errorRate)
end

berapprox = bercoding(ebnoVec,'RS','hard',N,K,'qam',64);

semilogy(ebnoVec,ber0,'o-',ebnoVec,ber1,'c^-',ebnoVec,berapprox,'k--')
legend('RS(63,51)','RS(51,39)','Theory')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
grid

 

psk_16_awgn_rs_simulink_2018.slx

Share this post


Link to post
Share on other sites

Я извиняюсь, но может специалисты-кодировщики подскажут, что может быть закодировано здесь:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=159266&do=findComment&comment=1730325

Тоже думал в Anaconda (Python) поэкспериментировать с кодированием. Да что-то ничего толкового не приходит на ум. Есть числа с малой разницей в битах. То есть, непохоже на избыточное кодирование.  

Share this post


Link to post
Share on other sites
19 hours ago, uriy said:

Я передаю данные через радиоканал. Факт обнаружения ошибки для меня бесполезен, нужно уметь восстанавливать как можно больше бит.

Определитесь мягкое или жесткое у вас решение, есть ли стирания, какова структура ошибок: пакетные или одиночные, какая вычислительная мощность в наличии, какая пропускная способность, требуемый остаточный коэффициент ошибок.

Мягкое даст +2 дБ выигрыша по ЭВК, но плохо держит пакетную ошибку, рид-соломон наоборот.

Если мягкое то как вариант неплохого кода Wimax DuoBinRCS, в варианте 18 байт данных, с кодом 2/3 получите ваши 27байт. В оставшиеся биты добавите CRC. ЭВК по 1е-6 составит порядка 5.5дБ

18 hours ago, gosha said:

N = 63;  % Codeword length
K = 51;  % Message length
S = 39;  % Shortened message length
M = 64;  % Modulation order

 

Не хорошо ему пойдет такой. у ТС 216 бит, для этого кода максимальный блок 63*6=378бит, слишком большое усечение получится. Но тем не менее, получится данных 22 символа, длина блока 36. Сможет исправить 7 символов или от 7 до 42 бит. ЭВК по 1е-6 составит порядка 3.5дБ

 

Share this post


Link to post
Share on other sites
2 hours ago, uriy said:

Факт обнаружения ошибки для меня бесполезен, нужно уметь восстанавливать как можно больше бит.

Когда-то использовал коды Хемминга. Там просто и с обнаружением, и с восстановлением. Посмотрите в интернете, может Вам подойдет.

 

Share this post


Link to post
Share on other sites
16 hours ago, Serhiy_UA said:

Когда-то использовал коды Хемминга. Там просто и с обнаружением, и с восстановлением. Посмотрите в интернете, может Вам подойдет.

проиграет бчх и рс коду. на 216 битах там 8 контрольных бит, восстанавливает 3 бита на блок. но намного проще, да)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this