Ritchie
03.11.2014, 12:28
Hallo Zusammen,
derzeit versuche ich mich an einem kalman Filter.
Ich beginne mit einer einfachen Implementation und habe
mir aus diesem Grunde eine kleine Excel Tabelle erstellt,
wo ich die entsprechenden Werte eingeben kann.
Hierbei will ich zuerst meine Temperatursensoren KTY81-110 von
der "simplen" Mittelwertberechnung auf einen Kalman Filter umsetzen.
Mit Floating Point Mathematik scheint das laut Tabelle schon ganz
gut zu klappen. Die genauen Parameter habe ich noch nicht gefunden (Optimiert).
Nur soll die Routine im Atmega8 nicht auf Float Mathematik arbeiten,
sondern auf Fix Point Mathematik. Und hier habe ich meine ersten Problem.
Meine Routine arbeitet nicht so wie ich es gerne hätte.
Floating Point Mathe
Public Sub CalculateSheet2Formular()
Dim nNoise As Double
Dim nEstimation As Double
Dim nLastEstimation As Double
Dim nPresition As Double
Dim nLastPresition As Double
Dim nKalmanKoeffizent As Double
Dim nValue As Double
Dim nADC As Long
Dim nTemperatur As Long
Dim objWorkbork As Workbook
Dim i As Integer
Set objWorkbork = ThisWorkbook
nNoise = 0.2
nLastEstimation = 0
nPresition = 1
For i = 2 To 22
nADC = CDbl(objWorkbork.Sheets(2).Cells(i, 1).Value)
nADC = nADC * 64 ' (<< 7) in ASM
nTemperatur = 82 + nADC
nTemperatur = nTemperatur / 101
nTemperatur = nTemperatur - 150
objWorkbork.Sheets(2).Cells(i, 2).Value = nTemperatur
nValue = nTemperatur
nLastPresition = nPresition
nKalmanKoeffizent = nPresition / (nPresition + nNoise)
nEstimation = nLastEstimation + nKalmanKoeffizent * (nValue - nLastEstimation)
nPresition = (1 - nKalmanKoeffizent) * nPresition
nLastEstimation = nEstimation
objWorkbork.Sheets(2).Cells(i, 3).Value = nKalmanKoeffizent
objWorkbork.Sheets(2).Cells(i, 4).Value = nPresition
objWorkbork.Sheets(2).Cells(i, 5).Value = i - 1
objWorkbork.Sheets(2).Cells(i, 6).Value = nEstimation
Next i
End Sub
Fix Point Mathe (Versuch der schief ging)
Public Sub CalculateSheet3Formular()
Dim nNoise As Long
Dim nEstimation As Long
Dim nLastEstimation As Long
Dim nPresition As Long
Dim nLastPresition As Long
Dim nKalmanKoeffizent As Long
Dim nValue As Long
Dim nADC As Long
Dim nTemperatur As Long
Dim objWorkbork As Workbook
Dim i As Integer
Set objWorkbork = ThisWorkbook
nNoise = 2
nLastEstimation = 10
nPresition = 16
For i = 2 To 22
nADC = CDbl(objWorkbork.Sheets(3).Cells(i, 1).Value)
nADC = nADC * 64 ' (<< 7) in ASM
nTemperatur = 82 + nADC
nTemperatur = nTemperatur / 101
nTemperatur = nTemperatur - 150
objWorkbork.Sheets(3).Cells(i, 2).Value = nTemperatur
nValue = nTemperatur
nLastPresition = nPresition
nKalmanKoeffizent = nPresition * 100 / (nPresition + nNoise)
nEstimation = nLastEstimation + (nKalmanKoeffizent * (nValue - nLastEstimation) / 100)
nPresition = (100 - nKalmanKoeffizent) * nPresition
nLastEstimation = nEstimation
objWorkbork.Sheets(3).Cells(i, 3).Value = nKalmanKoeffizent
objWorkbork.Sheets(3).Cells(i, 4).Value = nPresition
objWorkbork.Sheets(3).Cells(i, 5).Value = i - 1
objWorkbork.Sheets(3).Cells(i, 6).Value = nEstimation
Next i
End Sub
Hat jemand eine Hilfestellung ?
Wie ist generell der beste Ansatz eine Floating Point Mathe in Fix Point zu wandeln.
Ich dachte bis jetzt immer, da Ansatz wäre den Zahlenbereich nach oben zu schieben,
die Berechnungen durchzuführen und danach den Bereich wieder anpassen.
Viele Gruess
R.
derzeit versuche ich mich an einem kalman Filter.
Ich beginne mit einer einfachen Implementation und habe
mir aus diesem Grunde eine kleine Excel Tabelle erstellt,
wo ich die entsprechenden Werte eingeben kann.
Hierbei will ich zuerst meine Temperatursensoren KTY81-110 von
der "simplen" Mittelwertberechnung auf einen Kalman Filter umsetzen.
Mit Floating Point Mathematik scheint das laut Tabelle schon ganz
gut zu klappen. Die genauen Parameter habe ich noch nicht gefunden (Optimiert).
Nur soll die Routine im Atmega8 nicht auf Float Mathematik arbeiten,
sondern auf Fix Point Mathematik. Und hier habe ich meine ersten Problem.
Meine Routine arbeitet nicht so wie ich es gerne hätte.
Floating Point Mathe
Public Sub CalculateSheet2Formular()
Dim nNoise As Double
Dim nEstimation As Double
Dim nLastEstimation As Double
Dim nPresition As Double
Dim nLastPresition As Double
Dim nKalmanKoeffizent As Double
Dim nValue As Double
Dim nADC As Long
Dim nTemperatur As Long
Dim objWorkbork As Workbook
Dim i As Integer
Set objWorkbork = ThisWorkbook
nNoise = 0.2
nLastEstimation = 0
nPresition = 1
For i = 2 To 22
nADC = CDbl(objWorkbork.Sheets(2).Cells(i, 1).Value)
nADC = nADC * 64 ' (<< 7) in ASM
nTemperatur = 82 + nADC
nTemperatur = nTemperatur / 101
nTemperatur = nTemperatur - 150
objWorkbork.Sheets(2).Cells(i, 2).Value = nTemperatur
nValue = nTemperatur
nLastPresition = nPresition
nKalmanKoeffizent = nPresition / (nPresition + nNoise)
nEstimation = nLastEstimation + nKalmanKoeffizent * (nValue - nLastEstimation)
nPresition = (1 - nKalmanKoeffizent) * nPresition
nLastEstimation = nEstimation
objWorkbork.Sheets(2).Cells(i, 3).Value = nKalmanKoeffizent
objWorkbork.Sheets(2).Cells(i, 4).Value = nPresition
objWorkbork.Sheets(2).Cells(i, 5).Value = i - 1
objWorkbork.Sheets(2).Cells(i, 6).Value = nEstimation
Next i
End Sub
Fix Point Mathe (Versuch der schief ging)
Public Sub CalculateSheet3Formular()
Dim nNoise As Long
Dim nEstimation As Long
Dim nLastEstimation As Long
Dim nPresition As Long
Dim nLastPresition As Long
Dim nKalmanKoeffizent As Long
Dim nValue As Long
Dim nADC As Long
Dim nTemperatur As Long
Dim objWorkbork As Workbook
Dim i As Integer
Set objWorkbork = ThisWorkbook
nNoise = 2
nLastEstimation = 10
nPresition = 16
For i = 2 To 22
nADC = CDbl(objWorkbork.Sheets(3).Cells(i, 1).Value)
nADC = nADC * 64 ' (<< 7) in ASM
nTemperatur = 82 + nADC
nTemperatur = nTemperatur / 101
nTemperatur = nTemperatur - 150
objWorkbork.Sheets(3).Cells(i, 2).Value = nTemperatur
nValue = nTemperatur
nLastPresition = nPresition
nKalmanKoeffizent = nPresition * 100 / (nPresition + nNoise)
nEstimation = nLastEstimation + (nKalmanKoeffizent * (nValue - nLastEstimation) / 100)
nPresition = (100 - nKalmanKoeffizent) * nPresition
nLastEstimation = nEstimation
objWorkbork.Sheets(3).Cells(i, 3).Value = nKalmanKoeffizent
objWorkbork.Sheets(3).Cells(i, 4).Value = nPresition
objWorkbork.Sheets(3).Cells(i, 5).Value = i - 1
objWorkbork.Sheets(3).Cells(i, 6).Value = nEstimation
Next i
End Sub
Hat jemand eine Hilfestellung ?
Wie ist generell der beste Ansatz eine Floating Point Mathe in Fix Point zu wandeln.
Ich dachte bis jetzt immer, da Ansatz wäre den Zahlenbereich nach oben zu schieben,
die Berechnungen durchzuführen und danach den Bereich wieder anpassen.
Viele Gruess
R.