毕业设计选题目Low snr system design,这个题目还是挺有趣的,这几天也顺便把matlab的扩频这一部分仿真重新研究了下,以下部分代码是综合了下博文视点出了MATLAB/Simulink书中的部分代码,学习了一下,还是挺不错的。
% main_DSCDMA.m
% 北京理工大学珠海学院
% 徐方鑫
% 信息工程
%+++++++++++++++++++++++准备部分+++++++++++++++++++++++++++
clear all;
clc
sr = 256000.0; % 符号速率
ml = 2; % 调制阶数
br = sr * ml; % 比特速率
nd = 100; % 符号数
SNR=-5:1:10; % Eb/No
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++滤波器初值设定+++++++++++++++++++++++
irfn = 21; % 滤波器阶数
IPOINT = 8; % 过采样倍数
alfs = 0.5; % 滚降因子
[xh] = hrollfcoef(irfn,IPOINT,sr,alfs,1);
[xh2] = hrollfcoef(irfn,IPOINT,sr,alfs,0);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++扩频码初值设定+++++++++++++++++++
user = 1; % 用户数
seq = 1; % 1:m序列 2:Gold序列 3:正交Gold序列
stage = 3; % 序列阶数
ptap1 = [1 3]; % 第一个线性移位寄存器的系数
ptap2 = [2 3]; % 第二个线性移位寄存器的系数
regi1 = [1 1 1]; % 第一个线性移位寄存器的初始化
regi2 = [1 1 1]; % 第二个线性移位寄存器的初始化
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
disp('--------------start-------------------');
fprintf('%4s\t%4s\t%4s\t%4s\n','信噪比','误码数','总码数','误码率');
%+++++++++++++++++扩频码的产生+++++++++++++++++
for ebn0=-5:1:10
switch seq
case 1 % m序列
code = mseq(stage,ptap1,regi1,user);
case 2 % Gold序列
m1 = mseq(stage,ptap1,regi1);
m2 = mseq(stage,ptap2,regi2);
code = goldseq(m1,m2,user);
case 3 % 正交Gold序列
m1 = mseq(stage,ptap1,regi1);
m2 = mseq(stage,ptap2,regi2);
code = [goldseq(m1,m2,user),zeros(user,1)];
end
code = code * 2 - 1;
clen = length(code);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++信道衰减初值设定+++++++++++++++++++++++
rfade = 0; % 瑞利衰减 0:不考虑 1:考虑
itau = [0,8]; % 延时
dlvl1 = [0.0,40.0]; % 衰减电平
n0 = [6,7]; % 用于产生衰落的波数
th1 = [0.0,0.0]; % 延迟波形的初始相位
itnd1 = [3001,4004]; % 设置衰落计数
now1 = 2; % 主径和延迟波形总数
tstp = 1 / sr / IPOINT / clen; % 时间分辨率
fd = 160; % 多普勒频移[Hz]
flat = 1; % 平坦瑞利衰落环境
itndel = nd * IPOINT * clen * 30;
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++仿真运算开始++++++++++++++++++++++++
nloop = 1000; % 仿真循环次数
noe = 0;
nod = 0;
for ii=1:nloop
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++发射机++++++++++++++++++++++++++++
data = rand(user,nd*ml) > 0.5;
[ich, qch] = qpskmod(data,user,nd,ml); % QPSK 调制
[ich1,qch1] = spread(ich,qch,code); % 扩频
[ich2,qch2] = compoversamp2(ich1,qch1,IPOINT); % 过采样
[ich3,qch3] = compconv2(ich2,qch2,xh); % 滤波
if user == 1
ich4 = ich3;
qch4 = qch3;
else
ich4 = sum(ich3);
qch4 = sum(qch3);
end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++衰减信道++++++++++++++++++++++++++
if rfade == 0
ich5 = ich4;
qch5 = qch4;
else
[ich5,qch5] = sefade(ich4,qch4,itau,dlvl1,th1,n0,itnd1, ...
now1,length(ich4),tstp,fd,flat);
itnd1 = itnd1 + itndel;
end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++接收机++++++++++++++++++++++++++++
spow = sum(rot90(ich3.^2 + qch3.^2)) / nd; % 衰减计算
attn = sqrt(0.5 * spow * sr / br * 10^(-ebn0/10));
[ich6,qch6] = comb2(ich5,qch5,attn); % 添加高斯白噪声(AWGN)
[ich7,qch7] = compconv2(ich6,qch6,xh2); % 滤波
sampl = irfn * IPOINT + 1;
ich8 = ich7(:,sampl:IPOINT:IPOINT*nd*clen+sampl-1);
qch8 = qch7(:,sampl:IPOINT:IPOINT*nd*clen+sampl-1);
[ich9 qch9] = despread(ich8,qch8,code); % 解扩
demodata = qpskdemod(ich9,qch9,user,nd,ml); % QPSK解调
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++误码率分析++++++++++++++++++++
noe2 = sum(sum(abs(data-demodata)));
nod2 = user * nd * ml;
noe = noe + noe2;
nod = nod + nod2;
% fprintf('%d\t%e\n',ii,noe2/nod2);
end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++数据文件++++++++++++++++++++++++++
ber = noe / nod;
fprintf('%4d\t%4d\t%4d\t%4e\n',ebn0,noe,nod,noe/nod);
fid = fopen('BER.dat','a');
fprintf(fid,'%4d\t%4e\t%4f\t%4f\t\n',ebn0,noe/nod,noe,nod);
fclose(fid);
err_rate_final(ebn0+6)=ber;
end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++性能仿真图++++++++++++++++++++++++++
figure
semilogy(SNR,err_rate_final,'b-*');
xlabel('信噪比/dB')
ylabel('误码率')
axis([-5,10,0,1])
grid on
disp('--------------end-------------------');
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++