%天津工业大学电子与信息工程学院
%黎铭周
%E-mail:limingzhou@qq.com
%这是基于正交导频块的MIMO系统仿真
%集成了LS,MMSE,OMP算法
%循环1000次大约需要1021秒
%没有信道均衡模块,采用NMSE衡量信道估计精度。
clc;
clear all;
close all;
num_pilot=16;
%导频长度;最好设置为2的N次幂,并且大于Nt*L
K=2;
%信道稀疏度
L=4;
%信道长度
num_carrier=32;
%总的载波个数
Nt=2;
%发射天线数量
P=function_pilot(num_pilot,Nt);
%生成正交导频块,如果不使用正交导频块,信道估计结果会有严重误差
%正交导频块是施密特正交矩阵与单位矩阵的克罗内克积
loop=1000;
%循环次数,一般1000次曲线比较光滑
snr=0:1:35
%信噪比
F_carrier=fft(eye(max(num_carrier,Nt*L)));
F_carrier=F_carrier(1:num_carrier,1:Nt*L)/(Nt*L);
%所有频段的傅里叶矩阵
sequence=function_suiji(2,num_carrier-1,num_pilot*Nt-2);
sequence=[1,sequence,num_carrier];
sequence=sort(sequence);
%导频产生使用的子载波序号,随机产生
%已有文献证明,导频随机分布,信道估计结果比均匀分布要好
F_pilot=F_carrier(sequence,:);
A=P*F_pilot;
%观测矩阵
A_1=inv(A'*A)*A';
%观测矩阵伪逆
NMSE_LS=zeros(loop,length(snr));
%存储LS算法归一化均方误差
NMSE_MMSE=zeros(loop,length(snr));
%存储MMSE算法归一化均方误差
NMSE_OMP=zeros(loop,length(snr));
%存储OMP算法归一化均方误差
[h,h1]=function_channel(Nt,L,K);
%产生时域稀疏信道
H_carrier=F_carrier*h;
%产生频域信道
y_no_noise=A*h;
%生成总功率为1,各信道功率为1/Nt的时域冲击响应
gg=diag(h);
gg_myu = sum(gg, 1)/L/Nt;
gg_mid = gg - gg_myu(ones(L*Nt,1),:);
sum_gg_mid= sum(gg_mid, 1);
Rgg = (gg_mid' * gg_mid- (sum_gg_mid'* sum_gg_mid) /L*Nt) / (L*Nt - 1);
Rgy=Rgg*A_1;
%自协方差以及互协方差矩阵生成,MMSE估计用
%也可以用LS或者OMP估计的信道结果产生自协方差以及互协方差矩阵,把它们移到下面并相应修改为h_LS或h_OMP即可
for a=1:loop
for b=1:length(snr)
y=awgn(y_no_noise,snr(b));
%接收信号
delta=var(y-y_no_noise);
%噪声方差
h_LS=A_1*y;
%LS时域估计
H_pilot_LS=F_pilot*h_LS;
%频域LS估计
H_carrier_LS=interp1(sequence,H_pilot_LS,[1:num_carrier]);
H_carrier_LS=H_carrier_LS.';
%频域插值得到所有频率的冲击响应
[ h_OMP,t2 ]=CS_OMP( y,A,K*Nt );
%OMP时域估计
H_pilot_OMP=F_pilot*h_OMP;
%频域OMP估计
H_carrier_OMP=interp1(sequence,H_pilot_OMP,[1:num_carrier]);
H_carrier_OMP=H_carrier_OMP.';
%频域插值得到所有频率的冲击响应
Ryy=(A *Rgy + delta * eye(num_pilot*Nt))
h_MMSE=Rgy *inv(Ryy)*(y);
%MMSE时域估计;
H_pilot_MMSE=F_pilot*h_MMSE;
%频域MMSE估计
H_carrier_MMSE=interp1(sequence,H_pilot_MMSE,[1:num_carrier]);
H_carrier_MMSE=H_carrier_MMSE.';
%频域插值得到所有频率的冲击响应
NMSE_LS(a,b)=mean(sqrt((H_carrier_LS-H_carrier).*conj(H_carrier_LS-H_carrier))/norm(H_carrier,2));
%LS归一化均方误差
NMSE_MMSE(a,b)=mean(sqrt((H_carrier_MMSE-H_carrier).*conj(H_carrier_MMSE-H_carrier))/norm(H_carrier,2));
%MMSE归一化均方误差
NMSE_OMP(a,b)=mean(sqrt((H_carrier_OMP-H_carrier).*conj(H_carrier_OMP-H_carrier))/norm(H_carrier,2));
%MMSE归一化均方误差
end
end
k_1=mean(NMSE_LS);
k_1=k_1(1);
NMSE_LS=mean(NMSE_LS);
NMSE_MMSE=mean(NMSE_MMSE);
NMSE_OMP=mean(NMSE_OMP);
semilogy(snr,NMSE_LS,'-r*',snr,NMSE_MMSE,'-b+',snr,NMSE_OMP,'-g^');
legend('LS','MMSE','OMP')
grid on
基于正交导频的MIMO-OFDM系统LS,MMSE,OMP仿真.zip
需积分: 49 64 浏览量
2019-11-29
11:23:04
上传
评论 11
收藏 51KB ZIP 举报
limingzhou0758
- 粉丝: 0
- 资源: 2