1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Y5qXm5xy
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
OFDM-IM是一种多载波索引调制技术,其在信号的频域加入了子载波块的功能,将多个子载波组合成一个子载波块,一个子载波块作为一个调制单元。每次发送过程中,只选择子载波块中的一个或者部分子载波进行激活并发送信息,其功能类似于基于频域的空间索引调制随机数。OFDM-IM技术和传统的OFDM技术不同之处在于其在调制阶段,加入了索引调制步骤,根据索引调制比特信息,通过映射关系表,选择子载波进行激活并发送相应的比特数据,而未被选择的子载波则处于静默状态。这些索引调制比特数据同时补偿未被激活的静默子载波产生的频谱利用率低的问题。
4.部分源码
%子块
G = 4; %2个子载波作为一个块
Nlen = 15000;%数据仿真长度
Ncp = 8;%插入CP长度
Tdat0 = floor(rand(1,Nlen*Nsub)*2);
%产生索引比特
index = floor(rand(1,Nlen*Nsub/2)*2);
Tdat = reshape(Tdat0,[1,Nlen*Nsub]);
%Modulate,下面几行都是调制
Dat_Qam = reshape(Tdat,2,Nlen*Nsub/2).';
Dat_Qam2 = bi2de(Dat_Qam,2,'left-msb');
Mod_Table = [-1-i -1+i 1-i 1+i];%
SymQAM = Mod_Table(Dat_Qam2+1);
XSymQAM = conj([reshape(SymQAM,[G,length(SymQAM)/G])]');
Xindex = [reshape(index,[G,length(SymQAM)/G])]';
X2 = zeros(size(Xindex,1),2*size(Xindex,2));
for jj=1:size(Xindex,1)
%选择前面4个作为索引比特
IMtable = Xindex(jj,:);
S = XSymQAM(jj,:);
for j = 1:length(S)
if IMtable(j) == 1
X2(jj,2*j-1) = S(j);
X2(jj,2*j) = 0;
else
X2(jj,2*j-1) = 0;
X2(jj,2*j) = S(j);
end
end
end
X3 = [reshape(conj(X2'),[1,size(X2,1)*size(X2,2)])];
%IFFT变换
dat_ifft0= ifft(X3);
% %Add cyclic prefix,加入循环间隔
dat_ifft1_cp3= [dat_ifft0(1:Ncp),dat_ifft0];
%上变频
ff = 5e7;
dat_ifft1_cp3 = dat_ifft1_cp3.*exp(sqrt(-1)*2*pi*ff*([1:length(dat_ifft1_cp3)]));
% Add the AWGN,加入高斯白噪声
%channel,定一个多径信道
H_channel2 = dat_ifft1_cp3;
Ch = [1 1/16];
H_channel3 = filter(Ch,1,H_channel2);
snr = SNR + 10*log10(log2(2));
dat_ifft1_cp3 = awgn(H_channel2,snr,'measured');
%下变频
dat_ifft1_cp3 = dat_ifft1_cp3.*exp(-sqrt(-1)*2*pi*ff*[1:length(dat_ifft1_cp3)]);
%remove,删除循环间隔
dat_ifft1_cp3(1:Ncp)=[];
dat_fft1 = fft(dat_ifft1_cp3);
dat_fft1b = conj([reshape(dat_fft1,[2*G,length(dat_fft1)/G/2])]');
%提取索引位置和数据
IMdatas=[];
IMindxs=[];
for jj=1:size(Xindex,1)
tmps = dat_fft1b(jj,:);
IMdata = [];
IMindx = [];
for j = 1:length(tmps)/2
data = tmps(2*j-1:2*j);
if abs(data(1))>=abs(data(2))%01
IMdata(j) = [data(1)];
IMindx(j) = [1];
end
if abs(data(1))<=abs(data(2))%10
IMdata(j) = [data(2)];
IMindx(j) = [0];
end
end
IMdatas(jj,:)=IMdata;
IMindxs(jj,:)=IMindx;
end
%Tdat0 = floor(rand(1,Nlen*Nsub)*2);
IMdatas_rec = reshape(conj(IMdatas'),[1,size(IMdatas,1)*size(IMdatas,2)]);
datarec = zeros(size(IMdatas_rec));
for ii = 1:length(IMdatas_rec)
Real = real(IMdatas_rec(ii));
Imag = imag(IMdatas_rec(ii));
if Real>0 & Imag>0
datarec(ii)=3;
end
if Real>0 & Imag<=0
datarec(ii)=2;
end
if Real<=0 & Imag>0
datarec(ii)=1;
end
if Real<=0 & Imag<=0
datarec(ii)=0;
end
end
datarec=datarec';
%index = floor(rand(1,Nlen*Nsub/2)*2);
index_rec = reshape(IMindxs',[1,size(IMindxs,1)*size(IMindxs,2)]);%解调出索引位置信息
01_172m