vb语言实现的卡尔曼滤波源程序

vb语言实现的卡尔曼滤波源程序

(2007-08-29 09:27:10)
标签:

杂谈

分类: VB
Dim num1, num2, num3
Dim a(), a1(), e() As Single
Dim alf, xgm(), p(), k1(), k2, k(), p1(), p2(), c(), c1, k3(), k4(), cc() As Single

Private Sub Command1_Click()
CommonDialog1.ShowOpen
Open CommonDialog1.FileName For Input As #1
num3 = Val(Text1.Text) + 2
num2 = Val(Text2.Text)
ReDim a(num3, num2)
For j = 1 To num3
For i = 1 To num2
Input #1, a(j, i)
Next i
Next j
Close #1

End Sub

Private Sub Command2_Click()
CommonDialog1.ShowSave
Open CommonDialog1.FileName For Append As #2

For i = 1 To num2
Print #2, cc(i, 1), cc(i, 2), cc(i, 3)
Next i

Close #2
Shell "c:\windows\notepad " & CommonDialog1.FileName
End Sub

Private Sub Command3_Click()

num1 = Val(Text1.Text) + 1
num2 = Val(Text2.Text)
num3 = Val(Text1.Text) + 2
ReDim a1(num2), e(num1, num2) As Single
ReDim xgm(num1), p(num1, num1), k1(num1), k(num1), p1(num1, num1), p2(num1, num1), c(num1), k3(num1), k4(num1), cc(num2, num1) As Single

c(1) = c(2) = c(3) = 0
r = 0.000001
alf = 10
For j = 1 To num1
For i = 1 To num2
e(j, i) = a(j, i)
a1(i) = a(num3, i)
Next i
Next j
For x = 1 To num1
xgm(x) = alf * Sqr(r / e(x, 1))
p(x, x) = xgm(x) ^ 2
Next x

For q = 1 To num2
For i = 1 To num1
k3(i) = k4(i) = 0
Next i
k2 = 0
For i = 1 To num1
For j = 1 To num1
p1(i, j) = p2(i, j) = 0
Next j
Next i
c1 = 0

For m = 1 To num1
k3(m) = 0
For n = 1 To num1
k3(m) = k3(m) + e(n, q) * p(n, m)
Next n
Next m

For m = 1 To num1
k4(m) = 0
k4(m) = k4(m) + 1000 * k3(m) * e(m, q)
Next m

For i = 1 To num1
k2 = k2 + k4(i)
Next i

For v = 1 To num1
k(v) = 0
k(v) = k3(v) * (k2 / 1000 + r) ^ -1
Next v

For i = 1 To num1
For j = 1 To 3
p1(i, j) = k(i) * e(j, q)
Next j
Next i

For l = 1 To num1
For i = 1 To num1
p2(l, i) = 0
For j = 1 To num1

p2(l, i) = 1000 * p1(l, j) * p(j, i) + p2(l, i)
Next j
Next i
Next l

For i = 1 To num1
For j = 1 To num1
p(i, j) = p(i, j) - p2(i, j) / 1000
Next j
Next i

For i = 1 To num1
c1 = c1 + e(i, q) * c(i)
Next i
For i = 1 To num1
c(i) = c(i) + k(i) * (a1(q) - c1)

Next i

For i = 1 To num1

cc(q, i) = c(i)
Next i
Next q

End Sub

