Я пытаюсь реализовать фильтр верхних частот для акселерометра iOS на основе графика акселерометра. проект. Код написан на Swift, вот полный класс:
import Foundation
import CoreMotion
import SpriteKit
class Accelerometer {
let motionManager: CMMotionManager
var x: Double
var y: Double
var z: Double
var lastX: Double
var lastY: Double
var lastZ: Double
let kUpdateFrequency: Double
let cutOffFrequency: Double
let dt: Double
let RC: Double
let alpha: Double
let kFilteringFactor = 0.6
init(manager: CMMotionManager){
motionManager = manager
motionManager.accelerometerUpdateInterval = 1.0 / 60
motionManager.startDeviceMotionUpdates()
x = 0.0
y = 0.0
z = 0.0
lastX = 0.0
lastY = 0.0
lastZ = 0.00
kUpdateFrequency = 60.0
cutOffFrequency = 5.0
dt = 1.0 / kUpdateFrequency
RC = 1.0 / cutOffFrequency
alpha = RC / (dt+RC)
getAccelerometerUpdates()
}
func getAccelerometerUpdates() {
motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { (data, error) -> Void in
// Filter the raw measurments with high pass filter
self.highPassFilter(data!)
})
}
// High pass filter function for accelerometer measurments
func highPassFilter(data: CMAccelerometerData){
self.x = self.alpha * (self.x + data.acceleration.x - self.lastX)
self.y = self.alpha * (self.y + data.acceleration.y - self.lastY)
self.z = self.alpha * (self.z + data.acceleration.z - self.lastZ)
self.lastX = data.acceleration.x
self.lastY = data.acceleration.y
self.lastZ = data.acceleration.z
}
}
Этот класс является частью проекта, включающего SpriteKit и CoreLocation, поэтому я удалил некоторые части из класса, поскольку они не имеют значения. Проблема с этим кодом в том, что он не работает как пример, данный Apple. На графике акселерометра все значения равны 0, когда телефон неподвижен и очень чувствителен к движению, чего и следовало ожидать от фильтра верхних частот, однако в моем случае значения не всегда равны 0, когда телефон не движется, для их изменения требуется время (даже при очень интенсивном встряхивании), и, наконец, обычно требуется несколько секунд, прежде чем они стабилизируются. Короче говоря, он больше похож на фильтр нижних частот или фильтр Калмана, чем на фильтр высоких частот. Поскольку это проект SpriteKit, я также пытался вызывать обновления акселерометра из файла GameScene.swift, однако результаты те же. Я также экспериментировал с гравитацией, пробуя обе функции startDeviceMotionUpdatesToQueue и startDeviceMotionUpdatesToQueue, но безуспешно.