OFDM matlab源程序

更新时间:2024-03-24 13:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

%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)=Bw*(1+b) % spec=0; % end % end % end % end

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**********************************

本文来源:https://www.bwwdw.com/article/5878.html

Top