//shift_chip : shift circulate chip // n : number of shift function chip_out=shift_chip(chip_in,n) chip_out = chip_in; for i = 1:n chip_out = [ chip_out(2:$) ; chip_out(1) ] end endfunction sav_lines=lines(); lines(-1); //Gold sequences generation chip_i = gengold(5,[21;9],[13;15]); chip_q = gengold(5,[21;9],[13;10]); //shift sequence for receiver chip_ir = shift_chip(chip_i,15); chip_qr = shift_chip(chip_q,15); //compute Root Raised Cosine impulse //roll-off=0.35, length 128 pulse = filter_tap(1,128,8,0.35,1); //number of symbols by step Ns = 5000; //power of white noise in the AWGN channel sig_log=-12:1:-4; Eb=cos(%pi*(1/(2^2))); sig=[]; for i=1:size(sig_log,2) sig(i)=Eb/10^(sig_log(i)/10); end //initialize nb of ERROR ERROR = zeros(size(sig,1),1); //CDMA simulation function // //input : ERROR,sig,Ns //output : ERROOR function ERROR=CDMA_sim(ERROR,sig,Ns) for kk=1:3 for k=1:size(sig,1) //y = genint(Ns,3,1,2); tic(); //one vector of Ns symbols y = genint(Ns,1,1,2); //Q-PSK modulation [yi,yq] = modpsk(y,4); //spread yci = spread(yi,chip_i); ycq = spread(yq,chip_q); //up-sample by 8 yi_s = upsmpl(yci,8,1); yq_s = upsmpl(ycq,8,1); //filtering vector of I/Q components i = nfilter(yi_s,pulse'); q = nfilter(yq_s,pulse'); //Additive wgn channel i_n = awgn(i,sig(k)); q_n = awgn(q,sig(k)); //filtering vector of I/Q components i_r = nfilter(i_n,pulse'); q_r = nfilter(q_n,pulse'); //first stage of receiver g_i = intsym(i_r,8,5); g_r = intsym(q_r,8,5); yi_s_r = sign(g_i); yq_s_r = sign(g_r); yci_r = downsmpl(yi_s_r,8); ycq_r = downsmpl(yq_s_r,8); //despread ycci_r = despread(yci_r,chip_ir); yccq_r = despread(ycq_r,chip_qr); //second stage of receiver gg_i = intsym(ycci_r,31,15); gg_r = intsym(yccq_r,31,15); yi_r = sign(gg_i); yq_r = sign(gg_r); y_ir = downsmpl(yi_r,31); y_qr = downsmpl(yq_r,31); //demodpsk yr=demodpsk(y_ir,y_qr,4); //compute number of error ERROR(k) = ERROR(k) + ... size(find(double(y(1:size(yr(2:$-1),1)))-yr(2:$-1)<>0),'*'); b=toc(); printf("%f\n",b); end end endfunction //launch CDMA simulation function ERROR=CDMA_sim(ERROR,sig) //Compute teb and plot the trace TEB=ERROR/(Ns*2); plot_teb(49,sig_log,TEB,"1"); lines(sav_lines(2));