python的白噪声检验 白噪声检验的原假设

您所在的位置:网站首页 白噪音检验的原假设是 python的白噪声检验 白噪声检验的原假设

python的白噪声检验 白噪声检验的原假设

2024-07-11 05:40| 来源: 网络整理| 查看: 265

1、kalman滤波器:最优化自回归数据处理算法。

自回归模型:根据前一次的表现,来预测接下来的情况,他们存在一种线性关系。

2、Kalman滤波器的三个重要假设:a.被建模的系统是线性关系。b.影响测量的噪声属于白噪声(噪声与时间无关)。c.噪声的本质是高斯分布(即正态分布)。

a假设的意思是k时刻的系统状态(state)可以用某个矩阵(转换矩阵F)与k-1时刻的系统状态的乘积表示。b.c假设说明噪声是高斯白噪声,即噪声与时间无关,且只用均值和协方差就可以为幅值建模。

高斯白噪声中的高斯是指概率分布是正态函数,而白噪声是指它的二阶矩不相关,一阶矩为常数,是指先后信号在时间上不相关性。

那么,一阶矩和二阶矩分别是指什么呢?

一阶矩:均值,    二阶矩:方差,    三阶矩:偏度,     四阶矩:峰度

3、kalman的5个公式:

(1)x_k  = F  x_k-1   +  B U_k   +   w_k

(2)P_k(-)  =  F  P_k-1   F(T) + Q_k-1 // 获得误差协方差

(3)K_k = P_k(-)  H_k(-)  ( H_k  P_k(-)   H_k(T)  +  R_k)(-1)

(4)x_k =   x_k(-)  + K_k  (   z_k(-)  - H_k  x_k(-)  )

(5)P_k = (  I -  K_k  H_k ) P_k(-)

z_k = H_k  x_k + v_k

x_k是一个现在状态元素的n维向量,即实际量(state vector dimensions)

F是状态转换矩阵(state transition matrix),对应x_k的维度,为一个n*n的矩阵

U_k的作用是允许外部控制施加于系统,由表示输入控制的c维向量组成

B是一个联系输入控制和状态改变的n*c矩阵。

w_k为过程噪声(process noise),w_k的元素具有高斯分布(正态分布)N(0, 方差), 那么,协方差矩阵Q(process_noise_cov)为n*n矩阵

z_k为测量值,m维向量(measurement vectore dismensions),是x_k加上了测量噪声

H_k是m*n的矩阵,为测量系统的参数

v_k是测量噪声,具有高斯分布(正态分布)N(0, 方差), 那么,测量噪声协方差矩阵R(measurement_noise_cov)为m*m矩阵

P_k是误差协方差

K_k 为卡尔曼增益

x_k(-) 为预测值

x_k =   x_k(-)  + K_k  (   z_k(-)  - H_k  x_k(-)  )该公式说明了实际值、预测的值、测量值三者之间的关系

#include "cv.h" #include "highgui.h" #include "cxcore.h" #include "ml.h" #define phi2xy(mat) cvPoint(cvRound(img->width/2 + img->width/3 * cos(mat->data.fl[0])),cvRound(img->height / 2 - img->width/3 * sin(mat->data.fl[0]))) int main(void) { cvNamedWindow("Kalman", 1); // 创建一个随机数产生器 CvRandState rng; cvRandInit(&rng, 0, 1, -1, CV_RAND_UNI); // 一幅用于绘制的图像 IplImage* img = cvCreateImage(cvSize(500, 500), 8, 3); // 创建卡尔曼滤波器结构 CvKalman* kalman = cvCreateKalman(2, 1, 0); // 2(速度、角速度), 1(只能测量车辆的位置), 0(无控制量) // 用随机数初始化状态 CvMat* x_k = cvCreateMat(2, 1, CV_32FC1); // 状态x_k cvRandSetRange(&rng, 0, 0.1, 0); rng.disttype = CV_RAND_NORMAL; cvRand(&rng, x_k); // 过程噪声 CvMat* w_k = cvCreateMat(2, 1, CV_32FC1); // 测量量,只有一个:位置 CvMat* z_k = cvCreateMat(1, 1, CV_32FC1); cvZero(z_k); // 转换矩阵,描述模型的k和k+1步的参数 const float F[4] = {1, 1, 0, 1}; // 2*2矩阵 memcpy(kalman->transition_matrix->data.fl, F, sizeof(F)); // 初始化卡尔曼滤波的其他参数 cvSetIdentity(kalman->measurement_matrix, cvRealScalar(1)); // 测量矩阵H cvSetIdentity(kalman->process_noise_cov, cvRealScalar(1e-5)); // 过程噪声 cvSetIdentity(kalman->measurement_noise_cov, cvRealScalar(1e-1)); // 测量噪声 cvSetIdentity(kalman->error_cov_post, cvRealScalar(1)); // 后验误差协方差 // 选择随机数初始状态 cvRand(&rng, kalman->state_post); while(1) { // 预测点的位置 const CvMat* y_k = cvKalmanPredict(kalman, 0); // 控制量为0 // 产生测量值 cvRandSetRange(&rng, 0, sqrt(kalman->measurement_noise_cov->data.fl[0]), 0); cvRand(&rng, z_k); cvMatMulAdd(kalman->measurement_matrix, x_k, z_k, z_k); // 广义矩阵的乘法 // 画点 cvZero(img); cvCircle(img, phi2xy(z_k), 4, CV_RGB(255, 255, 0)); // 测量值 cvCircle(img, phi2xy(y_k), 4, CV_RGB(255, 255, 255)); // 预测值 cvCircle(img, phi2xy(x_k), 4, CV_RGB(255, 0, 0)); // 实际值 // 校正卡尔曼滤波的状态 cvKalmanCorrect(kalman, z_k); // 产生过程噪声 cvRandSetRange(&rng, 0, sqrt(kalman->process_noise_cov->data.fl[0]), 0); cvRand(&rng, w_k); cvMatMulAdd(kalman->transition_matrix, x_k, w_k, x_k); cvShowImage("Kalman", img); // 按"Esc"键退出程序 if (cvWaitKey(100) == 27) { break; } } return 0; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3