基于MATLAB的CDMA系统仿真
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WLen = 64; %walsh 码的长度
Walsh = reshape([1;0]*ones(1, WLen/2), WLen , 1); %32 个 1 0 行
%Walsh = zeros(WLen ,1);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
K = size(G_Vit, 2); %列数
L = size(G_Vit, 1); %行数
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++Walsh 矩阵++++++++++++++++++++++++
%++++++++++++++++++++++AWGN 信道++++++++++++++++++++++++
EbEc = 10*log10(ChipRate/BitRate);%处理增益
EbEcVit = 10*log10(L);
EbNo = [-2 : 0.5 : 6.5];
%仿真信噪比范围(dB)
ቤተ መጻሕፍቲ ባይዱ
%main_IS95_forward.m
%此函数用于 IS-95 前向链路系统的仿真,包括扩
%频调制,匹配滤波,RAKE 接收等相关通信模块。
%仿真环境: 加性高斯白噪声信道.
%数据速率 = 9600 KBps
%
clear all
close all
clc
disp('--------------start-------------------');
N = 184; %源数据数
MFType = 1; % 匹配滤波器类型--升余弦
R = 5;
%+++++++++++++++++++Viterbi 生成多项式++++++++++++++++++
G_Vit = [1 1 1 1 0 1 0 1 1; 1 0 1 1 1 0 0 0 1];%Viterbi 生成多项式矩阵
基于 MATLAB 的 CDMA 系统仿真
姓 名: 班 级: 学 号: 指导老师: 日 期:
作业要求
1.分析附录的源程序,逐行给出中文注释,并分析仿真结果。 2.按照下列框图设计一个 CDMA 系统,并进行仿真。
信源
卷积编码
交织编码
加扰码
调制 AWGN 信道
调制
扩频 解扩
信宿
解卷积
解交织
去扰码
1. 分析附录的源程序,逐行给出中文注释,并分析仿真结果。
Gq_ind = [15, 12, 11, 10, 6, 5, 4, 3, 0]'; %q 路 PN 码生成多项式参数
Gi = zeros(16, 1); %16×1 的 0 矩阵
Gi(16-Gi_ind) = ones(size(Gi_ind));%根据 Gi_ind 配置 i 路 PN 码生成多项式
end
ErrorsB = [ErrorsB; ErrB]; %存储各 EbNo 值下的出错比特数
ErrorsC = [ErrorsC; ErrC]; %存储各 EbNo 值下的出错码数
NN = [NN; N*iter]; %存储各 EbNo 值下的总数据码数目
save SimData * %保存当前迭代的数据
RxHD = (RxSD>0);
% 定义接收码片的硬判决
if (SD) [RxData Metric]= ReceiverSD(RxSD, G_Vit, Scrambler); %软判决
else
[RxData Metric]= ReceiverHD(RxHD, G_Vit, Scrambler); %硬判决
PcVit= 1/2*erfc(sqrt(10.^((EbNo-EbEcVit)/10)));%EbNo-EbEcVit 的余误差
Pc = 1/2*erfc(sqrt(10.^((EbNo-EbEc)/10)));%EbNo-EbEc 的余误差
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
fprintf('\nProcessing %1.1f (dB)', EbNo(i));%输出当前 EbNo 值
iter = 0; ErrB = 0; ErrC = 0; while (ErrB <300) & (iter <150)
drawnow;
%++++++++++++++++++++++发射机+++++++++++++++++++++++
Gs = zeros(43, 1); %43×1 的 0 矩阵
Gs(43-Gs_ind) = ones(size(Gs_ind)); %根据 Gs_ind 配置扰码生成多项式
Zs = [zeros(length(Gs)-1, 1); 1];
% 长序列生成器的初始状态
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
r = x+noise;%加入噪声
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++接收机++++++++++++++++++++++++
RxSD = Demodulator(r, PN, MF, Walsh); %软判决,速率为 19.2 Kcps
end %++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(show)
subplot(311); plot(RxSD, '-o'); title('Soft Decisions'); %软判决结果图
subplot(312); plot(xor(TxChips, RxHD), '-o'); title('Chip Errors');%RAKE 接收机输入
xlabel('信噪比/dB');
ylabel('误码率');
grid on;
% legend('Pb of System (HD)', 'Pb of System (SD)', 'Pc before Viterbi of System',
% ... 'Pb of BPSK with no Viterbi (theory)', 'Pc on Receiver (theory)');
符号与发送码相比出错的码
subplot(313); plot(xor(TxData, RxData), '-o'); %硬判决接收机与发送数据相比的出
错码
title(['Data Bit Errors. Metric = ', num2str(Metric)]); pause; end if(mod(iter, 50)==0) %每 50 次保存一次
%%+++++++++++++++++++++++++性能仿真显示++++++++++++++++++++++
figure;
semilogy(EbNo(1:length(PerrB)), PerrB, 'b-*'); hold on;%信噪比误码率图
% %semilogy(EbNo(1:length(PerrB1)), PerrB1, 'k-o'); hold on;
%++++++++++++++++++扩频调制 PN 码的生成多项式++++++++++++++
%Gi = [ 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1]';
%Gq = [ 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1]';
Gi_ind = [15, 13, 9, 8, 7, 5, 0]'; %i 路 PN 码生成多项式参数
% Q 路信道 PN 码生成器的初始状态
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++扰码生成多项式++++++++++++++++++++++
Gs_ind = [42, 35, 33, 31, 27, 26, 25, 22, 21, 19, 18, 17, 16, 10, 7, 6, 5, 3, 2, 1, 0]';
fprintf('.'); save TempResults ErrB ErrC N iter %保存结果
end ErrB = ErrB + sum(xor(RxData, TxData));%求出错比特数
ErrC = ErrC + sum(xor(RxHD, TxChips)); %求出错码数
iter = iter+ 1;%迭代次数
TxData = (randn(N, 1)>0);%生成源数据
% 速率为 19.2Kcps
[TxChips, Scrambler] = PacketBuilder(TxData, G_Vit, Gs); %产生 IS-95 前向链路系统的
发送数据包
% 速率为 1.2288Mcps
[x PN MF] = Modulator(TxChips, MFType, Walsh);%实现 IS-95 前向链路系统的数据调
Zi = [zeros(length(Gi)-1, 1); 1];
% I 路信道 PN 码生成器的初始状态
Gq = zeros(16, 1); %16×1 的 0 矩阵
Gq(16-Gq_ind) = ones(size(Gq_ind)); %根据 Gq_ind 配置 q 路 PN 码生成多项式
Zq = [zeros(length(Gq)-1, 1); 1];
ErrorsB = []; ErrorsC = []; NN = [];
if (SD == 1) % 判断软/硬判决接收
fprintf('\n SOFT Decision Viterbi Decoder\n\n'); else
fprintf('\n HARD Decision Viterbi Decoder\n\n'); end for i=1:length(EbNo) %根据 EbNo 多次运行
%EbNo = [-2 : 0.5 : -1.5];
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%------------------------------------------------------
%-------------------------主程序-------------------------
% semilogy(EbNo(1:length(PerrC)), PerrC, 'b-o'); grid on;
% semilogy(EbNo, Pbpsk, 'b-.^');
% %semilogy(EbNo, PcVit, 'k-.x'); ylabel('BER');
% semilogy(EbNo, Pc, 'b-.x');
制
%++++++++++++++++++++++++++++++++++++++++++++++++++++++ %++++++++++++++++++++++++信道+++++++++++++++++++++++++++
noise = 1/sqrt(2)*sqrt(R/2)*( randn(size(x)) + j*randn(size(x)))*10^(-(EbNo(i) EbEc)/20);%生成噪声序列
global Zi Zq Zs show R Gi Gq
clear j;
show = 0; %控制程序运行中的显示
SD = 0;
% 选择软/硬判决接收
%-------------------主要的仿真参数设置------------------
BitRate = 9600; %比特率
ChipRate = 1228800; %码片速率
end %+++++++++++++++++++++++++误码率计算++++++++++++++++++++++++
PerrB = ErrorsB./NN; %出错比特比例
%PerrB1 = ErrorsB1./NN1;
PerrC = ErrorsC./NN; %出错码比例
Pbpsk= 1/2*erfc(sqrt(10.^(EbNo/10))); %EbNo 的余误差
%
% legend('Pb of System', 'Pc before Viterbi of System', ...