2016-03-22 8 views
-1

Ich arbeite, um die BER zwischen 2 Benutzern in CDMA mit Faltungscodes und Modulationsschema von QAM-16 zu simulieren. Aus der Grafik, die ich angehängt habe, sind die BER von Benutzer 1 und Benutzer 2 gleich und konstant. Es scheint, dass das SNR die Übertragung nicht beeinflusst. Kann ich das Diagramm trotzdem verbessern? Hier ist mein Code:Warum wird meine BER konstant, ist mein Code falsch?

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 

graph of BER

Antwort

1

[Hinweis: Dies soll eigentlich ein Kommentar sein, aber ich kann sie mit meiner aktuellen SO Ruf nicht schreiben und das ist etwas, das OP wissen sollte]

Zunächst gestehe ich, dass ich Ihren Code nicht besonders intensiv betrachtet habe, da die Fehler, die ich in den Diagrammen sehe, von Fehlern herrühren, die nicht mit CDMA oder der vorliegenden Modulation zusammenhängen. Ich würde sagen, der bemerkenswerteste Fehler ist nicht, dass die Graphen konstant sind, sondern dass die BER über 1 ist. Das macht überhaupt keinen Sinn und zeigt an, dass zumindest etwas mit Ihrer Formulierung der BER falsch ist.

Darüber hinaus, wenn die BER tatsächlich 1 war und nicht über sie wäre es immer noch keinen Sinn. Berücksichtigen Sie, dass eine BER von 1 (geschweige denn ÜBER 1) bedeutet, dass Sie das Symbol nicht jedes Mal korrekt wiederherstellen können. Durch einfache Statistiken sollten Sie zumindest einige von ihnen korrekt wiederherstellen, selbst wenn Sie sie zufällig auswählen. Das ist ein weiteres häufiges Fehlerszenario in dieser Art von Anwendungen.

Das gesagt, überprüfen Sie Ihre BER-Formulierung und zeichnen Sie einige Zwischenwerte. Tun Sie nicht alles in einem Schritt (z. B .: Testen Sie das System ohne die Korrekturcodes).

Ich hoffe, dass Sie eine Beule in die richtige Richtung gibt.

+0

Danke für die Rückmeldung. Ich werde die Formulierung überprüfen, wie Sie es vorgeschlagen haben. Ich habe die Codierung auf der Matlab-Website (Tutorials) verwendet. Wenn ich die Beispielcodierung ohne Modifikation durchführte, funktionierte der Code gut und zeigte eine logische Ausgabe von BER. Das Problem ist, wenn ich zwei Benutzer und CDMA hinzugefügt habe. –

Verwandte Themen