function [ofdm chan] = MIMO_OFDM(ofdmIn,chanIn,M)
ofdm.Nb = 1e3;
ofdm.Nt = 2;
ofdm.Nr = 2;
ofdm.K = M;
ofdm.G = 1/4;
ofdm.Mod = 16;
ofdm.PSpace = 1;
chan.L = 6;
ofdm.ifDemodulateData = 1;
ofdm.ifDisplayResults = 1;
if nargin > 3
error('Only two arguments can be set as inputs')
elseif nargin == 3
% updating the set parameters
S = fieldnames(ofdmIn);
for nS = 1:length(S)
ofdm.(S{nS}) = ofdmIn.(S{nS});
end
S = fieldnames(chanIn);
for nS = 1:length(S)
chan.(S{nS}) = chanIn.(S{nS});
end
elseif nargin == 1
S = fieldnames(ofdmIn);
for nS = 1:length(S)
ofdm.(S{nS}) = ofdmIn.(S{nS});
end
end
ofdm.PPos = 1:(ofdm.PSpace+1):ofdm.K; % OFDM pilot positionss
ofdm.PL = length(ofdm.PPos); % Length of pilot subcarriers
ofdm.DPos = setxor(1:ofdm.K,ofdm.PPos); % OFDM data positions
ofdm.DL = length(ofdm.DPos); % Length of data subcarriers
ofdm.BER = 0; % set the BER to zero
chan.sigma = sqrt(10^(-0.1*chan.SNR_dB)); % noise power
temp = 0:ofdm.Mod-1; % possible symbols
temp = qammod(temp,ofdm.Mod); % modulated symbols
temp = abs(temp).^2; % power of each point in the constellation
temp = mean(temp); % average energy of the constellation
ofdm.ModNorm = 1/sqrt(temp); % normaliztion factor
%% Data generation
ofdm.d = randi(ofdm.Mod,ofdm.DL,ofdm.Nb,ofdm.Nt)-1;
%% data Modulation
ofdm.dMod = zeros(ofdm.K,ofdm.Nb,ofdm.Nt);
if ofdm.DL > 0
for nt = 1 : ofdm.Nt
ofdm.dMod(ofdm.DPos,:,nt) = ofdm.ModNorm*qammod(ofdm.d(:,:,nt),ofdm.Mod);
end
end
%% Pilot insertion
for nt = 1 : ofdm.Nt
ofdm.dMod(ofdm.PPos,:,nt) = repmat(exp(-sqrt(-1)*2*pi*(nt-1)*chan.L*(1:ofdm.PL).'/ofdm.PL),1,ofdm.Nb);
end
ofdm.pow = var(ofdm.dMod(:))+abs(mean(ofdm.dMod(:)))^2;
%% IFFT operation
ofdm.ifft = zeros(ofdm.K,ofdm.Nb,ofdm.Nt);
for nt = 1 : ofdm.Nt
ofdm.ifft(:,:,nt) = sqrt(ofdm.K)*ifft(ofdm.dMod(:,:,nt),ofdm.K);
end
%% Cyclic perfix
ofdm.ifftG = [ofdm.ifft(ofdm.K*(1-ofdm.G)+1:ofdm.K,:,:);ofdm.ifft];
%% Channel
chan.Coeff = 1/sqrt(2)*1/sqrt(chan.L)*(randn(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb)+sqrt(-1)*randn(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb));
if ofdm.K*ofdm.G < chan.L+1
error('Guard interval is shorter than channel length, and the system does not function properly')
end
ofdm.Y = zeros(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr);
for nb = 1 : ofdm.Nb
for nt=1:ofdm.Nt
for nr=1:ofdm.Nr
ofdm.Y(:,nb,nr) = ofdm.Y(:,nb,nr) + filter(squeeze(chan.Coeff(nt,nr,:,nb)),1,ofdm.ifftG(:,nb,nt));
end
end
end
ofdm.Y = ofdm.Y + chan.sigma*1/sqrt(2)*( randn(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr)+ sqrt(-1)*randn(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr) );
ofdm.fftG = ofdm.Y(ofdm.K*ofdm.G+1:ofdm.K*(1+ofdm.G),:,:);
ofdm.fft = zeros(ofdm.K,ofdm.Nb,ofdm.Nr);
for nr = 1 : ofdm.Nr
ofdm.fft(:,:,nr) = 1/sqrt(ofdm.K)*fft(ofdm.fftG(:,:,nr),ofdm.K);
end
F = dftmtx(ofdm.K);
F = F(:,1:chan.L);
chan.CoeffEst = zeros(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb);
for nb = 1 : ofdm.Nb
for nr = 1 : ofdm.Nr
chan.A = zeros(ofdm.PL,chan.L*ofdm.Nt);
for nt = 1 : ofdm.Nt
chan.A(:,(1:chan.L)+(nt-1)*chan.L) = diag(ofdm.dMod(ofdm.PPos,nb,nt))*F(ofdm.PPos,:);
end
ChanEst = pinv(chan.A)*ofdm.fft(ofdm.PPos,nb,nr);
for nt = 1 : ofdm.Nt
chan.CoeffEst(nt,nr,:,nb) = ChanEst((1:chan.L)+(nt-1)*chan.L);
end
end
end
chan.MSE_Simulation = var(chan.Coeff(:)-chan.CoeffEst(:));
chan.MSE_Theory = chan.sigma^2/ofdm.PL;
if ofdm.ifDisplayResults
disp(['MSE of channel estimation (theory) is : ',num2str(chan.MSE_Theory)])
disp(['MSE of channel estimation (simulation) is : ',num2str(chan.MSE_Simulation)])
end
if ofdm.ifDemodulateData == 1 && ofdm.DL > 0
% Building channel coefficients in frequency domain
chan.CoeffEstFreq = zeros(ofdm.K,ofdm.Nt,ofdm.Nr,ofdm.Nb);
for nb = 1 : ofdm.Nb
for nr = 1 : ofdm.Nr
for nt = 1 : ofdm.Nt
chan.CoeffEstFreq(:,nt,nr,nb) = F*squeeze(chan.CoeffEst(nt,nr,:,nb));
end
end
end
ofdm.H = chan.CoeffEstFreq(:,:,:,:);
ofdm.dDemod = zeros(ofdm.DL,ofdm.Nb,ofdm.Nt);
for nb = 1 : ofdm.Nb
for dl = 1 : ofdm.DL
ofdm.dDemod(dl,nb,:) = pinv(reshape(chan.CoeffEstFreq(ofdm.DPos(dl),:,:,nb),ofdm.Nt,ofdm.Nr)).' ... % ZF DETECTOR
*squeeze(ofdm.fft(ofdm.DPos(dl),nb,:));
end
end
% detection
ofdm.dEst = zeros(ofdm.DL,ofdm.Nb,ofdm.Nt);
for nt = 1 : ofdm.Nt
ofdm.dEst(:,:,nt) = qamdemod(1/ofdm.ModNorm * ofdm.dDemod(:,:,nt),ofdm.Mod);
end
% BER calculation
[~,ofdm.BER] = biterr(ofdm.d(:),ofdm.dEst(:),log2(ofdm.Mod));
if ofdm.ifDisplayResults
disp(['BER is = ',num2str(ofdm.BER)])
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
基于matlab的MIMO-OFDM通信系统mse性能曲线仿真,对比64个子载波和256个子载波的性能+代码仿真操作视频

共3个文件
m:2个
avi:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
1.领域:matlab,MIMO-OFDM通信系统算法 2.内容:基于matlab的MIMO-OFDM通信系统mse性能曲线仿真,对比64个子载波和256个子载波的性能+代码仿真操作视频 3.用处:用于MIMO-OFDM通信系统算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab2021a或者更高版本测试,运行里面的Runme_.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前文件夹窗口必须是当前工程所在路径。 具体可观看提供的操作录像视频跟着操作。
资源推荐
资源详情
资源评论






















收起资源包目录





共 3 条
- 1
资源评论

- m0_748128552023-10-20怎么能有这么好的资源!只能用感激涕零来形容TAT...
- ll_zhao20232023-08-16支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~
- m0_627328552023-04-10支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~


fpga和matlab
- 粉丝: 14w+
- 资源: 2447
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
