before protocol removal

This commit is contained in:
2024-10-29 22:04:35 -05:00
parent 16eaad818e
commit 03b467bfb5
10 changed files with 371 additions and 317 deletions

View File

@@ -1,7 +1,9 @@
import Algorithms
import ComplexModule
import Foundation
import PFFFTLib
import PFFFT
import PFFFTLib
import RealModule
struct Parameters {
/// The number of beats to simulate.
@@ -63,75 +65,70 @@ func stdev(_ data: [Double]) -> Double {
return sqrt(data.lazy.map { ($0 - mean) * ($0 - mean) }.reduce(0.0, +) / (n - 1))
}
struct RRProcess : ~Copyable {
struct RRProcess: ~Copyable {
let nrr: Int
let input: Buffer<Double>
let output: Buffer<Double>
let work: Buffer<Double>
let fft: FFTDouble
let spectrum: Buffer<Complex<Double>>
let signal: Buffer<Double>
let fft: FFT<Double>
init(nrr: Int) {
self.nrr = nrr
self.input = Buffer<Double>(capacity: nrr + 2)
self.output = Buffer<Double>(capacity: nrr)
self.work = Buffer<Double>(capacity: nrr)
self.fft = try! FFTDouble.setup(for: nrr, type: .real)
fft = try! FFT<Double>(n: nrr)
spectrum = fft.makeSpectrumBuffer()
signal = fft.makeSignalBuffer()
}
func generate(params: Parameters) -> [Double] {
let w1 = 2.0 * .pi * params.flo
let w2 = 2.0 * .pi * params.fhi
let c1 = 2.0 * .pi * params.flostd
let c2 = 2.0 * .pi * params.fhistd
let w1 = 2.0 * .pi * params.flo
let w2 = 2.0 * .pi * params.fhi
let c1 = 2.0 * .pi * params.flostd
let c2 = 2.0 * .pi * params.fhistd
let sig2 = 1.0
let sig1 = params.lfhfRatio
let sig2 = 1.0
let sig1 = params.lfhfRatio
let rrmean = 60.0 / params.hrMean
let rrstd = 60.0 * params.hrStd / (params.hrMean * params.hrMean)
let rrmean = 60.0 / params.hrMean
let rrstd = 60.0 * params.hrStd / (params.hrMean * params.hrMean)
let sf = Double(params.sfInternal)
let df = sf / Double(nrr)
let sf = Double(params.sfInternal)
let df = sf / Double(nrr)
spectrum.withUnsafeMutableBufferPointer { swc in
for i in 0 ..< nrr / 2 + 1 {
let w = df * Double(i) * 2.0 * .pi
let dw1 = w - w1
let dw2 = w - w2
let hw = sig1 * exp(-dw1 * dw1 / (2.0 * c1 * c1)) / sqrt(2.0 * .pi * c1 * c1)
+ sig2 * exp(-dw2 * dw2 / (2.0 * c2 * c2)) / sqrt(2.0 * .pi * c2 * c2)
input.withUnsafeMutableBufferPointer { swc in
for i in 0 ..< nrr / 2 + 1 {
let w = df * Double(i) * 2.0 * .pi
let dw1 = w - w1
let dw2 = w - w2
let hw = sig1 * exp(-dw1 * dw1 / (2.0 * c1 * c1)) / sqrt(2.0 * .pi * c1 * c1)
+ sig2 * exp(-dw2 * dw2 / (2.0 * c2 * c2)) / sqrt(2.0 * .pi * c2 * c2)
let sw = (sf / 2.0) * sqrt(hw)
let ph = 2.0 * .pi * Double.random(in: 0.0 ..< 1.0)
let sw = (sf / 2.0) * sqrt(hw)
let ph = 2.0 * .pi * Double.random(in: 0.0 ..< 1.0)
swc[i].real = sw * cos(ph)
swc[i].imaginary = sw * sin(ph)
}
swc[i * 2] = sw * cos(ph)
swc[i * 2 + 1] = sw * sin(ph)
// pack Nyquist frequency real to imaginary of DC
swc[0].imaginary = swc[nrr / 2].real
}
// pack Nyquist frequency real to imaginary of DC
swc[1] = swc[nrr]
}
fft.inverse(spectrum: spectrum, signal: signal)
self.fft.forward(input: input, output: output, work: nil, sign: .backward)
var rr = signal.withUnsafeMutableBufferPointer { outptr in
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)
let ratio = rrstd / xstd
for i in 0 ..< nrr {
rr[i] = rr[i] * ratio + rrmean
}
return rr
let xstd = stdev(rr)
let ratio = rrstd / xstd
for i in 0 ..< nrr {
rr[i] = rr[i] * ratio + rrmean
}
return rr
}
}
// func compute(params: Parameters) {
// // adjust extrema parameters for mean heart rate
// let hrFact = sqrt(params.hrMean / 60)