C#实现卡尔曼滤波器去噪(简易版)

C#实现卡尔曼滤波器去噪(简易版)

原理

  网上资料很多,不再赘述,详情了解:
  https://blog.csdn.net/panjinliang066333/article/details/105863642/

代码

注:该方法选用所有数据作为输入计算其后验均值与方差

    public static double[] kalman_Filter(string filePath, double dataNum, double R, double Q)
    {
        System.IO.StreamReader readerFile = new System.IO.StreamReader(filePath);//读取测量数据文件
        string str = readerFile.ReadToEnd();//获取文件中数据
        Array array = str.Split('\n');//数据分割
         //初始化参数
        int N = array.Length - 1;
        double[] y = new double[N];
        double average=0, sum = 0, variance_sum=0, variance=0;

        //文件数据写进数组
        for (int a = 0; a < array.Length - 1; a++)
        {
            y[a] = Convert.ToDouble(array.GetValue(a));
        }

        //定义参数矩阵
        double[] K = new double[N];//卡尔曼增益矩阵
        double[] P = new double[N];//后验误差估计协方差矩阵
        double[] X = new double[N];//结果矩阵

        //有测量原始数据计算后验测量方差
        for (int n = 0; n < dataNum; n++)
        {
            sum += y[n];
        }
        average = sum / dataNum;//求均值
        for (int m = 0; m < dataNum; m++)
        {
            variance_sum += Math.Sqrt(Math.Abs(y[m] - average));
        }
        variance = variance_sum / dataNum;//求方差

        //矩阵初始化赋值
        X[0] = average;
        P[0] = variance;
        
        //滤波过程
        for (int i = 1; i < N; i++)
        {
            K[i] = P[i - 1] / (P[i - 1] + R);
            X[i] = X[i - 1] + K[i] * (y[i] - X[i - 1]);
            P[i] = P[i - 1] - K[i] * P[i - 1] + Q;
        }
        
        readerFile.Close();
        return X;
    }

如果数据读取不想用IO流,这直接把输入参数改为数组,具体代码如下:

    public static double[] kalmanFilter(double[] array, double R, double Q)
    {
        int N = array.Length;
        double average = 0, sum = 0, variance_sum = 0, variance = 0;
        double[] K = new double[N];
        double[] P = new double[N];
        double[] X = new double[N]; 
        for (int n = 0; n < N; n++)
        {
            sum += array[n];
        }
        average = sum / N;
        for (int m = 0; m < N; m++)
        {
            variance_sum += Math.Sqrt(Math.Abs(array[m] - average));
        }
        variance = variance_sum / N;

        //矩阵初始化赋值
        X[0] = average;
        P[0] = variance;

        //滤波过程
        for (int i = 1; i < N; i++)
        {
            K[i] = P[i - 1] / (P[i - 1] + R);
            X[i] = X[i - 1] + K[i] * (array[i] - X[i - 1]);
            P[i] = P[i - 1] - K[i] * P[i - 1] + Q;
        }
        return X;
    }
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种用于估计系统状态的滤波算法,可以用来去除噪声并提取出系统的真实状态。下面是使用C语言实现卡尔曼滤波去噪的一个简单示例: ```c #include <stdio.h> // 定义卡尔曼滤波器结构体 typedef struct { float x; // 估计值 float P; // 估计协方差 float Q; // 过程噪声协方差 float R; // 测量噪声协方差 } KalmanFilter; // 初始化卡尔曼滤波器 void KalmanFilterInit(KalmanFilter* filter, float initial_x, float initial_P, float Q, float R) { filter->x = initial_x; filter->P = initial_P; filter->Q = Q; filter->R = R; } // 卡尔曼滤波 float KalmanFilterUpdate(KalmanFilter* filter, float measurement) { // 预测步骤 float x_pred = filter->x; float P_pred = filter->P + filter->Q; // 更新步骤 float K = P_pred / (P_pred + filter->R); filter->x = x_pred + K * (measurement - x_pred); filter->P = (1 - K) * P_pred; return filter->x; } int main() { // 创建卡尔曼滤波器 KalmanFilter filter; // 初始化参数 float initial_x = 0; // 初始估计值 float initial_P = 1; // 初始估计协方差 float Q = 0.01; // 过程噪声协方差 float R = 0.1; // 测量噪声协方差 KalmanFilterInit(&filter, initial_x, initial_P, Q, R); // 模拟测量值 float measurements[] = {1.2, 1.4, 1.6, 1.8, 2.0}; // 使用卡尔曼滤波去噪 for (int i = 0; i < sizeof(measurements) / sizeof(float); i++) { float filtered_value = KalmanFilterUpdate(&filter, measurements[i]); printf("Measurement: %.2f, Filtered value: %.2f\n", measurements[i], filtered_value); } return 0; } ``` 上述代码实现了一个简单的卡尔曼滤波器,通过不断输入测量值并得到滤波后的结果。你可以根据实际需求调整初始参数和测量值,以适应不同的应用场景。希望对你有帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值