Add doc comments
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import Algorithms
|
||||
import Foundation
|
||||
import PFFFTLib
|
||||
import PFFFT
|
||||
|
||||
struct Parameters {
|
||||
/// The number of beats to simulate.
|
||||
@@ -52,39 +53,6 @@ struct Parameters {
|
||||
let fhistd = 0.01
|
||||
}
|
||||
|
||||
class PfftSetupCache: @unchecked Sendable {
|
||||
private var cache: [Int: OpaquePointer?] = [:]
|
||||
|
||||
private let queue = DispatchQueue(label: String(describing: PfftSetupCache.self), attributes: .concurrent)
|
||||
|
||||
func get(for nrr: Int) -> OpaquePointer? {
|
||||
var setup: OpaquePointer??
|
||||
queue.sync {
|
||||
setup = cache[nrr]
|
||||
}
|
||||
if setup == nil {
|
||||
queue.sync(flags: .barrier) {
|
||||
setup = cache[nrr]
|
||||
if setup == nil {
|
||||
setup = pffftd_new_setup(Int32(nrr), PFFFT_REAL)
|
||||
cache[nrr] = setup
|
||||
}
|
||||
}
|
||||
}
|
||||
return setup!
|
||||
}
|
||||
|
||||
deinit {
|
||||
for (_, setup) in cache {
|
||||
if setup != nil {
|
||||
pffftd_destroy_setup(setup)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static let shared = PfftSetupCache()
|
||||
}
|
||||
|
||||
struct EcgDerive {
|
||||
let rrpc: [Double]
|
||||
}
|
||||
@@ -95,6 +63,8 @@ func stdev(_ data: [Double]) -> Double {
|
||||
return sqrt(data.lazy.map { ($0 - mean) * ($0 - mean) }.reduce(0.0, +) / (n - 1))
|
||||
}
|
||||
|
||||
let fftlib = SetupCache<Double>()
|
||||
|
||||
func rrprocess(params: Parameters, nrr: Int) -> [Double] {
|
||||
let w1 = 2.0 * .pi * params.flo
|
||||
let w2 = 2.0 * .pi * params.fhi
|
||||
@@ -110,11 +80,11 @@ func rrprocess(params: Parameters, nrr: Int) -> [Double] {
|
||||
let sf = Double(params.sfInternal)
|
||||
let df = sf / Double(nrr)
|
||||
|
||||
let fft = PfftSetupCache.shared.get(for: nrr)
|
||||
|
||||
var rr = withUnsafeTemporaryAllocation(byteCount: (nrr + 2) * MemoryLayout<Double>.stride, alignment: 32) {
|
||||
let swc = $0.bindMemory(to: Double.self)
|
||||
let input = Buffer<Double>(capacity: (nrr + 2))
|
||||
let output = Buffer<Double>(capacity: nrr)
|
||||
|
||||
input.withUnsafeMutableBufferPointer { swc in
|
||||
for i in 0 ..< nrr / 2 + 1 {
|
||||
let w = df * Double(i) * 2.0 * .pi
|
||||
let dw1 = w - w1
|
||||
@@ -131,13 +101,12 @@ func rrprocess(params: Parameters, nrr: Int) -> [Double] {
|
||||
|
||||
// pack Nyquist frequency real to imaginary of DC
|
||||
swc[1] = swc[nrr]
|
||||
}
|
||||
|
||||
return withUnsafeTemporaryAllocation(byteCount: nrr * MemoryLayout<Double>.stride, alignment: 32) {
|
||||
let outptr = $0.bindMemory(to: Double.self)
|
||||
try! fftlib.get(for: nrr, type: .real).fft(input: input, output: output, work: nil, sign: .backward)
|
||||
|
||||
pffftd_transform_ordered(fft, swc.baseAddress, outptr.baseAddress, nil, PFFFT_BACKWARD)
|
||||
return outptr.map { $0 * 1.0 / Double(nrr) }
|
||||
}
|
||||
var rr = output.withUnsafeMutableBufferPointer { outptr in
|
||||
return outptr.map { $0 * 1.0 / Double(nrr) }
|
||||
}
|
||||
|
||||
let xstd = stdev(rr)
|
||||
|
||||
Reference in New Issue
Block a user