Add doc comments

This commit is contained in:
2024-10-28 03:29:52 -05:00
parent b6ed079d42
commit 4dda811a1c
8 changed files with 240 additions and 110 deletions

View File

@@ -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)