




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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接收等相关通信模块。%但没有在频带上进行调制仿真。%仿真环境: 加性高斯白噪声信道.%数据速率 = 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 = 9600;% 码片速率为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*ones(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_ind将对应位置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, 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.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), 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 = 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) % 如果选择了软判决则会进行软判决, % 并进行解扰、解交织维特比译码 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); 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(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;% perrb1 = 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;% %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 of 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); % 取得对于每一位消息码编码器的输出位数 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), 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); % 此函数根据生成多项式进行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函数进行维比特编码的函数%*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); % 移位 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 成型滤波器的类型选择% walsh 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支路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); %成型滤波器,以下代码构造成型滤波器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 = 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(spectrum);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译码最佳度量%+ % 如果输入参数只有一个,则采用默认生成矩阵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 函数vitdec硬判决的维比特译码%*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; % 生成零矩阵 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, :) = 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 = min( 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); %将(bestind-1)/(n/2)结果向下取整%作为viterbi译码输出序列最后一位xx(t) = floor(bestind-1)/(n/2); %取数组元素赋nextstate初值nextstate = trellis(bestind, (t+1); for t=t:-1:2 %nextstate/(n/2)向下取整赋值给xx xx(t-1) = floor(nextstate/(n/2); %取数组元素赋值给nextstate nextstate = trellis( (nextstate+1), t); end %如果零尾if (zerotail) %取其中1到end-k+1位 xx = xx(1:end-k+1); end %*endoffile*2.1.9 函数receiversd用于软判决的接收机%*beginningoffile*%receiversd.mfunction dataout, metric = receiversd(sdchips, g, scrambler); % % 此函数用于实现基于viterbi译码的发送数据的恢复 %+variables+% sdchips 软判决rake接收机输入符号% g viterbi编码生成多项式矩阵% scrambler 扰码序列% dataout 接收数据(二进制形式) % metric viterbi译码最佳度量%+ 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 sdchips = sdchips.*sign(1/2-scrambler); % 解扰384bit interl = reshape(sdchips, 16, 24); % 解交织 sdchips = reshape(interl, length(sdchips), 1); % 速率=19.2 kbps dataout metric = softvitdec(g, sdchips, 1); % 卷积解码,判决%*endoffile* 2.1.10 函数softvitdec用于软判决的维比特译码%*beginningoffile*%softvitdec.mfunction xx, bestmetric = softvitdec(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; % 最大栅格深度 outmtrx = zeros(n, 2*l); % 存放256种移位寄存器状态所对应的编码for s = 1:n in0 = ones(l, 1)*0, (dec2bin(s-1), (k-1)-0); % 初始状态为0时对应移位寄存器状态in1 = ones(l, 1)*1, (dec2bin(s-1), (k-1)-0); % 初始状态为1 out0 = mod(sum(g.*in0), 2); % 对应的编码器输出 out1 = mod(sum(g.*in1), 2); outmtrx(s, :) = out0, out1; % 存到编码输出状态end outmtrx = sign(outmtrx-1/2); % 转换成双极性码 pathmet = 100; zeros(n-1), 1); % 初始状态 = 100 pathmettemp = pathmet(:,1); trellis = zeros(n, t); trellis(:,1) = 0 : (n-1); y = reshape(y, l, length(y)/l); % y为2*192矩阵for t = 1:t yy = y(:, t); % 取信码,每两个一组for s = 0:n/2-1 % 计算收到序列与所有可能发送序列的距离 b0 ind0 = max( pathmet(1+2*s, 2*s+1) + outmtrx(1+2*s, 0+1:l) * yy; outmtrx(1+(2*s+1), 0+1:l)*yy ); b1 ind1 = max( pathmet(1+2*s, 2*s+1) + outmtrx(1+2*s, l+1:l) * yy; outmtrx(1+(2*s+1), l+1:l) * yy ); p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年物流公司招聘岗位面试模拟题与答案解析
- 2025年安全生产培训证书题库
- 电子竞技比赛规则协议
- 扶贫知识培训班简报课件
- 作文元旦小品200字15篇
- 2025年食品安全员考试题库及答案指导
- 智慧农业装备研发与智能种植技术应用培训计划
- 佛理中考试题及答案
- 分级护理考试题库及答案
- 法院辅警考试题目及答案
- 《RWA 技术规范》标准草案
- 稳定基金管理办法
- 庭院围墙整治方案(3篇)
- 数据安全管理员职业技能鉴定经典试题含答案
- 农村公墓资金管理办法
- 2025年高考物理真题完全解读(广西卷)
- 动设备培训课件
- 教师课件的制作培训
- 质量成本控制与管理考核试卷
- 《探索正多边形镶嵌艺术》课件
- 船舶代理单证管理制度
评论
0/150
提交评论