Почему мой BER стал постоянным, мой код неверен?

Я работаю над моделированием BER между двумя пользователями в CDMA с помощью сверточных кодов и схемы модуляции QAM-16. Из графика, который я прикрепил, BER пользователя 1 и пользователя 2 одинаковы и постоянны. Кажется, что SNR не влияет на передачу. В любом случае я могу улучшить график? Вот мой код:

M = 16;                 % Modulation order
k = log2(M);            % Bits per symbol
EbNoVec = (0:20)';      % Eb/No values (dB)
numSymPerFrame = 1;   % Number of QAM symbols per frame
users=2;            % Number of Users
trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;
%------------------Generation of Walsh code--------------------------------
noOfSubCarrier =20;                               %Number of  Data Sub-Carriers
walsh=hadamard(noOfSubCarrier);
code1=walsh(10,:);                   
code2=walsh(20,:); 

berEst1 = zeros(size(EbNoVec));
berEst2 = zeros(size(EbNoVec));%Initialize the results vector

% The main processing loop executes the following steps:
% Generate binary data and convert to 64-ary symbols
% QAM modulate the data symbols
% Pass the modulated signal through an AWGN channel
% Demodulate the received signal
% Convert the demoduated symbols into binary data
% Calculate the number of bit errors

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Reset the error and bit counters
    numErrs1 = 0;
    numErrs2 = 0;
    numBits = 0;

    % Generate binary data and convert to symbols
    B=10;
    dataIn1= rand(1,B);
    dataIn2=rand(1,B);
    symbols1= unique(dataIn1);
    symbols2= unique(dataIn2);
    probs1 = histc(dataIn1,symbols1)./numel(dataIn1);
    probs2 = histc(dataIn2,symbols2)./numel(dataIn2);
    [dict1, avglen1] = huffmandict(symbols1, probs1);
    [dict2, avglen2] = huffmandict(symbols2, probs2);
    comp1 = huffmanenco(dataIn1,dict1);
    comp2 = huffmanenco(dataIn2,dict2);
     % Convolutionally encode the data
    dataEnc1 = convenc(comp1,trellis);
    dataEnc2 = convenc(comp2,trellis);

    % QAM modulate
    txSig1 = qammod(dataEnc1,M,0);
    txSig2 = qammod(dataEnc2,M,0);
    %------------------Spreading & IFFT for User1------------------------------
    Tx_data1=txSig1';
    Spread_User1=Tx_data1*code1;    % Spreading 
    Spread1=(Spread_User1)';
    ifftdata_user1=ifft(Spread1);      % Taking the IFFT
    ifftdata1=ifftdata_user1';
    %------------------Spreading & IFFT for User2------------------------------
    Tx_data2=txSig2';
    Spread_User2=Tx_data2*code2;    % Spreading 
    Spread2=(Spread_User2)';
    ifftdata_user2=ifft(Spread2);      % Taking the IFFT
    ifftdata2=ifftdata_user2';
    %----------------------Addition of all signal------------------------------
    TotSignal = Spread1+Spread2;
    % Pass through AWGN channel
    AwTotSignal = awgn(TotSignal,snrdB,'measured');
    %-----------------------Removing the FFT & De-Spreading--------------------
    fft_data_received =fft(AwTotSignal);
    Rec_Data1=(AwTotSignal'*code1');
    Rec_Data2=(AwTotSignal'*code2');
    % Demodulate the noisy signal
    rxSym1 = qamdemod(Rec_Data1,M,0);
    rxSym2 = qamdemod(Rec_Data2,M,0);
    data1=vitdec(rxSym1,trellis,5,'cont','unquant');
    data2=vitdec(rxSym2,trellis,5,'cont','unquant');
    % Convert received symbols to bits
    %dataOut1 = de2bi(data1,k);
    %dataOut2 = de2bi(data2,k);
    % Calculate the number of bit errors
    nErrors1 = biterr(comp1',data1);
    nErrors2 = biterr(comp2',data2);
    % Increment the error and bit counters
    numErrs1 = numErrs1 + nErrors1;
    numErrs2 = numErrs2 + nErrors2;
    numBits= numBits + numSymPerFrame*k;

    % Estimate the BER
    berEst1(n) = numErrs1/numBits;
    berEst2(n) = numErrs2/numBits;
end

график BER

1 ответ

[ПРИМЕЧАНИЕ: на самом деле это должен быть комментарий, но я не могу написать их с моей текущей репутацией SO, и это то, что ОП должен знать]

Прежде всего, признаюсь, я не особо внимательно изучал ваш код, потому что ошибки, которые я вижу на графиках, происходят из-за ошибок, не связанных с CDMA или имеющейся модуляции.

Я бы сказал, что самая замечательная ошибка не в том, что графики постоянны, а в BER, превышающем 1. Это вообще не имеет смысла и указывает на то, что, по крайней мере, что-то не так с вашей формулировкой самого BER.

Более того, если бы BER был фактически 1, а не сверх него, это все равно не имело бы смысла. Примите во внимание, что BER 1 (не говоря уже о 1) означает, что вы не можете правильно восстановить символ каждый раз. По простой статистике вы должны восстановить хотя бы некоторые из них правильно, даже если выбрали их наугад. Это еще один распространенный сценарий ошибки в такого рода приложениях.

Тем не менее, проверьте свою формулировку BER и наметьте некоторые промежуточные значения. Не делайте все за один шаг (например: попробуйте систему без кодов коррекции).

Я надеюсь, что это дает вам удар в правильном направлении.

Другие вопросы по тегам