clear all;
%echo file off;
% Write display messages to a text file
diary QPSK_turbo.txt
% Frame size
L_total = input(' Please enter the frame size (= info + tail, default: 200) \n');
if isempty(L_total)
L_total = 200; % infomation bits plus tail bits
end
% set code or uncoded with Turbo
en_code = input(' set code or uncoded: ( default 0: 0--uncode with Turbo,/1--code with Turbo ) \n');
if isempty(en_code)
en_code = 0;
end
if en_code ==1;
% Code generator
g = input(' Please enter code generator: ( default: g = [1 1 1; 1 0 1 ] ) \n');
if isempty(g)
g = [ 1 1 1;
1 0 1 ];
end
%g = [1 1 0 1; 1 1 1 1];
%g = [1 1 1 1 1; 1 0 0 0 1];
[n,K] = size(g);
m = K - 1;
nstates = 2^m;
%puncture = 0, puncturing into rate 1/2;
%puncture = 1, no puncturing
rate_con = input(' Please choose rate_con (0/1): default 0 \n');
puncture=rate_con;
if isempty(puncture)
puncture = 0;
end
% Code rate
rate = 1/(2+puncture);
else
rate =1;
end
% N_frame
N_frame=input(' N_frame = .--default N_frame:100 \n');
if isempty(N_frame)
N_frame = 100; % default N_frame
end
% ferrlim Number of frame errors to count as a stop criterior
ferrlimm = input(' Please enter Max number of frame errors to terminate: ferrlimm= default 50 \n ');
if isempty(ferrlimm)
ferrlimm = 50;
end
% MaxEbN0db
MaxEbN0db = input(' Please putin MaxEbN0db: default 10(db) (-5db ~ **, 2.5 /db per plot) \n');
if isempty(MaxEbN0db)
MaxEbN0db = 10;
end
EbN0db=[-5:2.5:MaxEbN0db]; %产生一组 信噪比的值(db)
EbN0db0=EbN0db;
%EbN0db0=[5:5:MaxEbN0db]; %产生一组 信噪比的值(db)
if en_code==1;% 如果有编码是调整 信噪比
EbN0db0=EbN0db0+5;
ferrlim1=ones(1,4).*ferrlimm;% 7 grade for the ferrlim
ferrlim2=[1,0.02,0.001];
ferrlim=[ferrlim1,ferrlim2];
else
ferrlim=ones(1,7).*ferrlimm;% 7 grade for the ferrlim
end
%ferrlim=[42,37,27,14,3,0.4,0.005];% 7 grade for the ferrlim
%ferrlim=ones(1,7).*ferrlimm;% 7 grade for the ferrlim
%mod_channel
mod_channel=input(' mod_channel = (0-AWGN/1-Fading).--default 0 \n');
if isempty(mod_channel)
mod_channel= 0; % default mod_channel
end
% Number of Average
Average = input(' Please enter number of Average for each frame: default 3 \n');
if isempty(Average)
Average = 3;
end
niter=Average;
% en_disp
en_disp = input(' Please set the en_disp for the realtime disp figure---default 0-NO/1-YES \n');
if isempty(en_disp)
en_disp = 0;
end
% disp INFO. of the Symtem
if en_code ==1;
fprintf('\n\n----------------------------------------------------\n');
fprintf(' === SOVA decoder === \n');
fprintf(' Frame size = %6d\n',L_total);
fprintf(' code generator: \n');
for i = 1:n
for j = 1:K
fprintf( '%6d', g(i,j));
end
fprintf('\n');
end
if puncture==0
fprintf(' code rate = 1/2 \n');
else
fprintf(' code rate = 1/3 \n');
end
fprintf('\n----------------------------------------------------\n\n');
else
fprintf('\n\n----------------------------------------------------\n');
fprintf(' === ONLY QPSK uncoded === \n');
fprintf(' Frame size = %6d\n',L_total);
fprintf('\n----------------------------------------------------\n\n');
end
err_perfra=zeros(1,N_frame);
% 两层循环。外层为信噪比的,内层为仿真的帧数循环
for nEN = 1:length(EbN0db0)
en = 10^(EbN0db0(nEN)/10); % 将db的分贝值转换为 对应的 实际值
if nEN ==MaxEbN0db
en_disp = 1;
else
end
% 清除 位 错误寄存器和 帧 错误寄存器的值
errs(nEN,1:niter) = zeros(1,niter);
%nferr(nEN,1:niter) = zeros(1,niter);
nFr = 0; % clear counter of transmitted frames
%while ( (err_perfra(nFr) < ferrlim(nEN)) && (nFr < N_frame+1 ) )
while ( nFr < N_frame )
nFr = nFr + 1;
%for nFr= 1:N_frame
% choose for the bitseq of model
if en_code==1
% 下面是turbo码的编码过程
x = round(rand(1, L_total-m)); % info. bits 0 or 1
tra_data = x;% save the transmit datas
[temp, alpha] = sort(rand(1,L_total)); % random interleaver mapping
en_output = encoderm( x, g, alpha, puncture ) ; % encoder output (+1/-1)
bitseq=en_output;
else
x=randint(1,L_total,[0,1]); % 0 or 1 %产生随机信号
tsmdata=x;
bitseq=x;
end
% 下面是QPSK调制通过信道的解调过程
[S_demod]=mod_demod_QPSK(bitseq,mod_channel,rate,en,en_disp);% S_demode is 0 or 1
rsv_data = S_demod;% save the receive datas
if en_code==1;% need the SOVA decode
% 下面是turbo码的SOVA译码过程
rec_s = demultiplex(S_demod,alpha,puncture); % demultiplex to get input for decoder 1 and 2
% Initialize extrinsic information
L_e(1:L_total) = zeros(1,L_total);
for iter = 1:niter %多次求平均
% Decoder one
L_a(alpha) = L_e; % a priori info.
L_all = sova(rec_s(1,:), g, L_a, 1); % complete info.
L_e = L_all - 2*rec_s(1,1:2:2*L_total) - L_a; % extrinsic info.
% Decoder two
L_a = L_e(alpha); % a priori info.
L_all = sova(rec_s(2,:), g, L_a, 2); % complete info.
L_e = L_all - 2*rec_s(2,1:2:2*L_total) - L_a; % extrinsic info.
% convert to RZ(0/1)
RZ_decode(alpha) = (sign(L_all)+1)/2;
for al=1:length(RZ_decode)
if RZ_decode(al)>0.6
RZ_decode(al)=1;
else
RZ_decode(al)= 0;
end
end
% caculate the numbers of errors
err(iter) = length(find(RZ_decode(1:L_total-m)~=x));
end
err_perfra(nFr) = sum(err(1:niter))/niter;%求出 一帧 平均的误码位数
if (err_perfra(nFr) > ferrlim(nEN))
err_perfra(nFr) = ferrlim(nEN);
else
end
% Total number of bit errors for all average of a frame
% errs(nEN,1:niter) = errs(nEN,1:niter) + err(1:niter);
% Display intermediate results in process
fprintf('************** Eb/N0 = %5.2f db **************\n', EbN0db(nEN));
fprintf('Frame size ( contain Bits )= %d, rate 1/%d. \n', L_total, 2+puncture);
fprintf('the %d th frame transmitted, %d error in the frame.\n', nFr, err_perfra(nFr));
else % dont need decode of SOVA,ONLY QPSK
%for iter = 1:niter %多次求平均
%err_perfra(nFr)=sum(abs(tsmdata-S_demod));
%end
% caculate the BER
err_perfra(nFr)=sum(abs(tsmdata-S_demod));
%total_BER=total_BER+ num_BER;
fprintf('************** Eb/N0 = %5.2f db **************\n', EbN0db(nEN));
fprintf('Frame size ( contain Bits )= %d, rate 1/%d. \n', L_total, rate);
fprintf('the %d th frame transmitted, %d error in the frame.\n', nFr, err_perfra(nFr));
end
end
% 求 N_frame帧 的总错误位数
errs(nEN) = sum(err_perfra(1:nFr));
% Bit error rate
BER(nEN) = errs(nEN)/(N_frame*L_total);
format long;
fprintf('Bit Error Rate :\n');
disp(num2str(BER));
fprintf('\n');
fprintf('***********************************************\n\n');
%save main EbN0db ber BER
end
figure(3);
semilogy(EbN0db,BER,'-*');
xlabel('SNR(dB)')
ylabel('BER')
legend( 'R= ')
title(' Performance of the Turbo QPSK System ')
%figure(gcf)
%hold on;
%figure(3);
%semilogy(Eb
没有合适的资源?快使用搜索试试~ 我知道了~
turbo码在高斯信道下和衰弱信道下结合qpsk调制的仿真
共32个文件
m:17个
fig:10个
mat:5个
5星 · 超过95%的资源 需积分: 10 98 下载量 188 浏览量
2010-03-28
23:17:10
上传
评论 2
收藏 445KB RAR 举报
温馨提示
主要是利用qpsk调制和turbo码在高斯信道下和衰弱信道下做的结合仿真,对比出调制性能和编码性能,最后会反应在误码率曲线上。
资源推荐
资源详情
资源评论
收起资源包目录
SymofTurboQPSK.rar (32个子文件)
SymofTurboQPSK
main.m 8KB
trellis.m 2KB
bin_state.m 280B
gsdisp.fig 80KB
data.fig 7KB
rayliegh_val.m 306B
QPSK.fig 69KB
all.mat 128B
int_state.m 165B
single_fading.m 2KB
allaboutfading.fig 21KB
turbo_encode.m 3KB
sova.m 3KB
data8.fig 25KB
all.fig 66KB
encoderm.m 2KB
reshapetoNRZ.m 1KB
wave_uncode_mod_rsc.fig 76KB
fadingturbosim.mat 5KB
awgntubosim.mat 5KB
encode_bit.m 500B
demultiplex.m 1KB
allaboutAWGN.fig 22KB
AWGN.m 194B
qpsk_mod.m 1KB
mod_demod_QPSK.m 3KB
awgnonlysim.mat 1KB
demod_QPSK.m 1KB
ALLof.fig 24KB
rsv.fig 40KB
fadingonlyqpsk.mat 2KB
rsc_encode.m 1KB
共 32 条
- 1
sinwel
- 粉丝: 4
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页