1.算法描述
在现代短波通信系统中,其信道一般具有频率多样性和频率选择性,因此在短波通信过程中,多径的传播将产生信号的符号干扰和衰落。和传统的频分复用相比,OFDM通信技术可以最大限度的增加频谱利用率,同时OFDM将高速传输数据进行串并转换,从而增加子载波的符号周期,最终将频率选择性衰落的信道转换为平衰落信道。因此,OFDM技术具有优良的抗多径能力,较高的频谱利用率,在短波通信中有着十分重要的应用。
OFDM系统模型的基本结构如下图所示:
由于OFDM系统对多普勒频偏和定时有着较为严格的要求,因此,载波同步和符号同步是OFDM系统中的一个重要模块。同步过程分为同步捕获阶段和同步跟踪节点,目前较为常见的同步捕获算法主要包括T.Schmidl&D.Cox算法,Minn算法,Park算法以及Landstrom算法。
T.Schmidl&D.Cox算法(简称SC算法)主要是通过两个OFDM符号作为训练序列进行时间和频率同步,SC算法的帧结构如下图所示:
Minn算法是在SC算法基础之上改进得到,常见的Minn算法主要有基于训练符号结构的SC改进算法以及基于滑动窗口法的SC改进算法。但是基于滑动窗口法的SC改进算法会产生较多的峰值,从而影响判决。因此,本章节采用基于训练符号结构的SC改进算法,其帧结构如下所示:
Park算法,其主要通过新构造的帧结构和定时度量函数来最大程度的加大相邻点定时度量函数的差别,从而保证估计得到的定时点和其他干扰定时度量值之间的差值最大化。Park算法的帧结构如下所示:
Landstrom同步算法是一种不需要借助辅助数据的同步捕获算法,该算法是基于Van de Beek算法改进得到,其主要通过导频和循环前缀进行同步捕获。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
%turbo编码参数
N = 512;
M = 167;
%FFT
fftlen = 512;
%每个SNR点上仿真若干次
for i=1:length(SNR_dB)
i
Error = 0;
err_all = 0;
for iii=1:nloop(i)
iii
%产生测试信号
msg = rand(Len*Nc/4,1)>=0.5;
%turbo编码
seridata1 = func_turbo_code(msg,N,M);
seridata = [seridata1,zeros(1,Len*Nc-length(seridata1))]';
%QPSK映射
[Qpsk0,Dqpsk_pilot,symbol_bit] = func_piQPSK_mod(seridata);
%变换为矩阵
Qpsk_matrix = reshape(Qpsk0,fftlen,Nc);
[Pilot_in,pilot_num,Pilot_seq,pilot_space] = func_insert_pilot(Dqpsk_pilot,Qpsk_matrix,pilot_type,T,TG);
Pilot_in = fft(Pilot_in);
%sub carrier mapping
Pilot_in = func_subcarrierMap(Pilot_in);
%IFFT transform,产生OFDM信号
ifft_out = ifft(Pilot_in);
%插入包含间隔
Guard_int = ceil(BWs/fftlen);
Guard_int_ofdm = func_guard_interval_insert(ifft_out,fftlen,Guard_int);
%将矩阵数据转换为串行进行输出
Guard_int_ofdm_out = reshape(Guard_int_ofdm,1,(fftlen+Guard_int)*(Nc+pilot_num));
%短波带宽信道,加入多径干扰
[Hm,Hmmatrix] = func_mychannels(Radius,Scale1,Scale2,Nh,Nv);
[passchan_ofdm_symbol] = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);
Rec_ofdm_symbol = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');
%开始接收
%加载同步带来的影响数据
load 单独各种同步算法测试\R2.mat
ERR = mean(err1,2);
Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));
Guard_int_remove = Guard_int_remove;
%FFT
fft_out = fft(Guard_int_remove);
%sub carrier demapping
fft_out = func_desubcarrierMap(fft_out);
fft_out = ifft(fft_out);
%信道估计
%lmmse
[Sig_Lrmmse,Hs] = func_lmmse_est(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10));
%解调
Dqpsk = func_pideMapping(Sig_Lrmmse,fftlen*Nc);
%turbo解码
Dqpsk_decode = [func_turbo_decode(2*Dqpsk(1:end-(Len*Nc-length(seridata1)))-1,N,M)]';
%计算误码率
err_num = Len*Nc/4-length(find(msg==Dqpsk_decode(1:Len*Nc/4)));
Error = Error + err_num*(1+5*ERR(i+10));
end
%计算误码率
err_all = err_all+Len*Nc/4;
Err_Rate(i) = Error/err_all/nloop(i);
end