目录
1.算法描述
2.仿真效果预览
3.MATLAB核心程序
4.完整MATLAB
信道估计器是接收机一个很重要的组成部分。在OFDM系统中,信道估计器的设计上要有两个问题:一是导频信息的选择,由于无线信道的时变特性,需要接收机不断对信道进行跟踪,因此导频信息也必须不断的传送: 二是既有较低的复杂度又有良好的导频跟踪能力的信道估计器的设计,在确定导频发送方式和信道估计准则条件下,寻找最佳的信道估计器结构。 **在实际设计中,导频信息的选择和最佳估计器的设计通常又是相互关联的,因为估计器的性能与导频信息的传输方式有关。
本课题,我们采用GRNN神经网络进行OFDM的信道估计。
GRNN基本原理如下:
GRNN,General Regression Neural Network,即广义回归神经网络,最早是由美国的Donald F.Specht教授于1991年提出的基于非线性的回归理论的人工神经网络模型[47,48]。GRNN广义回归神经网络具有较好的网络适应能力,从而使得神经网络能够更加方便的进行网络训练和学习。因此,GRNN在信号过程、控制决策系统结构分析等各个科学和工程领域得到了广泛的应用。GRNN广义回归神经网络以非参数核回归为基础,以样本数据作为后验概率验证条件并进行非参数估计,最后从训练样本中计算GRNN网络中因变量和自变量之间的关联密度函数,从而计算得到因变量相对自变量的回归值。GRNN广义回归神经网络最大的优势在于其方便的网络参数设置功能,整个神经网络只需要通过设置GRNN核函数中的光滑因子就可以调整GRNN网络的性能。
假设GRNN神经网络中的两个随机变量x和y,其联合概率密度函数为f (x ,y),且x的观测样本为X,即条件均值为:
对于未知的概率密度函数f (x, y),则可根据x和y的观测样本通过非参数估计得:
简化后可得:
为人工神经网络的最终输出表达式。通过公式3.15可知,GRNN神经网络的输出数据和训练样本的误差主要有平滑因子决定的,因此,GRNN神经网络具有非常简便的性能控制方式,只需通过调整平滑因子就可获得较好的性能。
matlab2022a仿真结果如下:
%以单天线方式产生测试信号
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);
%Step2:多径参数
[passchan_ofdm_symbol] = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);
%Step3:噪声信道
%大尺度衰落
receivepower = func_largefade(sendpower,d_,w_,f_);
snr = 10^(SNR_dB(i)/10);
sgma = sqrt(receivepower*timeval/(2*snr)/2);
Rec_ofdm_symbol = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');
Rec_ofdm_symbol = Rec_ofdm_symbol + normrnd(0,sgma,size(Rec_ofdm_symbol));
%%
%开始接收
Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));
%FFT
fft_out = fft(Guard_int_remove);
%sub carrier demapping
fft_out = func_desubcarrierMap(fft_out);
fft_out = ifft(fft_out);
%信道估计
%MLP dins, posxy, Dat_pilot,N_pilot, t1, t2, Noise,Cp
[Sig_Lrmmse,Hs] = func_mlp_est(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10),Guard_int);
%解调
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)));
err_num2 = mean((msg-Dqpsk_decode(1:Len*Nc/4)).^2);
Error = Error + err_num;
Mses = Mses + err_num2;
end
end
01_158m
V