1、 m序列产生及自相关和互相关函数曲线
function PN=makem(x) %m序列产生函数
ss1=num2str(x);
ss2=dec2bin(base2dec(ss1,8)); %先把八进制转换为十进制,再把十进制转换为二进制
G=2^(length(ss2)-1)-1; %最大周期
sd=[];
for j=1:(length(ss2)-2)
sd=[sd 0];
end
sd=[sd 1]; %寄存器初始状态0 0 1
PN=[];
for j=1:G
PN=[PN sd(length(sd))]; %m序列输出的第一位
onenum=[];
for jj=1:length(ss2)
if str2num(ss2(jj))==1
onenum=[onenum jj-1]; %存储二进制反馈系数里面“1”的位置-1,即进行异或的位置
end
end
enum函数
temp=sd(onenum(2));
for jj=3:length(onenum) %根据“1”的位置进行异或运算
temp=xor(temp,sd(onenum(jj)));
end
for jj=length(ss2)-1:-1:2 %移位(序列后一位值等于前一位值)
sd(jj)=sd(jj-1);
end
sd(1)=temp; %序列第一位等于反馈出来的值
end
function mandzi(ss) %m序列曲线及自相关函数曲线绘图函数
ss1=num2str(ss);
ss2=dec2bin(base2dec(ss1,8)); %转换为二进制
G=2^(length(ss2)-1)-1; %最大周期
PN=makem(ss); %调用函数计算m序列
pp=(-2).*PN+1; %0→1 1→-1
pp2=[];
for tao=-(G-1):G-1
pp1=circshift(pp,[0,tao]);
pp2=[pp2 sum(pp.*pp1)/G]; %计算自相关函数
end
subplot(2,1,1)
stem(PN)
grid on;
title(['使用生成多项式(',num2str(ss),')8=(',ss2,')2产生的m序列'])
subplot(2,1,2)
tao=-(G-1):G-1;
plot(tao,pp2)
grid on;
title('自相关函数曲线')
function huxg(x,y) %m序列互相关绘图函数
x1=num2str(x);
x2=dec2bin(base2dec(x1,8)); %转换为二进制
G1=2^(length(x2)-1)-1; %最大周期
y1=num2str(y);
y2=dec2bin(base2dec(y1,8)); %转换为二进制
G2=2^(length(y2)-1)-1; %最大周期
if G1~=G2
error('周期不同,无法计算')
return
end
pn1=makem(x); %分别调用函数计算出m序列
pn2=makem(y);
pp=[];
for tao=-(G1-1):G1-1
pn1tao=circshift(pn1,[0,tao]); %计算互相关函数
%pp=[pp sum(pn2.*pn1tao)/G1];
pp=[pp sum(pn2.*pn1tao)];
end
tao=-(G1-1):G1-1;
plot(tao,pp)
grid on;
title(['反馈系数(',num2str(x),')8和(',num2str(y),')8的互相关函数曲线'])
2、Rake接收机仿真
clear all;
clc
Numusers=1;
Nc=16; %扩频因子
ISI_Length=1; %每径延时为ISI_Lengh/2
EbN0db=[0:1:30]; %信噪比,单位dB
Tlen=8000; %数据长度
Bit_Error_Number1=0; %误比特率初始值
Bit_Error_Number2=0;
Bit_Error_Number3=0;
power_unitary_factor1=sqrt(6/9); %每径功率因子
power_unitary_factor2=sqrt(2/9);
power_unitary_factor3=sqrt(1/9);
s_initial=randsrc(1,Tlen); %数据源
wal2=[1 1;1 -1]; %产生walsh矩阵
wal4=[wal2 wal2;wal2 wal2*(-1)];
wal8=[wal4 wal4;wal4 wal4*(-1)];
wal16=[wal8 wal8;wal8 wal8*(-1)];
s_spread=zeros(Numusers,Tlen*Nc); %扩频
ray1=zeros(Numusers,2*Tlen*Nc);
ray2=zeros(Numusers,2*Tlen*Nc);
ray3=zeros(Numusers,2*Tlen*Nc);
for i=1:Numusers
x0=s_initial(i,:).'*wal16(8,:);
x1=x0.';
s_spread(i,:)=(x1(:)).';
end
%将每个扩频后的输出重复为两次,有利于下面的延迟(延迟半个码元)
ray1(1:2:2*Tlen*Nc-1)=s_spread(1:Tlen*Nc);
ray1(2:2:2*Tlen*Nc)=ray1(1:2:2*Tlen*Nc-1);
%产生第二径和第三径信号
ray2(ISI_Length+1:2*Tlen*Nc)=ray1(1:2*Tlen*Nc-ISI_Length);
ray2(2*ISI_Length+1:2*Tlen*Nc)=ray1(1:2*Tlen*Nc-2*ISI_Length);
for nEN=1:length(EbN0db)
en=10^(EbN0db(nEN)/10); %将Eb/N0的dB值转化为十进制数值
sigma=sqrt(32/(2*en)); %将收到的信号demp
demp=power_unitary_factor1*ray1+...
power_unitary_factor2*ray2+...
power_unitary_factor3*ray3+...
(randn(1,2*Tlen*Nc)+randn(1,2*Tlen*Nc)*i)*sigma;
dt=reshape(demp,32,Tlen)';
wal16_d(1:2:31)=wal16(8,1:16); %将walsh码重复为两次
wal16_d(2:2:32)=wal16(8,1:16);
rdata1=dt*wal16_d(1,:).'; %解扩后rdata1为第一径输出
wal16_delay1(1,2:32)=wal16_d(1,1:31); %将walsh码延迟半个码元
rdata2=dt*wal16_delay1(1,:).'; %解扩后rdata2为第二径输出
wal16_delay2(1,3:32)=wal16_d(1,1:30); %将walsh码延迟一个码元
wal16_delay2(1,1:2)=wal16_d(1,31:32);
rdata3=dt*wal16_delay2(1,:).'; %解扩后rdata3为第三径输出
p1=rdata1'*rdata1;
p2=rdata2'*rdata2;
p3=rdata3'*rdata3;
p=p1+p2+p3;
u1=p1/p;
u2=p2/p;
u3=p3/p;
rd_m1=real(rdata1*u1+rdata2*u2+rdata3*u3); %最大比合并
rd_m2=(real(rdata1+rdata2+rdata3))/3; %等增益合并
u=[u1,u2,u3]; %选择式合并
maxu=max(u);
if(maxu==u1)
rd_m3=real(rdata1);
else
if(maxu==u2)
rd_m3=real(rdata2);
else rd_m3=real(rdata3);
end
end
r_Data1=sign(rd_m1)'; %三种方法判决输出
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论