www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/sui3/1/mccdma1.m
% 清除内存,计时开始 变码长 SUI3 信道 clear tic; %设置参数 totalwords=1920; wordsize=2; linktype=0; %下行链路 ifftsize=256; numusers=4; procgain=16; %扩频码的长度 guardtime=16; guardtype=2; frameguard=ifftsize+guardtime; % Guard Time between successive frames (one symbol period) % 产生要发送的双极性二进制随机数 ber=[]; mse_ls=[]; seed=1234; rand('seed',seed); % Set to new seed seqnumlist = randperm(procgain); Datatx = zeros(numusers,totalwords); basesignal0=zeros(1,totalwords*procgain); for k = 1:numusers, Datatx(k,:)=floor(rand(1,totalwords)*2^wordsize);%产生2^wordsize进制发送数据 %进行映射 mapping=get80216map(2^wordsize); B=Datatx(k,:); for i=1:length(B), Datatx1(i)=mapping(1+B(i)); end; seqnum = seqnumlist(k); %扩频 basesignal_0=tranCDMA(Datatx1,procgain,seqnum,linktype); basesignal0=basesignal0+basesignal_0; %各个用户的扩频信号进行合并 end %ofdm调制 NumCarr =192; %取得载波数 %============= % 每载波要传输多少数据 %============= numsymb = ceil(length(basesignal0)/NumCarr); %如果传输的数据不是载波的整数倍,则在后面补零 if length(basesignal0)/NumCarr ~= numsymb, DataPad = zeros(1,numsymb*NumCarr); DataPad(1:length(basesignal0)) = basesignal0; basesignal0 = DataPad; end clear DataPad; Xf=reshape(basesignal0,NumCarr,length(basesignal0)/NumCarr); %PilotIndex=[45 69 93 117 141 165 189 213]; % pilot interval=24 PilotIndex=[45:24:213]; DCIndex=129; Wk=[1 0 1 0 0 0 1 1]'; % DownLink pilotini pilotini=1-2*Wk; % BPSK modulation for pilot DataIndex=[29:229]; % the other carriers except guard carriers Xf=[zeros(28,numsymb);Xf(1:16,:);zeros(1,numsymb);Xf(17:39,:);zeros(1,numsymb);Xf(40:62,:);zeros(1,numsymb);... Xf(63:85,:);zeros(1,numsymb);Xf(86:96,:);zeros(1,numsymb);Xf(97:107,:);zeros(1,numsymb);Xf(108:130,:);zeros(1,numsymb);... Xf(131:153,:);zeros(1,numsymb);Xf(154:176,:);zeros(1,numsymb);Xf(177:192,:);zeros(27,numsymb)]; Xf(PilotIndex,:)=pilotini(:,ones(1,numsymb)); % pilot insertion Cpp=diag(Xf(PilotIndex)); % diagonal matrix composed of pilot %================================== %Find the time waveform using IFFT %================================== BaseSignal = ifft(Xf); %ifft是对列进行ifft变换。 %================================= %Add a Guard Period %================================= if guardtype~=0 if guardtype == 1 %if guard period is just a zero transmission BaseSignal=[zeros(guardtime,numsymb);BaseSignal]; elseif guardtype == 2 EndSignal = size(BaseSignal,1); %Find the number of columns in the BaseSignal %将后guardtime拷贝,作为循环前缀,即:L=guardtime,N=EndSignal。 BaseSignal=[BaseSignal((EndSignal-guardtime+1):EndSignal,:); BaseSignal]; elseif guardtype == 3 EndSignal = size(BaseSignal,1); %Find the number of columns in the BaseSignal BaseSignal=[zeros(guardtime/2,numsymb); ... BaseSignal((EndSignal-guardtime/2+1):EndSignal,:); BaseSignal]; end end %BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2)) %先取第一列,再取第二列,…… %=============== % CHANNEL MODEL %=============== % generate channel parameter which is unknown to receiver P=[0 -5 -10]; % power of each tap in dB K=[1 0 0]; % Ricean K-factor in linear scale N=10000; % number of independent random realizations Fnorm=-1.5113; % gain normalization factor in dB dop=[0.4 0.4 0.4]; % Doppler maximal frequency parameter in Hz M=256; % number of taps of the Doppler filter P=10.^(P/10); % linear power:[1.0000 0.3162 0.1000] s2=P./(K+1); % variance: [0.5000 0.3162 0.1000] m2=P.*(K./(K+1)); % constant power: [0.5000 0 0]. m2=P-s2 (direct power=total power-diffuse power) m=sqrt(m2); % constant part L=length(P); paths_r=sqrt(1/2)*(randn(L,N)+j*randn(L,N)).*((sqrt(s2))'*ones(1,N)); paths_c=m'*ones(1,N); for p=1:L D=dop(p)/max(dop)/2; % normalize to highest Doppler f0=[0:M*D]/(M*D); % freqency vector psd=0.785*f0.^4-1.72*f0.^2+1.0; % psd approximation filt=[psd(1:end-1) zeros(1,M-2*M*D) psd(end:-1:2)]; % S(f) filt=sqrt(filt); % form S(f) to |H(f)| filt=ifftshift(ifft(filt)); % get impulse response filt=real(filt); % want a real-valued filter filt=filt/sqrt(sum(filt.^2)); % normalize filter path=fftfilt(filt,[paths_r(p,:) zeros(1,M)]); paths_r(p,:)=path(1+M/2:end-M/2); end; paths=paths_r+paths_c; paths=paths*10^(Fnorm/20); path1=ones(frameguard,1)*paths(1,[101:numsymb+100]).*BaseSignal; path2=ones(frameguard,1)*paths(2,[101:numsymb+100]).*BaseSignal; path3=ones(frameguard,1)*paths(3,[101:numsymb+100]).*BaseSignal; path01=reshape(path1,1,size(path1,1)*size(path1,2)); path02=reshape(path2,1,size(path2,1)*size(path2,2)); path03=reshape(path3,1,size(path3,1)*size(path3,2)); delay=2; % multipath delay(in sample) pathd1=[path01 zeros(1,delay*2)]; pathd2=[zeros(1,delay) path02 zeros(1,delay)]; pathd3=[zeros(1,delay*2) path03]; y=pathd1+pathd2+pathd3; y=y(1:length(path01)); % sync in the path1 for SNR=0:4:40 RxSignal=awgn(y,10^(SNR/10),'measured',1234,'linear'); %================== % RECEIVER SECTION %================== % remove cyclic prefix symbwaves=reshape(RxSignal,frameguard,numsymb); symbwaves = symbwaves(guardtime+1:frameguard,:); % Strip off the guard interval %fft变换 Yf=fft(symbwaves); Hp=inv(Cpp)*Yf(PilotIndex,:); % find the channel response at the pilot frequency DemSig=[]; for k=1:numsymb H_ls(:,k)=interp1(PilotIndex',Hp(:,k),[DataIndex]','linear','extrap'); H_ideal(:,k)=fft([paths(1,k+100) zeros(1,delay-1) paths(2,k+100) zeros(1,delay-1) paths(3,k+100)].',256); DemSig(:,k)=Yf(DataIndex,k)./H_ls(:,k); % extract effective data end esterr=H_ls-H_ideal(DataIndex,:); % LS estimation error mse_ls=[mse_ls,mse(abs(esterr))]; % Mean Square Error of LS estimation fprintf('SNR=%idB, MSE of LS estimation=%i\n',SNR,mse_ls); DemSig([DCIndex,PilotIndex]-28,:)=[]; % DC and pilots removal DemSig=reshape(DemSig,1,size(DemSig,1)*size(DemSig,2)); % complex signal to be de demapped %解扩 subsignal=[]; for k=1:numusers seqnum = seqnumlist(k); [data10,subsignal10]=recCDMA(DemSig,procgain,seqnum,linktype); subsignal=[subsignal;subsignal10]; end %去映射 Datarx=invmapping(subsignal,mapping,wordsize); %计算误码率 ber10=err(Datatx,Datarx,totalwords,numusers); ber=[ber,ber10]; end figure subplot(2,2,1) k=0:4:40 semilogy(k,ber,'-b*','MarkerSize',5) grid on axis([0 40 10^(-4) 1]) xlabel('SNR/dB'),ylabel('BER') legend('numusers=4') set (gcf,'color',[1 1 1]) subplot(2,2,2) k=0:4:40 semilogy(k,mse_ls,'-b*','MarkerSize',5) grid on axis([0 40 10^(-4) 1]) xlabel('SNR/dB'),ylabel('mse') legend('numusers=4') set (gcf,'color',[1 1 1]) toc