当前位置:首页 > OFDM - matlab源程序总结
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据
% r 降采样的抽取因子 % init 设定的初始值 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for i=1:length(din),
int1(i)=sum(din(1:i)); int2(i)=sum(int1(1:i)); end
data_diff=zeros(1,length(int2)/r); data_diff=int2(init:r:end);
data_1d=[data_diff,0];
diff1=[0,data_diff]-data_1d; diff1_1d=[diff1,0];
diff2=[0,diff1]-diff1_1d; dout=diff2(1:end-2);
% ************************end of file**********************************
%************************beginning of file***************************** %time_syn.m
%系统的定时同步
function time_syn(datai,dataq)
%通过前导结构的两个训练帧的延时自相关算法和本地 %互相关检测可以实现精确度非常高的定时同步。
global seq_num global dingshi global m_syn
if seq_num==1
for nc=1:length(datai)-64 %计算相关值 for m=1:32
m1_syn(m)=(datai(nc+m-1)+j*dataq(nc+m-1))*conj(datai(nc+m-1+16)+j*dataq(nc+m-1+16)); end
m2_syn(nc)=sum(m1_syn);
m_syn(nc)=abs(m2_syn(nc)); %自相关自相关判决函数 end
% figure
% plot(m_syn)
% xlabel('采样点索引号') % ylabel('自相关判决函数') elseif seq_num==2
local_seq=[ -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i ];
for nn=1:length(datai)-128 %计算相关值 (输入信号与本地信号互相关) for m=1:100
t1_syn(m)=(datai(nn+m-1)+j*dataq(nn+m-1))*conj(local_seq(m)); end
lolol(nn)=sum(t1_syn);
t_syn(nn)=abs(sum(t1_syn)); %输入信号与本地信号互相关判决函数 end
for ni=1:length(t_syn)
if t_syn(ni)>60
dingshi=find(t_syn(ni:ni+6)==max(t_syn(ni:ni+6)))+ni-1; break end end % figure
% plot(t_syn)
% xlabel('采样点索引号') % ylabel('互相关判决函数') end
% ************************end of file***********************************
%************************beginning of file***************************** %fre_syn.m
function dout=fre_syn(datai,dataq) %实现系统的频率同步
%频偏的估计范围由帧长度和循环间隔长度来决定。在 %本系统中,短训练序列的频偏估计范围为 (2000Hz);长训 %练序列频偏估计范围为250Hz,前一个有较大的纠偏范围,估 %计值得到的方差较大;后一个方法的纠偏范围较小,估计值得 %到的方差较小。频率跟踪可以用循环前后缀的周期重复性来完 %成,其频偏估计范围为125Hz。
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % datai 输入数据的实部 % dataq 输入数据的虚部 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
global seq_num global dingshi global m_syn
if seq_num==1
if m_syn(50)>10 for m=1:128
fre_back_tmp(m)=(datai(40+m-1)+j*dataq(40+m-1))*conj(datai(40+m-1+16)+j*dataq(40+m-1+16));
end
fre_back_sum=sum(fre_back_tmp);
fre_offset_tmp=-320*angle(fre_back_sum)/(2*pi*16); fre_offset=fre_offset_tmp/0.005; end
elseif seq_num==2 for m=1:128
fre_back_tmp(m)=(datai(dingshi+m-1)+j*dataq(dingshi+m-1))*conj(datai(dingshi+m-1+128)+j*dataq(dingshi+m-1+128)); end
fre_back_sum=sum(fre_back_tmp);
fre_offset_tmp=-320*angle(fre_back_sum)/(2*pi*128); fre_offset=fre_offset_tmp/0.005;
elseif seq_num>2 for m=1:48
fre_back_tmp(m)=(datai(dingshi+m)+j*dataq(dingshi+m))*conj(datai(dingshi+m+256)+j*dataq(dingshi+m+256)); end
fre_back_sum=sum(fre_back_tmp);
fre_offset_tmp=-320*angle(fre_back_sum)/(2*pi*256); fre_offset= fre_offset_tmp/0.005; end
dout=fre_offset;
% ************************end of file**********************************
%************************beginning of file***************************** %phase_comp.m
%实现OFDM符号的相位补偿
function dout=phase_comp(din)
%使用导频的相位信息来调整有效数据的偏移相位, %以实现正确的QPSK解调
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
qpsk_din=[din(1:8),din(10:17),din(19:26),din(28:35),din(37:44),din(46:53),din(54:61),din(63:70),din(72:79),din(81:88),din(90:97),din(99:106)];
共分享92篇相关文档