2013-04-28 1 views
5

Я пытаюсь выполнить модуляцию и демодуляцию для 16-QAM, а затем попытаюсь сравнить теоретические и моделируемые BER.16-QAM модуляция и демодуляция - отсутствует одна линия на графике

Я не получение simulation -line на графике. Missing the <simulation>-line

Я не могу понять, что не так с моим кодом. Кто-нибудь может мне помочь?

вот код:

M=16; 
SNR_db = [0 2 4 6 8 10 12]; 
x = randi([0,M-1],1000,1); 
hmod = modem.qammod(16); 
hdemod = modem.qamdemod(hmod,'SymbolOrder', 'Gray'); 
tx = zeros(1,1000); 
for n=1:1000 
tx(n) = modulate(hmod, x(n)); 
end 
rx = zeros(1,1000); 
rx_demod = zeros(1,1000); 
for j = 1:7 
    err = zeros(1,7); 
    err_t = zeros(1,7); 
    for n = 1:1000 
rx(n) = awgn(tx(n), SNR_db(j)); 
rx_demod(n) = demodulate(hdemod, rx(n)); 

if(rx_demod(n)~=x(n)) 
    err(j) = err(j)+1; 
end 
    end 
    % err_t = err_t + err; 
end 
theoryBer = 3/2*erfc(sqrt(0.1*(10.^(SNR_db/10)))); 
figure 
semilogy(SNR_db,theoryBer,'-',SNR_db, err, '^-'); 
grid on 
legend('theory', 'simulation'); 
xlabel('Es/No, dB') 
ylabel('Symbol Error Rate') 
title('Symbol error probability curve for 16-QAM modulation') 
+0

К сожалению, вы можете быть более конкретным с вашей проблемой? Я могу выполнить ваш код, и там есть цифра. На самом деле я не вижу никакой проблемы! –

+0

Я вижу это: http://img401.imageshack.us/img401/5017/so1w.png –

+0

Вы переписываете количество ошибок «err» в каждой итерации цикла. Даже если вы исправите это, это не совсем правильно, поскольку err - это счет, где демодулированный сигнал не соответствует переданному, а теоретическая кривая - с точки зрения вероятности. – rajb245

ответ

0

http://www.dsplog.com/db-install/wp-content/uploads/2008/06/script_16qam_gray_mapping_bit_error_rate.m

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

Также вы можете попробовать

редактировать commdoc_mod

Сделайте копию этого файла, и вы должны быть в состоянии заставить его делать то, что вы хотите с одной простой петлей.

Редактировать

Вот изменения в этот файл, которые дают вам смоделированную кривые EbNo вместо тех частот ошибок символов. Должно быть достаточно хорошим для любой практической цели.

M = 16;      % Size of signal constellation 
k = log2(M);    % Number of bits per symbol 
n = 3e4;     % Number of bits to process 
nSyms = n/k;    % Number of symbols 

hMod = modem.qammod(M);   % Create a 16-QAM modulator 
hMod.InputType = 'Bit';   % Accept bits as inputs 
hMod.SymbolOrder = 'Gray';   % Accept bits as inputs 
hDemod = modem.qamdemod(hMod); % Create a 16-QAM based on the modulator 

x = randi([0 1],n,1); % Random binary data stream 
tx = modulate(hMod,x); 

EbNo = 0:10; % In dB 
SNR = EbNo + 10*log10(k); 

rx = zeros(nSyms,length(SNR)); 
bit_error_rate = zeros(length(SNR),1); 
for i=1:length(SNR) 
    rx(:,i) = awgn(tx,SNR(i),'measured'); 
end 
rx_demod = demodulate(hDemod,rx); 
for i=1:length(SNR) 
    [~,bit_error_rate(i)] = biterr(x,rx_demod(:,i)); 
end 

theoryBer = 3/(2*k)*erfc(sqrt(0.1*k*(10.^(EbNo/10)))); 
figure; 
semilogy(EbNo,theoryBer,'-',EbNo, bit_error_rate, '^-'); 
grid on; 
legend('theory', 'simulation'); 
xlabel('Eb/No, dB'); 
ylabel('Bit Error Rate'); 
title('Bit error probability curve for 16-QAM modulation'); 
0

В вашем коде вы путаете вероятность ошибки в символах и вероятность ошибки в битах. Кроме того, err = zeros(1,7); неуместен.

После исправлений:

M=16; 
SNR_db = 0:2:12; 
N=1000; 
x = randi([0,M-1],N,1); 
k = log2(M); % bits per symbol 

tx = qammod(x, M,'Gray'); 
err = zeros(1,7); 
for j = 1:numel(SNR_db) 
    rx = awgn(tx, SNR_db(j),'measured'); 
    rx_demod = qamdemod(rx, M, 'Gray'); 
    [~,err(j)] = biterr(x,rx_demod); 
end 

theorySER = 3/2*erfc(sqrt(0.1*(10.^(SNR_db/10)))); 

figure 
semilogy(SNR_db,theorySER,'-',SNR_db, err*k, '^-'); 
grid on 
legend('theory', 'simulation'); 
xlabel('Es/No, dB') 
ylabel('Symbol Error Rate') 
title('Symbol Error Probability curve for 16-QAM modulation') 

И полученный граф: enter image description here