返回信息流自己找了个程序。。估计有毛病。而自己是个菜鸟找不出。。请求大虾帮忙。。
程序只有信道估计的图形。。而联合检测的图形没有。。误码率曲线也没有。。如何写程序使之出来呢。。还有就是程序的误码率太大了。如何修改程序呢。谢谢。。。望高手出现。。。
附件(13.1KB) 源程序已附上。。。其中子程序加了%。。自己仿真时注意这个。。谢谢。。。。求高手帮忙。。。
% 程序File_C9:TD_JD.m
clear;
clc;
%***********************************
%%仿真过程用到的变量
bit_len=88; %每个突发帧结构所包含的用户数据比特数
%TD-SCDMA每个突发帧的数据比特为704,扩频因子为16,采用QPSK调制,故每户数据比特数为704/16*2=88
N=44; %经过QPSK调制知道每个突发帧所包含的符号数
K=8; %用户个数
P=128; %基本midamble码的长度
Q=16; %扩频因子
W=P/K; %信道窗长度,为满足信道估计中的矩阵G是Toeplitz矩阵
%******************************************************************************
%%产生K个用户的随机数据
b=randint(K,bit_len); %随机产生K个用户的突发帧,实际系统中由信源产生
%********************************************************************************
%%进行QPSK调制
d=zeros(K,bit_len/2);
for user=1:K
for jj=1:bit_len/2
if b(user,2*jj-1)==0&&b(user,2*jj)==0
d(user,jj)=j;
elseif b(user,2*jj-1)==0&&b(user,2*jj)==1
d(user,jj)=1;
elseif b(user,2*jj-1)==1&&b(user,2*jj)==0
d(user,jj)=-1;
elseif b(user,2*jj-1)==1&&b(user,2*jj)==1
d(user,jj)=-j;
end
end
end
%*******************************************************************************
%%扩频
ovsf=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1;
1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1;
1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1;
1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1;
1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1 1;
1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1;
1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1;
1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1;
1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1;
1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1;
1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1;
1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1;
1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1;
1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1;
1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1];
%扩频码OVSF,Q=16时
spread=zeros(K,N*Q); %用扩频码扩频
for user=1:K
spread(user,:)=kron(d(user,:),ovsf(user,:));
end
%*********************************************************************************
%%加扰
scram=[-1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1];
w=ones(1,N);
scram=kron(w,scram);
s=zeros(size(spread));
for user=1:K
s(user,:)=spread(user,:).*scram;
end
%*******************************************************************************
%%形成突发结构
%突发帧结构由两个长度分别为352Chips的数据块,
%一个长为144Chips的midamble和一个长为16Chips的保护间隔组成
%发送数据块E,对每个时隙,数据分为两个部分,中间放midamble码,最后放保护间隔
for user=1:K %总用户数K
[mid_amble,GP]=midamble(K,P,user); %用户user的midamble码及保护间隔
len1=length(s(user,:))/2; %用户user的数据长度
len2=len1;
len3=length(mid_amble); %用户user的midamble码长度
len=len1+len2+len3+16; %用户user的发送数据块长度
e=zeros(1,len); %用户user的数据块e
for ii=1:len1
e(ii)=s(user,ii); %第一部分数据
e(ii+len1+len3)=s(user,ii+len1); %第二部分数据
end
for ii=1:len3
e(ii+len1)=mid_amble(ii); %插入midamble码
end
for ii=1:16
e(ii+len1+len3+len2)=GP(ii);
end
E(user,:)=e; %得到最后发送的包含midamble码的突发数据块E
end
%******************************************************************************************
%%debug
D_E=sum(E(:,:));
R_DE=real(D_E);
I_DE=imag(D_E);
%****************************************************************
%%虚实分离
Re=real(E);
Im=imag(E);
%*******************************************************************
%%脉冲成型
%设计升余弦滤波器
Delay=3;
R=0.22;
Fd=1;
Fs=4;
%生成升余弦滤波器
[ys,ts]=rcosine(Fd,Fs,'fir/sqrt',R,Delay);
%Fd为输入序列的抽样率,Fs为升余弦滤波器的抽样率
%'fir/sqrt'表示滤波器为有限冲激的根升余弦
%R为滤波器参数Alpha,Delay为响应时延
%实部虚部分别通过滤波器
for user=1:K
[y1(user,:),t1]=rcosflt(Re(user,:),Fd,Fs,'filter',ys); %length(y)=(length(x)+2*delay)*Fs/Fd
[y2(user,:),t2]=rcosflt(Im(user,:),Fd,Fs,'filter',ys);
send_data(user,:)=y1(user,:)+j*y2(user,:);
end
%********************************************************************
%%经过多径信道
%生成瑞利多径信道
Ts=0.02; %码片抽样时间间隔
Fmax=2; %最大多普勒频移
tau=[1,2,3,5]; %多径时延向量
pdb=[3,4,6,9]; %功率衰落向量
chan=rayleighchan(Ts,Fmax,tau,pdb); %必须满足Fmax<1/(10*Ts),chan为信道类
channel_hh=[1,zeros(1,243)]; %生成长度为244的冲激响应
channel_h=filter(chan,channel_hh); %将信道类转换成为信道响应向量
for jj=1:61
sample_h(jj)=channel_h(jj*4); %抽样得到长度为61的信道响应向量
end;
for user=1:K
channel_out(user,:)=conv(send_data(user,:),sample_h); %信号通过瑞利多径信道,
%序列长度增加了w-1,w为信道窗长
end;
channel_sum=sum(channel_out(:,:));
%******************************************************************************
%%经过高斯白噪声信道
%G_channel_sum=awgn(channel_sum,1,'measured');
%****************************************************************
%%接收端虚实分离
r_It=real(channel_sum);
r_Qt=imag(channel_sum);
%**************************************************************************
%%匹配滤波
[yr1,tr1]=rcosflt(r_It,Fd,Fs,'filter/Fs',ys);
%'filter/Fs'表示输入序列的抽样率等于滤波器抽样率为Fs
[yr2,tr2]=rcosflt(r_Qt,Fd,Fs,'filter/Fs',ys); %length(y)=length(x)+(2*delay*Fs/Fd)
ryr1=yr1.';
ryr2=yr2.';
%**********************************************************************************
%%debug 抽样
for jj=0:N*Q+144+16+W-2
D_Isample(1,jj+1)=ryr1(1,25+jj*4); %抽样,从第25个开始每4个码片抽取1个,前24个码
%片为时延
D_Qsample(1,jj+1)=ryr2(1,25+jj*4);
end
D_Rresult=R_DE-D_Isample(1:864);
D_Iresult=R_DE-D_Qsample(1:864);
data=D_Isample+j*D_Qsample; %抽样得到的数据
%*************************************************************************************************
%%信道估计
%Steiner估计器,该估计器只适合对FIR信道进行估计
%提取midamble码中的第W到Lm-1个
Lm=144;
f_mid=N*Q/2+W;
l_mid=N*Q/2+Lm-1;
e=data(1,f_mid:l_mid);
%构造G矩阵
basic=[1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,...
-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,...
-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,...
1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1];
%基本midamble码
%Lm is a constant,here is 144
L=Lm+(K-1)*W; %spread midamble length
m=zeros(1,L);
for ii=1:L
if ii<=P
m(1,ii)=(j^ii)*basic(1,ii);
else
m(1,ii)=m(1,ii-P);
end
end
%产生G矩阵
G=zeros(P,P); %矩阵G是Toeplitz矩阵,也是一个循环矩阵
%其各列或各行由基本midamble循环移位得到
Position=0;
for ii=1:P
for jj=1:P
Position=mod(P+ii-jj-1,P)+1;
G(ii,jj)=m(Position);
end
end
inv_G=inv(G); %求逆
hh=inv_G*e.'; %求得信道向量hh=[h1,h2,...hk]
hh_s=hh;
for user=1:K
hhk(user,:)=hh_s((user-1)*W+1:user*W); %分别求出每个用户的信道向量
subplot(2,4,user);
ph=1:1:W;
figure(1)
plot(ph,abs(hhk(user,:))); %画出每个用户的信道冲激响应,如果不加高斯白噪声,各个用户的信道冲激响应
%xlabel('信道冲激响应'); %是相等的
%ylabel('响应窗长');
end;
% %****************************************************************************************************
%%联合检测
%求用户userde组合信道响应H及系统矩阵A
A=zeros(N*Q+W-1,K*N);
I_N=eye(N);
for user=1:K
scram=[-1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1];
C_k=kron(I_N,(ovsf(user,:).*scram).'); %建立(N*Q,N)的块对角扩频矩阵
width=N*Q+W-1;
H_k_widen=zeros(width,width);
for ii=1:width
indx_hh=1;
col=ii;
while (col>0)&&(indx_hh<=W)
H_k_widen(ii,col)=hhk(user,indx_hh);
col=col-1;
indx_hh=indx_hh+1;
end
end
H_k=H_k_widen(:,1:N*Q); %信道矩阵H_k为(N*Q+W-1,N*Q)的矩阵
B_k=H_k*C_k; %矩阵B_k为(N*Q+W-1,N)的矩阵
A(:,(user-1)*N+1:user*N)=B_k; %矩阵A=[B_k,B_K-1,...B_1]为(N*Q+W-1,K*N)的矩阵
end
% figure(2)
% plot(ii,user);
%分离出接收的数据
x1=data(1:N*Q/2); %第一数据块
x2=data(N*Q/2+145:N*Q+144+15); %第二数据块加信道窗响应
xx=[x1,x2];
%根据迫零算法,接收端的输出信号估计为
a_A=A';
AA=inv(a_A*A);
d_estimate=AA*a_A;
dd_estimate=d_estimate*(xx.');
d_restore=dd_estimate.';
%*****************************************************************************************************************
%%QPSK逆映射
for user=1:K
dd_restore(user,:)=d_restore((user-1)*N+1:user*N);
end;
bb=zeros(K,88);
for user=1:K
for jj=1:N
for kk=1:4
test(kk)=abs(dd_restore(user,jj)-j^kk); %求出接收信号与QPSK判决信号的欧氏距向量
end;
test_result=min(test); %加入最小欧氏距判决,并进行QPSK逆映射
if test_result==test(1)
bb(user,2*jj-1)=0;
bb(user,2*jj)=0;
elseif test_result==test(2)
bb(user,2*jj-1)=1;
bb(user,2*jj)=0;
elseif test_result==test(3)
bb(user,2*jj-1)=1;
bb(user,2*jj)=1;
elseif test_result==test(4)
bb(user,2*jj-1)=0;
bb(user,2*jj)=1;
end;
end;
end;
% figure(2)
% plot(jj,kk);
%**************************************************************************************************
%%求误码率
error=bb-b;
for user=1:K
count(user)=0;
for jj=1:bit_len
if error(user,jj)~=0
count(user)=count(user)+1;
end;
end;
end;
count
figure(2)
plot(user,jj);
%**********************************************************************************
% 程序结束
%
% 子程序:
%
% function[mid_amble,GP]=midamble(K,P,user)
% ************************************************************************************
% 输入参数:
% K:用户数
% P:基本midamble码长度
% user:使用所产生midamble码的用户
% 输出参数:
% mid_amble:所产生的midamble码
% GP:所产生的保护间隔
% **************************************************************************
%
% 生成复数midamble码
% W=P/K; %W为冲激窗长
% Lm=144; %Lm为生成的midamble码长
% basic=[1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,...
% -1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,...
% -1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,...
% 1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,];
% 基本midamble码,长度为P
% L=Lm+(K-1)*W; %进行周期扩展
% m=zeros(1,L);
% for ii=1:L %按照“标准”生成复数midamble码
% if ii<=P
% m(1,ii)=(j^ii)*basic(1,ii);
% else
% m(1,ii)=m(1,ii-P);
% end
% end
% 生成用户所使用的midamble码
%
% mid_amble=zeros(1,Lm);
% for ii=1:Lm
% mid_amble(1,ii)=m(1,ii+(K-user)*W);
% end
% 产生保护间隔Gp
% Gp=2*random('bino',1,0.5,1,16)-1;
% for k=1:16
% if(mod(k,2)~=0)
% GP(k)=GP(k)*j;
% end
% end
% 程序结束
这是一条镜像帖。来源:北邮人论坛 / matlab / #7323同步于 2010/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
matalb信道估计及联合检测。。急救!!!!
jack8068469
2010/6/18镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。