C#實(shí)現(xiàn)一階卡爾曼濾波算法的示例代碼
//FilterKalman.cs namespace FusionFiltering { public class FilterKalman { private double A = 1; private double B = 0; private double H = 1; private double R; private double Q; private double cov = double.NaN; private double x = double.NaN; public FilterKalman(double R, double Q, double A, double B, double H) { this.R = R; //過程噪聲 this.Q = Q; //測量噪聲 this.A = A; //狀態(tài)轉(zhuǎn)移矩陣 this.B = B; //控制矩陣 u為控制向量 this.H = H; //將估計(jì)范圍與單位轉(zhuǎn)化為與系統(tǒng)變量(或者說測量值)一致的范圍與單位 this.cov = double.NaN; this.x = double.NaN; // estimated signal without noise } public FilterKalman(double R, double Q) { this.R = R; this.Q = Q; } public double filter(double measurement, double u) { if (double.IsNaN(this.x)) { this.x = (1 / this.H) * measurement; this.cov = (1 / this.H) * this.Q * (1 / this.H); } else { double predX = (this.A * this.x) + (this.B * u); double predCov = ((this.A * this.cov) * this.A) + this.Q; // Kalman gain double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q)); // Correction this.x = predX + K * (measurement - (this.H * predX)); this.cov = predCov - (K * this.H * predCov); } return this.x; } public double filter(double measurement) { double u = 0; if (double.IsNaN(this.x)) { this.x = (1 / this.H) * measurement; this.cov = (1 / this.H) * this.Q * (1 / this.H); } else { double predX = (this.A * this.x) + (this.B * u); double predCov = ((this.A * this.cov) * this.A) + this.R; // Kalman gain double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q)); // Correction this.x = predX + K * (measurement - (this.H * predX)); this.cov = predCov - (K * this.H * predCov); } return this.x; } public double lastMeasurement() { return this.x; } public void setMeasurementNoise(double noise) { this.Q = noise; } public void setProcessNoise(double noise) { this.R = noise; } } }
//ProgramTestData.cs using System; using System.Linq; namespace FusionFiltering { public class ProgramTest { /// <summary> /// kalman濾波測試1 /// </summary> [System.Diagnostics.Conditional("DEBUG")] public static void TestKalmanFilter1() { Console.WriteLine("FilterKalman Usage"); FilterKalman test = new FilterKalman(0.008, 0.1); double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 }; foreach (var x in testData) { Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x)); } } /// <summary> /// Example Usage with controlled input /// </summary> [System.Diagnostics.Conditional("DEBUG")] public static void TestKalmanFilterWithControlled() { Console.WriteLine("FilterKalman Usage with controlled input"); FilterKalman test = new FilterKalman(0.008, 0.1, 1, 1, 1); double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 }; double u = 0.2; foreach (var x in testData) { Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x, u)); } } } }
//Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FusionFiltering; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ProgramTest.TestKalmanFilter1(); Console.ReadKey(); Console.WriteLine(); ProgramTest.TestKalmanFilterWithControlled(); Console.ReadKey(); } } }
效果:
以上就是C#實(shí)現(xiàn)一階卡爾曼濾波算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C#實(shí)現(xiàn)一階卡爾曼濾波算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯
這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下2014-08-08C#關(guān)聯(lián)自定義文件類型到應(yīng)用程序并實(shí)現(xiàn)自動導(dǎo)入功能
今天通過本文給大家分享C#關(guān)聯(lián)自定義文件類型到應(yīng)用程序并實(shí)現(xiàn)自動導(dǎo)入功能,代碼中寫入了兩個注冊表,實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09C# wpf Canvas中實(shí)現(xiàn)控件拖動調(diào)整大小的示例
本文主要介紹了C# wpf Canvas中實(shí)現(xiàn)控件拖動調(diào)整大小的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C# 實(shí)現(xiàn)與現(xiàn)有.NET事件橋接簡單實(shí)例
這篇文章主要介紹了C# 實(shí)現(xiàn)與現(xiàn)有.NET事件橋接簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動效果
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02C#用遞歸算法實(shí)現(xiàn):一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34,求第30位數(shù)是多少
本文主要介紹三種方法,解決面試中常見的問題,求第30位數(shù)是多少的問題,希望能給大家一個參考。2016-06-06C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色
這篇文章介紹了C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03