45 lines
1.2 KiB
Swift
45 lines
1.2 KiB
Swift
import Foundation
|
|
import RealModule
|
|
|
|
public struct RRSeries<T: BinaryFloatingPoint> {
|
|
public let timeParameters: TimeParameters
|
|
public let rrParamaters: RRParameters
|
|
let rng: RandomNumberGenerator
|
|
|
|
struct Segment {
|
|
let end: T
|
|
let value: T
|
|
}
|
|
let segments: [Segment]
|
|
let count: Int
|
|
|
|
public init(timeParameters: TimeParameters, rrParamaters: RRParameters, rng: RandomNumberGenerator, signal: [T]) {
|
|
self.timeParameters = timeParameters
|
|
self.rrParamaters = rrParamaters
|
|
self.rng = rng
|
|
|
|
let sr = T(timeParameters.srInternal)
|
|
|
|
var rrn = [Segment]()
|
|
// generate piecewise RR time series
|
|
do {
|
|
var tecg = T.zero
|
|
var i = 0
|
|
while i < signal.count {
|
|
tecg += signal[i]
|
|
rrn.append(Segment(end: tecg, value: signal[i]))
|
|
i = Int((tecg * sr).rounded(.toNearestOrEven)) + 1
|
|
}
|
|
}
|
|
|
|
segments = rrn
|
|
count = signal.count
|
|
}
|
|
|
|
public func valueAt(_ t: T) -> T {
|
|
let index = min(segments.partitioningIndex { t < $0.end }, segments.endIndex - 1)
|
|
return segments[index].value
|
|
}
|
|
|
|
}
|