1.算法描述
在无线通信系统中,从发射端发射的信号,经过直射、反射、散射等路径到达接收端。在ofdm系统中,为了获取更好的性能,需要进行信道估计获取信道的状态信息。ofdm技术虽然可以通过添加循环前缀的方式抑制多径效应产生的符号间干扰,但是却对高速移动产生的多普勒效应极其敏感。典型的信道估计方法包括最小二乘法和最小均方误差法,然而在系统发射端和接收端的相对移动速度较快时,这两种方法性能受限,而且忽略了高速移动时无线信道在时延-多普勒域上的稀疏性。对于高速移动的快时变信道导频位置处的信道响应,可以采用基扩展模型对信道进行建模,将复杂的快时变信道的参数估计简化为对少量的基函数系数的估计,并且可以基于快时变信道的稀疏性,使用压缩感知技术估计基函数系数。最后根据导频位置的信道响应通过插值法得到数据位置的信道响应。但是,由于高速移动中多普勒效应产生的子载波间干扰,会使数据位置的信道响应描述不准确,从而影响系统性能。
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神经元相连,形成一个高度复杂高度灵活的动态网络。作为一门学科,生物神经网络主要研究人脑神经网络的结构、功能及其工作机制,意在探索人脑思维和智能活动的规律。人工神经网络是生物神经网络在某种简化意义下的技术复现,作为一门学科,它的主要任务是根据生物神经网络的原理和实际应用的需要建造实用的人工神经网络模型,设计相应的学习算法,模拟人脑的某种智能活动,然后在技术上实现出来用以解决实际问题。因此,生物神经网络主要研究智能的机理;人工神经网络主要研究智能机理的实现,两者相辅相成。
常用的信道估计算法比如LS/ML估计,LMMSE估计都可以用,只是形式上有点变化。值得一提的是,在某种程度上其信道估计比平衰落信道中的窄带MIMO要容易。因为导频在空域的正交使得我们仅需要将多对收发天线考虑成多个单对收发天线即可,也就是说可以将MIMO系统变为SISO系统来分析。系统模型的接收端原理图如图所示。即各个接收天线收到相应的OFDM符号后,先进行时频同步处理,然后去掉相应的CP,接着进行OFDM解调(FFT),最后根据信道估计的结果进行检测解码,恢复出接收比特流。
BP神经网络是一种具有一个输入层,一个或多个隐含层和一个输出层的多层网络。隐含层和输出层上的每个神经元都对应一个激发函数和一个阈值。每一层上的神经元都通过权重与其相邻层上的神经元相互连接。对于输入层上的神经元其阈值为零,其输出等于输入。图2为单隐含层的BP神经网络的一般结构。BP神经网络隐含层和输出层上的某神经元的输出由下式确定:
BP算法所采用的学习过程(即权值调整过程)由信息的前向传播和误差的反向传播组成。在前向传播过程中,每一层神经元的状态只影响到下一层神经元网络。如果输出层不能得到期望输出,就是实际输出值与期望输出值之间有误差,那么转入反向传播过程,将误差信号沿原来的连接通路返回,通过修改各层神经元的权值,逐次地向输入层传播去进行计算,再经过前向传播过程,这两个过程的反复运用,使得误差信号最小。BP神经网络的隐节点采用输入模式与权向量的内积作为激活函数的自变量,而激活函数采用Sigmoid函数。各调参数对BP网络的输出具有同等地位的影响,因此BP神经网络是对非线性映射的全局逼近。
RBF网络是一种三层前向网络,由输入到输出的映射是非线性的,而隐含层空间到输出空间的映射是线性的,从而大大加快了学习速度并避免局部极小问题。RBF网络结构如下图1所示。
RBF网络的基本思想是:用RBF作为隐单元的“基”构成隐含层空间,这样就可以将输入矢量直接映射到隐空间,而不需要通过权连接。当RBF的中心点确定以后,这种映射关系也就确定了。而隐含层空间到输出空间的映射是线性的,即网络的输出是隐单元输出的线性加权和,此处的权即为网络可调参数。其中,隐含层的作用是把向量从低维度的p映射到高维度的h,这样低维度线性不可分的情况到高维度就可以变得线性可分了,主要就是核函数的思想。这样,网络由输入到输出的映射是非线性的,而网络输出对可调参数而言却又是线性的。网络的权就可由线性方程组直接解出,从而大大加快学习速度并避免局部极小问题。RBF神经网络的隐节点采用输入模式与中心向量的距离(如欧式距离)作为函数的自变量,并使用径向基函数(如Gaussian函数)作为激活函数。神经元的输入离径向基函数中心越远,神经元的激活程度就越低(高斯函数)。RBF网络的输出与部分调参数有关,譬如,一个wij值只影响一个yi的输出(参考上面第二章网络输出),RBF神经网络因此具有“局部映射”特性。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
tt
%产生二进制随即序列
X = func_signal_gen(N_number,Carriers);
%QPSK调制
[X1,X_initial] = func_QPSK(X,N_number);
%导频
[pilot,training_symbols] = func_pilot(symbols_per_carrier,Np,interval,Carriers);
%串并
X2 = reshape(X1,symbols_per_carrier,Carriers);
%插入导频
[X3,signal] = func_pilot_insert(X2,pilot,Carriers,Np,training_symbols);
%IFFT
IFFT_modulation = zeros(symbols_per_carrier,IFFT_len);
IFFT_modulation(:,carriers) = X3;
X4 = ifft(IFFT_modulation,IFFT_len,2);
%加循环前缀
X6 = func_cp(X4,symbols_per_carrier,IFFT_len,Cps);
%并串
X7 = reshape(X6.',1,symbols_per_carrier*(IFFT_len+Cps));
%信道
Tx_data = func_multipath_channel(X7,Carriers,IF_multi);
%高斯白噪声
Error_ber = [];
Error_mse = [];
for snr_db = SNR
% RandStream.setDefaultStream(RandStream('mt19937ar','seed',tt));
rng(tt)
code_power = 0;
code_power = [norm(Tx_data)]^2/(length(Tx_data));
bit_power = code_power/bits_symbol;
noise_power = 10*log10((bit_power/(10^(snr_db/20))));
noise = wgn(1,length(Tx_data),noise_power,'complex');
%最后接收到的信号
Y7 = Tx_data + noise;
%串并变换
Y6 = reshape(Y7,IFFT_len+Cps,symbols_per_carrier).';
%去保护间隔
Y5 = func_cp_del(Y6,symbols_per_carrier,IFFT_len,Cps);
%FFT,傅立叶变换
Y4 = fft(Y5,IFFT_len,2);
Y3 = Y4(:,carriers);
%进行信道估计
if sel == 1
%实部
[HLs_real,Y2_real] = func_RBF_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
%虚部
[HLs_imag,Y2_imag] = func_RBF_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
end
if sel == 2
%实部
[HLs_real,Y2_real] = func_BP_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
%虚部
[HLs_imag,Y2_imag] = func_BP_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
end
Y1_real = Y2_real./repmat(HLs_real,1,Carriers);
Y1_imag = Y2_imag./repmat(HLs_imag,1,Carriers);
Y1 = Y1_real + sqrt(-1)*Y1_imag;
YY1 = reshape(Y1,N_number/bits_symbol,1);
%QPSK解调
[y_real1,y_image1,y_re1,y_im1] = func_deqpsk(YY1);
r01 = [];
r11 = [];
for k=1:length(y_re1);
r11 = [r11,[y_re1(k),y_im1(k)]];
end
dif_bit1 = (X_initial - r11);
ber_snr1=0;
for k=1:N_number;
if dif_bit1(k)~=0;
ber_snr1=ber_snr1+1;
end
end
Error_ber = [Error_ber,ber_snr1];
Error_mse = [Error_mse,mse(X_initial - r11)];
end
BERs(:,tt) = Error_ber./N_number;
MSEs(:,tt) = Error_mse;
end
Ber_avg = mean(BERs,2);
MSE_avg = mean(MSEs,2);