📄 mimocdma.m
字号:
%mc-cdma simple structure
% considering channel with four taps
% with cyclic prefix
clear;
clear all;
close all;
%input symbol/bit duration
n=100;%number of symbols
c1=pn([0 1 0 0 1]);
c=2*c1-1;
%code matched filter
co=fliplr(c);
gmc=32;%length of the code
cp=16;%number of cyclic prefix
snr=[-16:10];
%snr=5;
runs=10000;
l=length(c);
for power=1:length(snr)
er=0;er1=0;er2=0;er3=0;
for r=1:runs
tr=[];trds=[];
b=randint(1,2*n);
%qpsk moudulation
b1=b;
b1(find(b1==0))=-1;
j=1;
for i=1:2:2*n
m(j)=complex(b1(i),b1(i+1));
j=j+1;
end
for i=1:n
%tr((i-1)*gmc+1:i*gmc)=ifft(m(i)*c,gmc);
tr1=[];
tr1=ifft(m(i)*c,gmc);
tr((i-1)*(gmc+cp)+1:i*(gmc+cp))=[tr1(gmc-cp+1:gmc) tr1]; %generating the transmitted signal and adding cyclic prefix
end
trds=kron(m,c);%spreading (ds-cdma system)
%channel model
pdp=[-20 -10 -10 0];%power density profile
%pdp=[0 -10 -10 -20];
for i=1:length(pdp)
h(i)=sqrt((10^(pdp(i)/10))/2)*complex(randn(1,1),randn(1,1));
end
tr=conv(h,tr);%passing through the channel
trds=conv(h,trds);
%sp=var(tr)+abs(mean(tr))^2;
sp=mean(tr.*conj(tr));
np=sp/(10^(snr(power)/10));
noise=sqrt(np/2)*complex(randn(1,length(tr)),randn(1,length(tr)));
tr=tr+noise;
%power calculation for ds-cdma
%spds=var(trds)+abs(mean(trds))^2;
spds=mean(trds.*conj(trds));
npds=spds/(10^(snr(power)/10));
nds=sqrt(npds/2)*complex(randn(1,length(trds)),randn(1,length(trds)));
trds=trds+nds;
%receiver structure
%h=1; %checking without the channel
t=1;
for i=1:n
rc=[];
%rc=fft(tr((i-1)*gmc+1:i*gmc),gmc)./fft(h,gmc);%ORC combining
rc=fft( tr( (i-1)*(gmc+cp)+cp+1 :i*(gmc+cp)), gmc )./fft(h,gmc); %ORC combining ,cyc. pre. removal
d=rc(1:gmc-1).*c;
decc=sum(d);
if real(decc)>0
if imag(decc)>0
rb(t)=1;rb(t+1)=1;
else
rb(t)=1;rb(t+1)=0;
end
else
if imag(decc)>0
rb(t)=0;rb(t+1)=1;
else
rb(t)=0;rb(t+1)=0;
end
end
t=t+2;
end
er=er+sum(mod(b+rb,2));
t=1;
for i=1:n
rc=[];
rc=fft( tr( (i-1)*(gmc+cp)+cp+1:i*(gmc+cp)),gmc).*conj(fft(h,gmc));%MRC combining and removal of cyc. pre.
%%
d=rc(1:gmc-1).*c;
decc=sum(d);
if real(decc)>0
if imag(decc)>0
rb1(t)=1;rb1(t+1)=1;
else
rb1(t)=1;rb1(t+1)=0;
end
else
if imag(decc)>0
rb1(t)=0;rb1(t+1)=1;
else
rb1(t)=0;rb1(t+1)=0;
end
end
t=t+2;
end
er1=er1+sum(mod(b+rb1,2));
t=1;
for i=1:n
rc=[];
rc=fft( tr( (i-1)*(gmc+cp)+cp+1:i*(gmc+cp)),gmc).*conj(fft(h,gmc));
rc=rc./abs(fft(h,gmc));%EGC combining
d=rc(1:gmc-1).*c;
decc=sum(d);
if real(decc)>0
if imag(decc)>0
rb2(t)=1;rb2(t+1)=1;
else
rb2(t)=1;rb2(t+1)=0;
end
else
if imag(decc)>0
rb2(t)=0;rb2(t+1)=1;
else
rb2(t)=0;rb2(t+1)=0;
end
end
t=t+2;
end
er2=er2+sum(mod(b+rb2,2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ds-cdma detection
%channel matched filter
ch=conj(fliplr(h));
%passing through the channel matched filter
trds=conv(ch,trds);
%passing through the code matched filter
trds=conv(co,trds);
in=l+length(h)-1;
trdd=trds(in:l:l*n+in-l);
t=1;er3=0;
%detection
for i=1:n
if real(trdd(i)) > 0
if imag(trdd(i))>0
rb3(t)=1;rb3(t+1)=1;
else
rb3(t)=1;rb3(t+1)=0;
end
else
if imag(trdd(i))>0
rb3(t)=0;rb3(t+1)=1;
else
rb3(t)=0;rb3(t+1)=0;
end
end
t=t+2;
end
er3=er3+ sum(mod(b+rb3,2));
power
r
end
ber(power)=er/(2*n*runs);
ber1(power)=er1/(2*n*runs);
ber2(power)=er2/(2*n*runs);
ber3(power)=er3/(2*n*runs);
end
semilogy(snr,ber,'b-x',snr,ber1,'r-o',snr,ber2,'m-d');
hold;
semilogy(snr,ber3,'k-o');
%%%%%%%%%%%%%%note%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%use mccdma_t1 for evaluating without cyclic prefix
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -