💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
🔊博主简介:985研究生,Matlab领域科研开发者;
🚅座右铭:行百里者,半于九十。
🏆代码获取方式:
CSDN Matlab武动乾坤—代码获取方式
更多Matlab信号处理仿真内容点击👇
①Matlab信号处理(进阶版)
⛳️关注CSDN Matlab武动乾坤,更多资源等你来!!
⛄一、平方根无迹卡尔曼滤波SR-UKF
1 数字预失真系统的状态方程和观测方程
为了改善卡尔曼滤波处理非线性问题的效果, Julier等人提出了基于无迹 (Unscented) 变换的UKF方法[5]。该方法在处理状态方程和观测方程时, 首先进行无迹变换, 然后使用无迹变换后的变量进行卡尔曼滤波估计, 以减小估计的误差。UKF采用了卡尔曼线性滤波框架, 采样形式为确定性采样, 其采样的粒子点 (Sigma点) 个数很少, 具体个数由所选择的采样策略决定, 最常用的是2L+1个Sigma点的对称采样。
UKF相对于其它滤波算法如EKF、PF等在性能和运算量上具有整体优势。它实质是利用了加权统计回归技术来解决此类非线性问题, 即先利用其先验分布生成一组确定性的采样点来获得系统的相关统计量, 再用线性回归变换后的Sigma点表示状态的后验分布。UKF算法线性化误差小, 不需要模型的具体解析表达形式, 因而更加易于实现。
在UKF-DPD算法中, 待求解的未知参量是预失真器的系数, 因此它作为系统的状态变量w=[w1, w2, …, wL]。在相邻两个时刻, w的数值基本不变, 只有较小的扰动, 因此系统状态方程为
wk+1=wk+qk (3)
式中, qk为1×L的向量, 代表系统的状态噪声, 它与系统的收敛性能密切相关。
系统的观测方程为
yk=H (xk, wk) +rk (4)
式中, xk代表数字预失真器的输入信号, yk代表功率放大器的输出信号, rk代表系统的观测噪声, H () 代表了预失真系统和功率放大器系统的非线性及记忆效应。
2 改进的SR-UKF滤波算法
SR-UKF是UKF算法的一种改进[9]。对于普通的UKF算法, 迭代过程中输出信号yk的方差Py通常为非负定阵, 但由于迭代中计算误差等因素的影响, 会导致Py负定或不对称, 使滤波器发散, 影响了滤波算法的稳定性。SR-UKF算法利用Cholesky分解得到Py的平方根矩阵Sy, 用Sy来代替Py进行递推计算可以保证Py的非负定性和数值的稳定性, 实现有效滤波。
标准SR-UKF考虑的是状态方程与观测方程均为非线性的情况, 在状态方程更新阶段状态变量和误差协方差阵的预测都基于无迹变换来实现, 即由k-1时刻的状态估计值和估计误差协方差阵来产生Sigma点, 所得采样点经状态方程的传播后生成更新采样点, 然后根据更新采样点和相应的权值来计算状态变量的预测值和预测误差协方差阵。从式 (3) 可以看出, 数字预失真系统的状态方程为线性方程, 而只有观测方程为非线性方程。针对这一特点, 可以考虑在状态方程的更新阶段采用标准SR-KF算法来实现, 然后利用所求得的预测值和预测误差协方差阵来构造采样Sigma点, 代入观测方程, 而后续的观测方程更新与SR-UKF滤波算法一致。
改进的SR-UKF算法大大提升了运算效率, 同时又保持了平方根滤波算法高可靠性和高精度的特点, 从而可以获得可靠的预失真系数。
本文中基于UKF的DPD算法的详细步骤如下所述, 其中矩阵SQ, k∈RL×L 、SR, k∈R1×1 代表时刻k时的状态和观测噪声平方根矩阵, 其满足
⛄二、部分源代码
function main(flag)
clc;
clear;
close all;
if(nargin < 1)
file = './data/filter_in.txt';
else
file = './data/simulation.txt';
end
%% get Measurements
[raIn, xyIn, time, n] = getMeasure(file);
raOut = zeros(size(raIn));
xyOut = zeros(size(xyIn));
%% initialize srukf structure
srukf.X = xyIn(:,1);
srukf.L = size(srukf.X, 1);
srukf.O = 3;
%srukf.S = eye(srukf.L);
srukf.S = chol(diag([0.6, 0.9, 0.1, 0.4, 0.3, 0.07]));
srukf.Qs = chol(diag([0.2, 0.02, 0.002, 0.2, 0.02, 0.002]));
srukf.Rs = chol(diag([0.5, 0.00087, 0.5]));
srukf.alpha = 0.1;
srukf.beta = 2.0;
srukf.kappa = 0;
srukf.time = 0.0;
srukf.errCnt = 0;
srukf.f = @srukf_f_func;
srukf.h = @srukf_h_func;
[srukf.Wm,srukf.Wc] = srukf_ut_weights(srukf.L,srukf.alpha, srukf.beta, srukf.kappa);
%% filtering
hasError = 0;
for i = 1 : n
[Xpre, Spre, sigmax] = srukf_predict( ....
srukf.X,...
srukf.S,...
srukf.f,...
srukf.Qs,...
time(i) - srukf.time,...
srukf.Wm,...
srukf.Wc,...
srukf.alpha,...
srukf.beta,...
srukf.kappa);
raPre = srukf.h(Xpre);
error = abs(raPre - raIn(:,i));
if( error(1) > 2 || error(2) > 3*pi/180)
srukf.errCnt = srukf.errCnt + 1;
hasError = 1;
else
hasError = 0;
srukf.errCnt = 0;
end
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2019b
2 参考文献
[1]宋勇,胡波,李在清.基于平方根无迹卡尔曼滤波的数字预失真算法[J]. 电讯技术. 2011,51(11)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除