Private Sub Command4_Click()
End
End Sub 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
巴特沃兹滤波器的vb.net程序。 ' 使用双线性变换法的 Butterworth 型 IIR 数字滤波器设计程序 ' ' 形参说明如下 : ' ' PbType ----------- 输入整型量 ,滤波器通带类型 : ' PbType = 0 : 低通滤波器 ; ' PbType = 1 : 高通滤波器 ; 2 ' PbType = 2 : 带通滤波器 ; ' PbType = 3 : 带阻滤波器 . ' fp1 ----------- 输入双精度量 , 低通或高通滤波器的通带边界频率 ( Hz ); 带通或带阻滤波器的通带低端边 ‘ 界频率 ( Hz ). ' fp2 ----------- 输入双精度量 , 带通或带阻滤波器的通带低端边界频率 ( Hz ). ' Apass ----------- 输入双精度量 , 通带衰减 ( dB ). ' fs1 ----------- 输入双精度量 , 低通或高通滤波器的阻带边界频率 ( Hz ); 带通或带阻滤波器的阻带高端边 ‘ 界频率 ( Hz ). ' fs2 ----------- 输入双精度量 , 带通或带阻滤波器的阻带高端边界频率 ( Hz ). ' Astop ----------- 输入双精度量 , 阻带衰减 ( dB ). ' fsamp ----------- 输入双精度量 , 采样频率 ( Hz ). ' points ----------- 输入整型量 , 幅频特性计算点数 . ' ord ----------- 输入整型量 , 滤波器阶数 . ' NumSec( ) -------- 输出双精度量 , 转移函数二阶节的分子多项式系数二维数组 . ' 元素 NumSec( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' DenSec( ) -------- 输出双精度量 转移函数二阶节的分母多项式系数二维数组 . ' 元素 DenSec( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' NumSec_Z( ) ------ 输出双精度量 系统函数二阶节的分子多项式系数二维数组 . ' 元素 NumSec_Z( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' DenSec_Z( ) ------ 输出双精度量 系统函数二阶节的分母多项式系数二维数组 . ' 元素 DenSec_Z( k, i ) 中, ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' AR( ) ------------ 输出双精度量 ,滤波器的幅频特性数组 . ' Sub Butterworth(PbType As Integer, fp1 As Double, fp2 As Double, Apass As Double, fs1 As Double, fs2 As Double, Astop As Double, fsamp As Double, points As Integer, ord As Integer, NumSec() As Double, DenSec() As Double, NumSec_Z() As Double, DenSec_Z() As Double, AR() As Double) Dim i%, j%, k%, ord_t% Dim angle#, emp1#, temp2#, temp3# Dim ratio(0 To 50) As Double '''''''''''''''''''' If PbType = 0 Then ' 低通滤波器 ; wpass = 2# * Pi * fpass / fsamp: wstop = 2# * Pi * fstop / fsamp ' 通带、阻带边界频率 omikaP = Tan(wpass / 2#): omikaS = Tan(wstop / 2#) epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波器的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_LP 子程序, 将低通模拟滤波器的转移函数变量 s 映射为低通数字滤波器的系统函数变量 z Call Fz_LP(F1(), F2(), ord_t) ' End If '''''''''''''''''''' If PbType = 1 Then ' 高通滤波器 ; wpass = 2# * Pi * fpass / fsamp: wstop = 2# * Pi * fstop / fsamp ' 通带、阻带边界频率 3 omikaP = 1# / Tan(wpass / 2#): omikaS = 1# / Tan(wstop / 2#) epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波器的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_HP 子程序,将高通模拟滤波器的转移函数变量 s 映射为高通数字滤波器的系统函数变量 z Call Fz_HP(F1(), F2(), ord_t) End If '''''''''''''''''''' If PbType = 2 Then ' 带通滤波器 ; wp1 = 2# * Pi * fp1 / fsamp: wp2 = 2# * Pi * fp2 / fsamp ' 通带上下边界频率 ws1 = 2# * Pi * fs1 / fsamp: ws2 = 2# * Pi * fs2 / fsamp ' 阻带上下边界频率 Ci = BpC(wp1, wp2) omikaP = Abs((Ci - Cos(wp2)) / Sin(wp2)) omikaS1 = Abs((Ci - Cos(ws1)) / Sin(ws1)) omikaS2 = Abs((Ci - Cos(ws2)) / Sin(ws2)) If omikaS1 <= omikaS2 Then omikaS = omikaS1 Else omikaS = omikaS2 End If epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波器的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_BP 子程序,将带通模拟滤波器的转移函数变量 s 映射为带通数字滤波器的系统函数变量 z Call Fz_BP(fp1, fp2, fsamp, F1(), F2(), ord_t) End If
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值