《CDMA蜂窝移动通信期末课程论文基于MATLAB的IS95系统仿真.doc》由会员分享,可在线阅读,更多相关《CDMA蜂窝移动通信期末课程论文基于MATLAB的IS95系统仿真.doc(21页珍藏版)》请在三一办公上搜索。
1、CDMA 期 末 论 文基于MATLAB的IS-95系统仿真 课程名称 CDMA蜂窝移动通信 姓 名 学 号 专 业 成 绩 任课老师 上课学期 1 作业要求l 分析给出的源程序,逐行给出中文注释,并分析仿真结果。l 按照如图1所示的框图设计一个CDMA系统,并进行仿真。信源卷积编码交织编码扩频加扰码调制AWGN信道解调解扰码信宿解卷积解交织解扩图1 CDMA系统框图2 题目一2.1 源程序注释2.1.1 主程序部分%main_CDMA_forward.m%此函数用于IS-95前向链路系统的仿真,包括扩%频调制,匹配滤波,RAKE接收等相关通信模块。%但没有在频带上进行调制仿真。%仿真环境:
2、加性高斯白噪声信道.%数据速率 = 9600 KBps% clear allclose allclc disp(-start-);% 定义通信仿真全局变量global Zi Zq Zs show R Gi Gq% Zi I支路扩频PN序列生成器状态% ZQ Q支路扩频PN序列生成器状态% Zs 扰码PN序列生成器状态% show 指示是否画出仿真过程各部分产生的输出% R 仿真时码元宽度% Gi I支路扩频PN序列% Gq Q支路扩频PN序列 clear j;show = 0;SD = 0; % 选择软/硬判决接收 %-主要的仿真参数设置-% 信道数据率为9600 bpsBitRate = 9
3、600;% 码片速率为1.2288 MHzChipRate = 1228800;% 消息码元个数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;% 生成矩阵的长度K = size(G_Vit, 2);% 输出码片数L = size(G_Vit, 1);%+ %+Walsh矩阵+% 规定需要的Walsh序列长度WLen = 64;% 生成 64 bit Walsh序列1010.Walsh = reshape(1;0*o
4、nes(1, WLen/2), WLen , 1);%Walsh = zeros(WLen ,1);%+ %+扩频调制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; % I信道扩频PN序列生成多项式Gi_ind = 15, 13, 9, 8, 7, 5, 0;% I信道扩频PN序列生成多项式Gq_ind = 15, 12, 11, 10, 6, 5, 4, 3, 0;% 初始化序列Gi(16 bit,全零)Gi = zeros(16, 1);% 根据生成多项式Gi_in
5、d将对应位置1Gi(16-Gi_ind) = ones(size(Gi_ind);% 初始化I路信道PN码生成器的初始状态Zi = zeros(length(Gi)-1, 1); 1;% 初始化序列Gi(16 bit,全零)Gq = zeros(16, 1);% 根据生成多项式Gq_ind将对应位置1,得到二进制生成多项式Gq(16-Gq_ind) = ones(size(Gq_ind);% Q路信道PN码生成器的初始状态Zq = zeros(length(Gq)-1, 1); 1;%+ %+扰码生成多项式+% 扰码序列生成多项式Gs_ind = 42, 35, 33, 31, 27, 26,
6、 25, 22, 21, 19, 18, 17, 16, 10, 7, 6, 5, 3, 2, 1, 0;% 初始化序列GsGs = zeros(43, 1);% 根据生成多项式Gs_ind将对应位置1,得到二进制生成多项式Gs(43-Gs_ind) = ones(size(Gs_ind);% 长序列生成器的初始状态Zs = zeros(length(Gs)-1, 1); 1;%+ %+AWGN信道+% 扩频增益EbEc = 10*log10(ChipRate/BitRate);%EbEcVit = 10*log10(L);% 仿真信噪比范围(dB)% EbNo = -2 : 0.5 : 6.
7、5;EbNo = -2 : 0.5 : 4;%+ %- %-主程序- % 初始化向量ErrorsB = ; ErrorsC = ; NN = ;% ErrorsB% ErrorsC% NN% 输出信息说明采用的维特比译码判决类型if (SD = 1) fprintf(n SOFT Decision Viterbi Decodernn);else fprintf(n HARD Decision Viterbi Decodernn);end % 对信噪比范围内每个数字进行仿真for i=1:length(EbNo) % 输出当前仿真信噪比 fprintf(nProcessing %1.1f (dB
8、), EbNo(i); iter = 0; % 仿真计数器 ErrB = 0; % 出错的比特数(编码前) ErrC = 0; % 出错的子码数(编码后) while (ErrB 300) & (iter 0); % 输出已编码、交织并加扰的消息比特与所用到的扰码 %(码率:19.2 kbps) TxChips, Scrambler = PacketBuilder(TxData, G_Vit, Gs); % 下面进行扩频调制,调制后码率为1.2288Mcps x PN MF = Modulator(TxChips, MFType, Walsh); %+ %+%信道产生高斯白噪声 noise =
9、 1/sqrt(2)*sqrt(R/2)*( randn(size(x) + j*randn(size(x)*10(-(EbNo(i) - EbEc)/20); %j*randn(size(x)*10(-(EbNo(i) - EbEc)/20); %向已调信号中混入加性高斯白噪声 r = x+noise; %+ %+接收机+ % 软判决,输出速率为19.2 Kcps 经过卷积编码的序列 RxSD = Demodulator(r, PN, MF, Walsh); % 对Rake接收机解调后的信号进行过零比较 RxHD = (RxSD0); if (SD) % 如果选择了软判决则会进行软判决, %
10、 并进行解扰、解交织维特比译码 RxData Metric= ReceiverSD(RxSD, G_Vit, Scrambler); else % 进行硬判决,并进行解扰、解交织维特比译码 RxData Metric= ReceiverHD(RxHD, G_Vit, Scrambler); end %+ if(show) % 画出软判决输出结果 subplot(311); plot(RxSD, -o); title(Soft Decisions); % 将判决结果与发送序列异或,显示出错码(维特比译码前) subplot(312); plot(xor(TxChips, RxHD), -o);
11、title(Chip Errors); % 将收发数据进行异或,显示出错码 subplot(313); plot(xor(TxData, RxData), -o); title(Data Bit Errors. Metric = , num2str(Metric); pause; end if(mod(iter, 50)=0) % 如果已循环次数为50的倍数则打印.将变量保存 fprintf(.); % 将变量保存到硬盘 save TempResults ErrB ErrC N iter end % 计算编码前,解码后出错的消息比特(9600 Bps)数量 ErrB = ErrB + sum(
12、xor(RxData, TxData); % 计算经过编码出错的子码(19.2 kBps)数 ErrC = ErrC + sum(xor(RxHD, TxChips); % 循环次数加1 iter = iter+ 1; end % 生成误比特数向量 ErrorsB = ErrorsB; ErrB; % 生成误码数向量 ErrorsC = ErrorsC; ErrC; % 计算本次共仿真的消息比特数 NN = NN; N*iter; % 保存所有产生的数据 save SimData *end %+误码率计算+% 计算误码率(卷积编码前的信号)PerrB = ErrorsB./NN;% PerrB
13、1 = ErrorsB1./NN1;% 计算误码率(卷积编码后的信号)PerrC = ErrorsC./NN;% BPSK调制理论误码率(无卷积编码与扩频)Pbpsk= 1/2*erfc(sqrt(10.(EbNo/10);% 有维特比译码但无扩频的理论误码率PcVit= 1/2*erfc(sqrt(10.(EbNo-EbEcVit)/10);% 有扩频但无维特比译码的理论误码率Pc = 1/2*erfc(sqrt(10.(EbNo-EbEc)/10);%+ %+性能仿真显示+figure;semilogy(EbNo(1:length(PerrB), PerrB, b-*);hold on;%
14、 %semilogy(EbNo(1:length(PerrB1), PerrB1, k-o);% hold on;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);xlabel(信噪比/dB);ylabel(误码率);%+disp(-end-);%-2.1.2 PacketBuilder函数用于信号传输之前的卷积编码和交织编码和加扰码% *beginning o
15、f file*%PacketBuilder.mfunction ChipsOut, Scrambler = PacketBuilder(DataBits, G, Gs); % %此函数用于产生IS-95前向链路系统的发送数据包 %+variables+% DataBits 发送数据(二进制形式)% G Viterbi编码生成多项式% Gs 长序列生成多项式(扰码生成多项式)% ChipsOut 输入到调制器的码序列(二进制形式)% Scrambler 扰码%+ % 全局变量global Zs % 取得卷积码的约束长度 K = 9K = size(G, 2); % 取得对于每一位消息码编码器的输
16、出位数 L = 2L = size(G, 1); % 计算扩频后的子数%(原始比特:9.6 Kbps- 卷积编码后:19.2 Kbps -扩频后:1.2288 Mbps) N = 64*L*(length(DataBits)+K-1);% 加入尾比特,并进行卷积编码chips = VitEnc(G, DataBits; zeros(K-1,1); % 交织编码% 先将编码器输出转为 24行16列矩阵INTERL = reshape(chips, 24, 16); % 再将转置矩阵按串行输出% 速率=19.2 KBps chips = reshape(INTERL, length(chips),
17、 1); % 产生扰码 % PNGen 用于产生1.2288 Mc/s 的扰码LongSeq Zs = PNGen(Gs, Zs, N); % 以下进行分频,得到19.2 kbps 的扰码Scrambler = LongSeq(1:64:end); % 对编码后的比特进行加扰(码率; 19.2 kbps)ChipsOut = xor(chips, Scrambler); %*end of file*2.1.3 Modulator函数将信号进行扩频和调制之后再发送%*beginningoffile*%VitEnc.mfunction y = VitEnc(G, x); % 此函数根据生成多项式进
18、行Viterbi编码 % %+variables+% G 生成多项式的矩阵% x 输入数据(二进制形式) % y Viterbi编码输出序列%+ % 取得对于每一位消息码编码器的输出位数K = size(G, 1); % 取得消息比特长度L = length(x); % 进行二维卷积运算 yy = conv2(G, x); % 去除多余项yy = yy(:, 1:L); % 将输出矩阵变为一行y = reshape(yy,K*L, 1); % 模2运算 y = mod(y, 2); %*endoffile*2.1.4 PNGen函数根据PN序列的生成多项式产生PN序列2.1.5 VitEnc函
19、数进行维比特编码的函数%*beginningoffile*%PNGen.mfunction y, Z = PNGen(G, Zin, N);% 此函数是根据生成多项式和输入状态产生长度为N的伪随机序列 %+variables+% G 生成多项式% Zin 移位寄存器初始化% N PN序列长度% y 生成的PN码序列% Z 移位寄存器的输出状态%+ % 取得生成矩阵的长度L = length(G);% 移位寄存器的初始化Z = Zin;% 初始化输出序列为全零y = zeros(N, 1);for i=1:N % 输出最高位 y(i) = Z(L); % 异或 Z = xor(G*Z(L), Z
20、); % 移位 Z = Z(L); Z(1:L-1);end%yy = filter(1, flipud(G), 1; zeros(N-1, 1);%yy = mod(yy, 2);%*end of file*2.1.6 函数Demodulator对接收到的信号进行解调和解扩%*beginningoffile*%Modulator.mfunction TxOut, PN, MF = Modulator(chips, MFType, Walsh);%此函数用于实现IS-95前向链路系统的数据调制 %+variables+% chips 发送的初始数据% MFType 成型滤波器的类型选择% Wa
21、lsh walsh码% TxOut 调制输出信号序列% PN 用于扩频调制的PN码序列% MF 匹配滤波器参数%+ % 导入全局变量global Zi Zq show R Gi Gq % 计算输出字码数N = length(chips)*length(Walsh); % 输入速率 = 19.2 KBps, 输出速率= 1.2288 Mcps% 先将单极性归二进制码变换为双极性码% 再与Walsh序列相乘,实现正交调制tmp = sign(Walsh-1/2)*sign(chips-1/2);% 串并转换chips = reshape(tmp, prod(size(tmp), 1);% 产生I支
22、路PN扩频序列(1.2288Mc/s)PNi Zi = PNGen(Gi, Zi, N);% 产生Q支路PN扩频序列(1.2288Mc/s)PNq Zq = PNGen(Gq, Zq, N);% 将I支路与Q支路在复数域合并表示PN = sign(PNi-1/2) + j*sign(PNq-1/2);% 同时对同相与正交分量进行扩频扩频chips_out = chips.*PN; % 对输出序列进行0插值(加上信道中传输的保护间隔)chips = chips_out, zeros(N, R-1);chips = reshape(chips. , N*R, 1); %成型滤波器,以下代码构造成型
23、滤波器switch (MFType) case 1 %升余弦滤波器(时域) L = 25; L_2 = floor(L/2); n = -L_2:L_2; B = 0.7; MF = sinc(n/R).*(cos(pi*B*n/R)./(1-(2*B*n/R).2); MF = MF/sqrt(sum(MF.2); case 2 %矩形滤波器 L = R; L_2 = floor(L/2); MF = ones(L, 1); MF = MF/sqrt(sum(MF.2); case 3 %汉明滤波器 L = R; L_2 = floor(L/2); MF = hamming(L); MF =
24、 MF/sqrt(sum(MF.2);end % 转置MF = MF(:); % 利用卷积运算进行基带滤波仿真TxOut = sqrt(R)*conv(MF, chips)/sqrt(2);% 去除冗余信息TxOut = TxOut(L_2+1: end - L_2); if (show) figure; % 画出匹配滤波器的时域特性(冲击响应) subplot(211); plot(MF, -o); title(Matched Filter); % 显示网格 grid on; subplot(212); % 画出功率谱 psd(TxOut, 1024, 1e3, 113); title(Sp
25、ectrum);end%*endoffile*2.1.7 函数ReceiverHD接收机,硬判决,进行解扰、解卷积和解交织%*beginningoffile*%ReceiverHD.mfunction DataOut, Metric = ReceiverHD(HDchips, G, Scrambler); % % 此函数用于实现基于Viterbi译码的硬判决接收机 %+variables+% SDchips 硬判决RAKE接收机输入符号% G Viterbi编码生成多项式矩阵% Scrambler 扰码序列% DataOut 接收数据(二进制形式) % Metric Viterbi译码最佳度量
26、%+ % 如果输入参数只有一个,则采用默认生成矩阵if (nargin = 1) G = 1 1 1 1 0 1 0 1 1; 1 0 1 1 1 0 0 0 1; end % 速率=19.2 KBps % 解扰HDchips = xor(HDchips, Scrambler); % 解交织INTERL = reshape(HDchips, 16, 24); HDchips = reshape(INTERL, length(HDchips), 1); % 维特比译码DataOut Metric = VitDec(G, HDchips, 1); %*endoffile*2.1.8 函数VitDe
27、c硬判决的维比特译码%*beginningoffile*%VitDec.mfunction xx, BestMetric = VitDec(G, y, ZeroTail); % % 此函数是实现硬判决输入的Viterbi译码 %+variables+% G 生成多项式的矩阵% y 输入的待译码序列 % ZeroTail 判断是否包含0尾% xx Viterbi译码输出序列 % BestMetric 最后的最佳度量%+ % 输出码片数 L = size(G, 1); % 生成多项式长度K= size(G, 2); % 状态数N = 2(K-1); % 最大栅格深度T = length(y)/L;
28、 % 生成零矩阵 OutMtrx = zeros(N, 2*L); for s = 1:N % 产生全1的矩阵与十进制转成二进制的矩阵相乘 in0 = ones(L, 1)*0, (dec2bin(s-1), (K-1)-0); % 产生全1的矩阵与十进制转成二进制的矩阵相乘 in1 = ones(L, 1)*1, (dec2bin(s-1), (K-1)-0); % 两矩阵对应位置元素相乘之和对2求余 out0 = mod(sum(G.*in0), 2); % 两矩阵对应位置元素相乘之和对2求余 out1 = mod(sum(G.*in1), 2); % 两个矩阵合并 OutMtrx(s,
29、:) = out0, out1; end % 初始状态 = 100 PathMet = 0; 100*ones(N-1), 1); % 取出第1列的元素PathMetTemp = PathMet(:,1); % 生成零矩阵Trellis = zeros(N, T); % 往矩阵第1列赋予0、1、2的递增值Trellis(:,1) = 0 : (N-1); % 矩阵变形 y = reshape(y, L, length(y)/L); for t = 1:T % 从1到T列逐列取出,并转置 yy = y(:, t); for s = 0:N/2-1 % 对运算结果取最小值 B0 ind0 = mi
30、n( PathMet(1+2*s, 2*s+1) + sum(abs(OutMtrx(1+2*s, 0+1:L) - yy).2); sum(abs(OutMtrx(1+(2*s+1), 0+1:L) - yy).2) ); % 对运算结果取最小值 B1 ind1 = min( PathMet(1+2*s, 2*s+1) + sum(abs(OutMtrx(1+2*s, L+1:L) - yy).2); sum(abs(OutMtrx(1+(2*s+1), L+1:L) - yy).2) ); % 将B0与B1矩阵合并并赋值 PathMetTemp(1+s, s+N/2) = B0; B1; Trellis(1+s, s+N/2, t+1) = 2*s+(ind0-1); 2*s + (ind1-1); end PathMet = PathMetTemp; end %生成零矩阵 xx = zeros(T, 1); %如果包含零尾if (ZeroTail) %最佳标志位置1 BestInd = 1; else %否则取矩阵最小值赋值 Mycop, BestInd = min(PathMet); end %最佳度量为矩阵被标志的位 BestMetric = PathMet(BestInd);