OFDM matlab源程序
更新时间:2024-03-24 13:24:01 阅读量: 综合文库 文档下载
- ofdm是什么的简称推荐度:
- 相关推荐
%main_OFDM.m
%一个相对完整的OFDM通信系统的仿真设计,包括编码,调制,IFFT, %上下变频,高斯信道建模,FFT,PAPR抑制,各种同步,解调和解码等模 %块,并统括系统性能的仿真验证了系统设计的可靠性。
clear all close all clc
%++++++++++++++++++++++++++全局变量++++++++++++++++++++++++++++++ % seq_num 表示当前帧是第几帧 % count_dds_up 上变频处的控制字的累加
% count_dds_down 下变频处的控制字的累加(整整) % count_dds_down_tmp 下变频处的控制字的累加(小数) % dingshi 定时同步的定位
% m_syn 记录定时同步中的自相关平台 global seq_num global count_dds_up global count_dds_down
global count_dds_down_tmp global dingshi global m_syn
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% SNR_Pre 设定用于仿真的信噪比的初值 % interval_SNR 设定用于仿真的信噪比间隔
% frame_num 每一个信噪比下仿真的数据帧数 % err_int_final 用于计算每帧出现的误比特数
% fwc_down 设定的接收机初始载波频率控制字
% fre_offset 设定接收机初始载波频率偏移调整量(单位为Hz) % k0 每次进入卷积编码器的信息比特数 % G 卷积编码的生成矩阵 SNR_Pre=-5; interval_SNR=1;
for SNR_System=SNR_Pre:interval_SNR:5
frame_num=152; dingshi=250; err_int_final=0; fwc_down=16.050; fre_offset=0; k0=1;
G=[1 0 1 1 0 1 1;1 1 1 1 0 0 1 ];
disp('--------------start-------------------');
for seq_num=1:frame_num, %frame_num 帧数
%+++++++++++++++++++++++以下为输入数据部分+++++++++++++++++++++++ datain=randint(1,90);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++以下为信道卷积编码部分+++++++++++++++++++++ encodeDATA=cnv_encd(G,k0,datain);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++信道交织编码+++++++++++++++++++++++++ interlacedata=interlacecode(encodeDATA,8,24);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++以下为QPSK调制部分+++++++++++++++++++++ QPSKdata=qpsk(interlacedata);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++生成训练序列+++++++++++++++++++++++++ if seq_num<3
trainsp_temp=seq_train(); end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++++插入导频++++++++++++++++++++++++++++ PILOT=(1+j);
m_QPSKdata=QPSKdata;
data2fft_temp=[m_QPSKdata(1:8),PILOT,m_QPSKdata(9:16),PILOT,m_QPSKdata(17:24),PILOT,m_QPSKdata(25:32),PILOT,m_QPSKdata(33:40),PILOT,m_QPSKdata(41:48),m_QPSKdata(49:56),PILOT,m_QPSKdata(57:64),PILOT,m_QPSKdata(65:72),PILOT,m_QPSKdata(73:80),PILOT,m_QPSKdata(81:88),PILOT,m_QPSKdata(89:end)];
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
trainsp_temp2=[trainsp_temp,zeros(1,128)];
trainsp=[trainsp_temp2(65:256),trainsp_temp2(1:64)];
%++++++++++++++++++++++++++降PAPR矩阵变换++++++++++++++++++++++++ matix_data=nyquistimp_PS();
matrix_mult=data2fft_temp*matix_data;
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
data2fft2=[matrix_mult(65:128),zeros(1,128),matrix_mult(1:64)];
%++++++++++++++++++++++++++++ifft运算+++++++++++++++++++++++++++ if seq_num==1 ifftin=trainsp; elseif seq_num==2 ifftin=trainsp; else
ifftin=data2fft2; end
IFFTdata=fft_my(conj(ifftin)/256); IFFTdata=conj(IFFTdata); % figure
% plot(real(IFFTdata)) % xlabel('realIFFTdata') % figure
% plot(imag(IFFTdata)) % xlabel('imagIFFTdata')
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++以下为插入循环前后缀,2倍升采样+++++++++++++++ data2fir=add_CYC_upsample(IFFTdata,2);
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% +++++++++++++++++++++++++fir低通滤波++++++++++++++++++++++++++ guiyi_a=[0.0017216 0.010162 0.025512 0.028801 -0.0059219 -0.060115 -0.0496 0.091431 0.29636 0.3956 0.29636 0.091431 -0.0496 -0.060115 -0.0059219 0.028801 0.025512 0.010162 0.0017216 ];
%抽样截止频率为128kHZ,通带截止频率为20kHZ,阻带截止频率为40kHZ,带内纹波动小于1dB,带外衰减100dB
txFIRdatai=filter(guiyi_a,1,real(data2fir)); txFIRdataq=filter(guiyi_a,1,imag(data2fir));
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++发射机cic滤波++++++++++++++++++++++++++ CICidatai=cic_inter(txFIRdatai,20); CICidataq=cic_inter(txFIRdataq,20);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++++上变频++++++++++++++++++++++++++++ fwc_up=16; %控制字可以选择 DUCdata=up_convert_ofdm(fwc_up,CICidatai,CICidataq);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++高斯白噪声信道++++++++++++++++++++++++ [DUCdata,datamax]=guiyi_DUCdata(DUCdata); awgn_data=awgn(DUCdata,SNR_System);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%*****************************接受机*****************************
%+++++++++++++++++++++++++++++下变频+++++++++++++++++++++++++++++ DUCdata_tmp=awgn_data;
fwc_down=fwc_down+(fre_offset*128/2560000); r_fre_offset=2560000*((fwc_down-fwc_up)/128);
[DDCdatai,DDCdataq]=down_convert_ofdm(fwc_down,DUCdata_tmp);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++接收机cic滤波+++++++++++++++++++++++++ CICddatai=cic_deci(DDCdatai,40,40); CICddataq=cic_deci(DDCdataq,40,40);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++++fir低通滤波++++++++++++++++++++++++ guiyi_b=[ 0.019527 -0.03934 0.049055 -0.018102 -0.1003 0.5944 0.5944 -0.1003 -0.018102 0.049055 -0.03934 0.019527];
%抽样截止频率为64kHZ,通带截止频率为20kHZ,阻带截止频率为30kHZ,带内纹波动小于1dB,带外衰减60dB
rxFIRdatai=filter(guiyi_b,1,CICddatai); rxFIRdataq=filter(guiyi_b,1,CICddataq);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++++++量化++++++++++++++++++++++++++++ q_rxFIRdatai=sign(rxFIRdatai); q_rxFIRdataq=sign(rxFIRdataq);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++++定时同步检测++++++++++++++++++++++++ if seq_num<3
time_syn(q_rxFIRdatai,q_rxFIRdataq); end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++++频率同步+++++++++++++++++++++++++++ fre_offset=fre_syn(rxFIRdatai,rxFIRdataq);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++++fft运算+++++++++++++++++++++++++++ if seq_num>2
seq_num-2
fftw=32+dingshi;
rxFIRdata_syn=rxFIRdatai(fftw:fftw+255)+j*rxFIRdataq(fftw:fftw+255); FFTdata=fft_my(rxFIRdata_syn);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++降PAPR逆矩阵变换++++++++++++++++++++++ fftdata_reg=[FFTdata(193:256),FFTdata(1:64)]; dematrix_data=fftdata_reg*pinv(matix_data);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++++相位补偿+++++++++++++++++++++++++++ rx_qpsk_din_th=phase_comp(dematrix_data);
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++++QPSK解调部分++++++++++++++++++++++++ % figure
% plot(rx_qpsk_din_th,'.') % xlabel('星座图')
datatemp4=deqpsk(rx_qpsk_din_th); datatemp4=sign(datatemp4); for m=1:192
if datatemp4(m)==-1 datatemp4(m)=1; elseif datatemp4(m)==1 datatemp4(m)=0; end end
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++信道解交织++++++++++++++++++++++++++++ interdout=interlacedecode(datatemp4,8,24);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++以下为viterbi译码部分++++++++++++++++++++++ decodeDATA=viterbi(G,k0,interdout);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++误比特统计++++++++++++++++++++++++++++ err_final=sum(abs(decodeDATA-datain)) err_int_final=err_int_final+err_final end end
disp('------------------------------------------------------');
SNR_System
err_rate_final((SNR_System-SNR_Pre)./interval_SNR+1)=err_int_final/(90*(frame_num-2)) disp('------------------------------------------------------'); end
disp('--------------end-------------------');
SNR_System=SNR_Pre:interval_SNR:5; figure
semilogy(SNR_System,err_rate_final,'b-*'); xlabel('信噪比/dB') ylabel('误码率') axis([-5,5,0,1]) grid on
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%************************beginning of file***************************** %cnv_encd.m
%卷积码编码程序
function output=cnv_encd(G,k0,input)
% cnv_encd(G,k0,input),k0 是每一时钟周期输入编码器的 bit 数,
% G 是决定输入序列的生成矩阵,它有 n0 行 L*k0 列 n0 是输出 bit 数, % 参数 n0 和 L 由生成矩阵 G 导出,L 是约束长度。L 之所以叫约束长度 % 是因为编码器在每一时刻里输出序列不但与当前输入序列有关, % 而且还与编码器的状态有关,这个状态是由编码器的前(L-1)k0。 % 个输入决定的,通常卷积码表示为(n0,k0,m),m=(L-1)*k0 是编码 % 器中的编码存贮个数,也就是分为 L-1 段,每段 k0 个
% 有些人将 m=L*k0 定义为约束长度,有的人定义为 m=(L-1)*k0 % 查看是否需要补 0,输入 input 必须是 k0 的整数部
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % G 决定输入序列的生成矩阵
% k0 每一时钟周期输入编码器的 bit 数 % input 输入数据 % output 输入数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if rem(length(input),k0)>0
input=[input,zeros(size(1:k0-rem(length(input),k0)))]; end
n=length(input)/k0;
% 检查生成矩阵 G 的维数是否和 k0 一致
if rem(size(G,2),k0)>0
error('Error,G is not of the right size.') end
% 得到约束长度 L 和输出比特数 n0 L=size(G,2)/k0; n0=size(G,1);
% 在信息前后加 0,使存贮器归 0,加 0 个数为(L-1)*k0 个 u=[zeros(size(1:(L-1)*k0)),input,zeros(size(1:(L-1)*k0))];
% 得到 uu 矩阵,它的各列是编码器各个存贮器在各时钟周期的内容 u1=u(L*k0:-1:1);
%将加 0 后的输入序列按每组 L*k0 个分组,分组是按 k0 比特增加 %从 1 到 L*k0 比特为第一组,从 1+k0 到 L*k0+k0 为第二组,。。。。, %并将分组按倒序排列。 for i=1:n+L-2
u1=[u1,u((i+L)*k0:-1:i*k0+1)]; end
uu=reshape(u1,L*k0,n+L-1);
% 得到输出,输出由生成矩阵 G*uu 得到 output=reshape(rem(G*uu,2),1,n0*(L+n-1));
% ************************end of file***********************************
%************************beginning of file***************************** %interlacecode.m
function dout=interlacecode(din,m,n) %实现信道的交织编码
%din为输入交织编码器的数据,m,n分别为交织器的行列值
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据
% m 交织器的行值 % n 交织器的列值 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for j=1:m
temp(j,:)=din(j*n-(n-1):j*n); end
dout_temp=reshape(temp,1,length(din)); dout=dout_temp(1:end);
%************************end of file**********************************
%************************beginning of file***************************** %qpsk.m
%QPSK调制映射
function dout=qpsk(din)
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
din2=1-2*din;
din_temp=reshape(din2,2,length(din)/2); for i=1:length(din)/2,
dout(i)=din_temp(1,i)+j*din_temp(2,i); end
% ************************end of file***********************************
%************************beginning of file***************************** %seq_train.m
%生成用于同步的训练符号 function dout=seq_train()
%第一帧产生短训练序列,第二帧产生长训练序列 %每个短训练符号由16个子载波组成,短训练序列 %是由伪随机序列经过数字调制后插0后,再经过 %IFFT之后得到的。具体过程如下:首先采用抽头 %系数为[1 0 0 1 ]的4级移位寄存器产生长度为
的伪随机序列之后末尾补0,经过QPSK调制之 %后的伪随机序列只在16的整数倍位置上出现,其 %余的位置补0,产生长度为128的序列,此序列再 %补128个0经过数据搬移后做256点的IFFT变换就 %得到16个以16为循环的训练序列,经过加循环前 %后缀就会产生20个相同的短训练序列。长训练序 %列的产生同短训练序列。
global seq_num
if seq_num==1
fbconnection=[1 0 0 1];
QPSKdata_pn=[m_sequence(fbconnection),0]; QPSKdata_pn=qpsk(QPSKdata_pn); elseif seq_num==2
fbconnection=[1 0 0 0 0 0 1];
QPSKdata_pn=[m_sequence(fbconnection),0]; QPSKdata_pn=qpsk(QPSKdata_pn); end
countmod=0; for k=1:128
if seq_num==1
if mod(k-1,16)==0 %生成16位循环的短训练符号 countmod=countmod+1;
trainsp_temp(k)=QPSKdata_pn(countmod); else
trainsp_temp(k)=0; end
elseif seq_num==2 if mod(k-1,2)==0
countmod=countmod+1;
trainsp_temp(k)=QPSKdata_pn(countmod); else
trainsp_temp(k)=0; end end end
dout=trainsp_temp;
% ************************end of file***********************************
%************************beginning of file***************************** %m_sequence.m
%用线性移位寄存器产生m序列
function [mseq]= m_sequence(fbconnection);
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % fbconnection 线性移位寄存器的系数 % mseq 生成的m序列
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
n = length(fbconnection); N = 2^n-1;
register = [zeros(1,n - 1) 1];%定义移位寄存器的初始状态 mseq(1)= register(n); for i = 2:N
newregister(1)= mod(sum(fbconnection.*register),2);
for j = 2:n,
newregister(j)= register(j-1); end;
register = newregister; mseq(i) = register(n); end
% ************************end of file**********************************
%************************beginning of file***************************** %nyquistimp_PS.m
%使用改进的Nyquist脉冲实现OFDM信号的PAPR抑制 function dout=nyquistimp_PS()
%改进的Nyquist脉冲整形方法能够显著改善OFDM信 %号的PAPR分布;该方法实现简单,和PTS和SLM相比 %不需迭代计算多个IFFT操作,不需传送边带信息, %不会引起信号的畸变;通用性强,可以调整滚降 %系数以适应任何子载波数的通信系统。当然, %Nyquist脉冲成形的方法由于扩展了频谱,一定程 % 度上降低了频谱利用率。
%creat a matrix to shape the subcarries. %the spectrum of the pulse is as follows: % if abs(f)<=Bw*(1-b) % spec=1;
% else if (abs(f)>Bw*(1-b))&(abs(f)<=Bw) % spec=exp(aa.*(Bw.*(1-b)-abs(f)));
% else if (abs(f)>Bw)&(abs(f)
N=106; L=11; b=0.22;
% N=84; % L=22; % b=0.5;
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % fwc_down 下变频处的频率控制字 % din 输入数据
% douti 输出数据的实部 % doutq 输出数据的虚部
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
global seq_num global count_dds_down
global count_dds_down_tmp
for mkd=1:length(din)
if (seq_num==1) & (mkd==1) count_dds_down=0;
count_dds_down_tmp=0; else
count_dds_down=round(count_dds_down_tmp+fwc_down); count_dds_down_tmp=count_dds_down_tmp+fwc_down; if count_dds_down>=128
count_dds_down=count_dds_down-128;
count_dds_down_tmp=count_dds_down_tmp-128; end end
[up_sin_d,up_cos_d]=ram_sin(count_dds_down); up_sin_td(mkd)=up_sin_d; up_cos_td(mkd)=up_cos_d;
DDCdatai(mkd)=din(mkd)*up_cos_td(mkd); DDCdataq(mkd)=-din(mkd)*up_sin_td(mkd); end
douti=DDCdatai; doutq=DDCdataq;
% ************************end of file**********************************
%************************beginning of file***************************** %cic_deci.m
%接收机的CIC滤波器设计 function dout=cic_deci(din,r,init)
%抽取CIC滤波器通过降采样实现
%+++++++++++++++++++++++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)];
pilot=[din(9),din(18),din(27),din(36),din(45),din(62),din(71),din(80),din(89),din(98)]; ang_offset=angle(sum((1-j)*pilot));
% end % if x==2;
% distance==1.0458; % end % case 1 % if x==0
% distance==2; % end % if x==1
% distance=0.0458; % end % if x==2
% distance=1.0458; % end
% otherwise, % break; % end
% ************************end of file**********************************
正在阅读:
OFDM matlab源程序03-24
PS流光字制作03-18
英语口译笔记法实战指导09-02
以顾客为中心的价值营销10-05
纬地横断面设计(平距、高差输入)10-24
财产险行业研究报告:东北证券-财产险行业2010年4季度投资策略:被忽视的财险公司投资价值-10092706-01
CT显像在鼻咽癌临床诊断中的效果研究05-24
手机通过电脑上网,电脑变WIFI02-09
spread 用法11-30
- 统一多民族国家的建立和巩固测试题(解析版)
- 高中物理-电表的改装测试题
- 题库
- 2019-2020年语文版语文一年级上课文11 静夜思课后练习第三十九篇
- C#大作业学生成绩管理系统 - 图文
- 河北省石家庄市2013届高中毕业班第二次模拟考试试题及答案(word
- 河南工业职业技术学院-成都农业科技职业学院 - 图文
- 初中八年级信息技术教学设计全集苏教版
- MITEL调度系统基本使用及维护
- 国际货币体系概述习题与答案
- 2003年福建省会计从业资格考试《会计基础》试题及答案
- 西北师范大学2010年全日制专业学位硕士研究生招生专业目录
- 浅谈在小学音乐教学中如何提高学生的审美能力
- 高考理数试题解析(全国卷课标版)WORD版-数学 - 图文
- 中西餐厅规章制度
- (高一下化学期末20份合集)苏州市重点中学2019届高一下学期化学
- 最新鲁教版九年级上册化学精品教案-6.2化石燃料的利用
- 环境监测知识理论试题及答案
- 甲醛,氨盲样作业指导
- 2015-2020年中国港口码头市场供需趋势预测及投资战略分析报告 -