www.gusucode.com > matlab通信工程仿真源码(张德丰等编著)程序书籍 > matlab_code/matlab通信工程仿真源码(张德丰等编著)/第10章/IS_95.m
%数据速率 = 9600 KBps clear all global Zi Zq Zs show R Gi Gq show = 0; SD = 0; % 选择软/硬判决接收 %主要的仿真参数设置 BitRate = 9600; ChipRate = 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矩阵代码 WLen = 64; Walsh = reshape([1;0]*ones(1, WLen/2), WLen , 1); %Walsh = zeros(WLen ,1); %扩频调制PN码的生成多项式 Gi_ind = [15, 13, 9, 8, 7, 5, 0]'; Gq_ind = [15, 12, 11, 10, 6, 5, 4, 3, 0]'; Gi = zeros(16, 1); Gi(16-Gi_ind) = ones(size(Gi_ind)); Zi = [zeros(length(Gi)-1, 1); 1]; % I路信道PN码生成器的初始状态 Gq = zeros(16, 1); Gq(16-Gq_ind) = ones(size(Gq_ind)); Zq = [zeros(length(Gq)-1, 1); 1]; % 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]'; Gs = zeros(43, 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); EbNo = [-2 : 0.5 : 6.5]; %仿真信噪比范围(dB) %实现主程序 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) fprintf('\nProcessing %1.1f (dB)', EbNo(i)); iter = 0; ErrB = 0; ErrC = 0; while (ErrB <300) & (iter <150) drawnow; %+发射机实现 TxData = (randn(N, 1)>0); % 速率为19.2Kcps [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); r = x+noise; %实现接收机代码 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'); subplot(313); plot(xor(TxData, RxData), '-o'); title(['Data Bit Errors. Metric = ', num2str(Metric)]); end if(mod(iter, 50)==0) fprintf('.'); save TempResults ErrB ErrC N iter end ErrB = ErrB + sum(xor(RxData, TxData)); ErrC = ErrC + sum(xor(RxHD, TxChips)); iter = iter+ 1; end ErrorsB = [ErrorsB; ErrB]; ErrorsC = [ErrorsC; ErrC]; NN = [NN; N*iter]; save SimData * end %实现误码率计算 PerrB = ErrorsB./NN; PerrC = ErrorsC./NN; 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; xlabel('信噪比/dB'); ylabel('误码率'); grid on;