大家帮忙看看这篇仿真该怎么做?
这篇论文的仿真,我自己做了一个,但是不好使,我要画的是MSE学习曲线,一直不收敛。不知道哪里错了,高人指点一下吧!
clear
clc
Num=500; % 包含的BLOCK数
Np=7; % 一个BLOCK的导频数
N=32; % 一个BLOCK的数据长度
S=4; % 天线阵元数
SNR=18; % 信躁比
m=4; % 用户数
lamda=0.01; % 波长
d=lamda/2; % 阵元间距
mu=0.008; % 步长
sita=[-30,0,20,40]; % sita DOA
p=fix((N-Np)/Np)+1; % 导频间隔
%=============================================================
fph=Fp(Np,N,p); % 产生导频傅立叶变换矩阵
a00=a0(S,d,lamda,sita(3)); % 产生方向向量
wn=ones(S,1); % 初始化权值
en=zeros(Np,Num); % 初始化方差,导频的,频域中的
%==========================================================================
A1=ones(1,Num*(32-Np)); % 有用信号
for jj=1:Num*Np
if jj==1
B1(jj)=0;
B1(2*jj)=1;
else
B1(2*jj)=1; % 导频信号
B1(2*jj+1)=0;
end
end
%C1=QAM16Mod(A1); % QAM调制
muxout1=fpinsert1(Np,A1,B1); % 插入导频 fpinsert1(导频数Np,有用信号,导频信号)
psout1=ofdm2(muxout1,N); % OFDM处理模块,包括 串并-IFFT-并串
l1=size(psout1);
M1=reshape(psout1,32,fix(l1(2)/32)); % 经过OFDM处理后的信号变成矩阵形式,每一列是一个用户的信息,每个用户有32行即32个符号
%-------------------------------天线接收
y=zeros(Np,1);
k=size(M1);
xn=M1(:,1);
vn0=a00*xn';
%vn=awgn(vn0,SNR,'measured'); % 增加噪声
rn=wn'*vn0; % 经过权值调整后的信号
psout2=ofdmd2(rn,N); % 接收端的OFDM块反处理
[a,b]=fpde0(Np,psout2); % 解复用,a是信号,b是导频
y(1:Np)=B1(1:Np); % 参考导频向量
b=b.';
en=y-b;
for i=2:k(2)
wn=wn+2*mu*vn0*(fph'*(y-b)); % 权值更新
xn=M1(:,i); % 取下一个符号块
vn0=a00*xn'; % 接收
%vn=awgn(vn0,SNR,'measured'); % 增加噪声
rn=wn'*vn0; % 经过权值调整后的信号
psout2=ofdmd2(rn,N); % 接收端的OFDM块反处理
[a,b]=fpde0(Np,psout2); % 解复用,a是信号,b是导频
y(1:Np)=B1((i-1)*Np+1:(i-1)*Np+Np);
b=b.';
for n=1:Np
en(n,i)=(abs(y(n)-b(n)))^2;
end
end
e=sum(en,1);
semilogy(abs(e)) ;
其中的函数如下:
function Asita=a0(M,d,lamda,sita)
%
for ii=1:M
Asita(ii,1)=exp(-j*(2*pi/lamda)*d*(ii-1)*sin(sita/180*pi));
end
function muxout=fpinsert1(Np,A,B)
% insert fp
%
if Np==3
for k=1:fix(numel(A)/29)
C((k-1)*32+1)=B((k-1)*3+1);
C((k-1)*32+11)=B((k-1)*3+2);
C((k-1)*32+21)=B((k-1)*3+3);
for i=2:10
C((k-1)*32+i)=A((k-1)*29+(i-1));
end
for i=12:20
C((k-1)*32+i)=A((k-1)*29+(i-2));
end
for i=22:32
C((k-1)*32+i)=A((k-1)*29+(i-3));
end
end
end
if Np==5
for k=1:fix(numel(A)/27)
C((k-1)*32+1)=B((k-1)*5+1);
C((k-1)*32+8)=B((k-1)*5+2);
C((k-1)*32+15)=B((k-1)*5+3);
C((k-1)*32+22)=B((k-1)*5+4);
C((k-1)*32+29)=B((k-1)*5+5);
for i=2:7
C((k-1)*32+i)=A((k-1)*27+i-1);
end
for i=9:14
C((k-1)*32+i)=A((k-1)*27+i-2);
end
for i=16:21
C((k-1)*32+i)=A((k-1)*27+i-3);
end
for i=23:28
C((k-1)*32+i)=A((k-1)*27+i-4);
end
for i=30:32
C((k-1)*32+i)=A((k-1)*27+i-5);
end
end
end
if Np==7
for k=1:fix(numel(A)/25)
C((k-1)*32+1)=B((k-1)*7+1);
C((k-1)*32+6)=B((k-1)*7+2);
C((k-1)*32+11)=B((k-1)*7+3);
C((k-1)*32+16)=B((k-1)*7+4);
C((k-1)*32+21)=B((k-1)*7+5);
C((k-1)*32+26)=B((k-1)*7+6);
C((k-1)*32+31)=B((k-1)*7+7);
for i=2:5
C((k-1)*32+i)=A((k-1)*25+i-1);
end
for i=7:10
C((k-1)*32+i)=A((k-1)*25+i-2);
end
for i=12:15
C((k-1)*32+i)=A((k-1)*25+i-3);
end
for i=17:20
C((k-1)*32+i)=A((k-1)*25+i-4);
end
for i=22:25
C((k-1)*32+i)=A((k-1)*25+i-5);
end
for i=27:30
C((k-1)*32+i)=A((k-1)*25+i-6);
end
for i=32:32
C((k-1)*32+i)=A((k-1)*25+i-7);
end
end
end
muxout=C;
function out=Fp(Np,N,p)
% make matrix Fp(n)
% M 行数
% N 列数
%
for m=1:N
for n=1:Np
out(n,m)=exp(-j*2*pi*(m-1)*(n-1)*p/N);
end
end
function [A,B]=fpde0(Np,C)
% insert fp
%
if Np==3
for k=1:fix(numel(C)/32)
B((k-1)*3+1)=C((k-1)*32+1);
B((k-1)*3+2)=C((k-1)*32+11);
B((k-1)*3+3)=C((k-1)*32+21);
for i=2:10
A((k-1)*29+(i-1))=C((k-1)*32+i);
end
for i=12:20
A((k-1)*29+(i-2))=C((k-1)*32+i);
end
for i=22:32
A((k-1)*29+(i-3))=C((k-1)*32+i);
end
end
end
if Np==5
for k=1:fix(numel(C)/32)
B((k-1)*5+1)=C((k-1)*32+1);
B((k-1)*5+2)=C((k-1)*32+8);
B((k-1)*5+3)=C((k-1)*32+15);
B((k-1)*5+4)=C((k-1)*32+22);
B((k-1)*5+5)=C((k-1)*32+29);
for i=2:7
A((k-1)*27+i-1)=C((k-1)*32+i);
end
for i=9:14
A((k-1)*27+i-2)=C((k-1)*32+i);
end
for i=16:21
A((k-1)*27+i-3)=C((k-1)*32+i);
end
for i=23:28
A((k-1)*27+i-4)=C((k-1)*32+i);
end
for i=30:32
A((k-1)*27+i-5)=C((k-1)*32+i);
end
end
end
if Np==7
for k=1:fix(numel(C)/32)
B((k-1)*7+1)=C((k-1)*32+1);
B((k-1)*7+2)=C((k-1)*32+6);
B((k-1)*7+3)=C((k-1)*32+11);
B((k-1)*7+4)=C((k-1)*32+16);
B((k-1)*7+5)=C((k-1)*32+21);
B((k-1)*7+6)=C((k-1)*32+26);
B((k-1)*7+7)=C((k-1)*32+31);
for i=2:5
A((k-1)*25+i-1)=C((k-1)*32+i);
end
for i=7:10
A((k-1)*25+i-2)=C((k-1)*32+i);
end
for i=12:15
A((k-1)*25+i-3)=C((k-1)*32+i);
end
for i=17:20
A((k-1)*25+i-4)=C((k-1)*32+i);
end
for i=22:25
A((k-1)*25+i-5)=C((k-1)*32+i);
end
for i=27:30
A((k-1)*25+i-6)=C((k-1)*32+i);
end
for i=32:32
A((k-1)*25+i-7)=C((k-1)*32+i);
end
end
end
function psout=ofdmd2(wightin,N)
% s-p converter
%
a=size(wightin);
for kk=1:fix(a(2)/N);
for ik=1:N
spout(ik,1)=wightin(1,(kk-1)*N+ik);
end
psin=fft(spout);
for ik=1:N
psout(1,(kk-1)*N+ik)=psin(ik,1);
end
end
function psout=ofdm2(muxout,N)
% s-p converter
%
a=size(muxout);
for kk=1:fix(a(2)/N);
for ik=1:N
spout(ik,1)=muxout(1,(kk-1)*N+ik);
end
psin=ifft(spout);
for ik=1:N
psout(1,(kk-1)*N+ik)=psin(ik,1);
end
end