Files
EcgSynKit/Sources/ECGSynKit/RRSeries.swift
2024-11-03 17:48:59 -06:00

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
}
}