武汉理工大学,移动通信,信息学院,通信工程
%++++++++++++++++++++++++++++++++++++++++++++++++++++++ %+++++++++++++++++++++++++接收机+++
+++++++++++++++++++++ RxSD = Demodulator(r, PN, MF, Walsh); %软判决,速率为 19.2 Kcps RxHD = (RxSD>0); % 定义接收码片的硬判决 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');%RAKE 接收机输入符号 与发送码相比出错的码 subplot(313); plot(xor(TxData, RxData), '-o'); %硬判决接收机与发送数据相比的出错码 title(['Data Bit Errors. Metric = ', num2str(Metric)]); pause; end if(mod(iter, 50)==0) %每 50 次保存一次 fprintf('.'); save TempResultsErrBErrC N iter %保存结果 end ErrB = ErrB + sum(xor(RxData, TxData));%求出错比特数 ErrC = ErrC + sum(xor(RxHD, TxChips)); %求出错码数 iter = iter+ 1;%迭代次数 end ErrorsB = [ErrorsB; ErrB]; %存储各 EbNo 值下的出错比特数 ErrorsC = [ErrorsC; ErrC]; %存储各 EbNo 值下的出错码数 NN = [NN; N*iter]; %存储各 EbNo 值下的总数据码数目 save SimData * %保存当前迭代的数据 end %+++++++++++++++++++++++++误码率计算++++++++++++++++++++++++ PerrB = ErrorsB./NN; %出错比特比例 %PerrB1 = ErrorsB1./NN1; PerrC = ErrorsC./NN; %出错码比例 Pbpsk= 1/2*erfc(sqrt(10.^(EbNo/10))); %EbNo 的余误差 PcVit= 1/2*erfc(sqrt(10.^((EbNo-EbEcVit)/10)));%EbNo-EbEcVit 的余误差 Pc = 1/2*erfc(sqrt(10.^((EbNo-EbEc)/10)));%EbNo-EbEc 的余误差 %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %%+++++++++++++++++++++++++性能仿真显示++++++++++++++++++++++ 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('误码率'); 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)'); % % legend('Pb of System', 'Pc before Viterbi of System', ... %'Pb of BPSK with no Viterbi (theory)', %'Pc before Viterbi (theory)', 'Pc on Receiver (theory)'); %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ disp('--------------end-------------------');
调用程序:
%VitEnc.m function 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); %根据 L 重新
设定 yy 长度 y = reshape(yy,K*L, 1);%矩阵变形 y = mod(y, 2); %模二运算 %SoftVitDec.m function [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); %输出矩阵的定义 for s = 1:N in0 = ones(L, 1)*[0, (dec2bin((s-1), (K-1))-'0')]; in1 = ones(L, 1)*[1, (dec2bin((s-1), (K-1))-'0')]; 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);%矩阵按输出码片数变形 for t = 1:T %主栅格计算循环 yy = y(:, t); %取出 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] ); 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);%生成单列 0 矩阵,输出变量 if (ZeroTail) %确定最佳度量 BestInd = 1; else [Mycop, BestInd] = max(PathMet); %非‘0’尾,取最大值所在位置 end BestMetric = PathMet(BestInd); %得到最后的最佳度量 xx(T) = floor((BestInd-1)/(N/2)); %赋值 xx 最后一个数 NextState = Trellis(BestInd, (T+1)); %从栅格矩阵获得初态 for t=T:-1:2 xx(t-1) = floor(NextState/(N/2));%倒序生成 xx NextState = Trellis( (NextState+1), t); %从栅格矩阵获得次态 end
武汉理工大学,移动通信,信息学院,通信工程
if (ZeroTail) xx = xx(1:end-K+1);%限定译码输出序列长度 end %ReceiverSD.m function [DataOut, Metric] = ReceiverSD(SDchips, G, Scrambler); % 此函数用于实现基于 Viterbi 译码的发送数据的恢复 %+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % SDchips 软判决 RAKE 接收机输入符号 % G Viterbi 编码生成多项式矩阵 % Scrambler 扰码序列 % DataOut 接收数据(二进制形式) % Metric Viterbi 译码最佳度量 %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (nargin == 1)%判断只有 SDchips 传入时在此生成 Viterbi 编码生成多项式矩阵 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);%解扰 INTERL = reshape(SDchips, 16, 24);%解交织 SDchips = reshape(INTERL', lengt
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新外语学习移动通信实验报告(4)全文阅读和word下载服务。
相关推荐: