Биорадар: Часть 2. Обучение ИНС реконструкции ЭКГ
Author
using MAT
using Flux
using Random
struct RadarECG{T<:Vector{String}}
files::T
win::Int
step::Int
map::Vector{Tuple{Int,Int}}
len_cache::Dict{String,Int}
cache::Dict{Int, Array{Float32,2}}
end
function RadarECG(root::AbstractString; win::Int=5024, step::Int=1256)
paths = filter(p -> occursin(r"^GDN\d{4}_.+\.mat$", basename(p)),
sort(readdir(root; join=true)))
isempty(paths) && error("no .mat files in $root")
len_cache = Dict{String,Int}()
map = Tuple{Int,Int}[]
for (i, path) in enumerate(paths)
n = let m = matread(path)
size(m["radar"], 1)
# size(permutedims(m["radar"]), 1)
end
len_cache[path] = n
nwin = 1 + max(0, (n - win) ÷ step)
append!(map, ((i, w) for w in 0:(nwin-1)))
end
RadarECG(paths, win, step, map, len_cache, Dict{Int,Array{Float32,2}}())
end
Base.length(d::RadarECG) = length(d.map)
function Base.getindex(d::RadarECG, idx::Int)
fi, wi = d.map[idx]
if !haskey(d.cache, fi)
m = matread(d.files[fi])
rad = Float32.(vec(m["radar"]))
ecg = Float32.(vec(m["ecg"]))
# rad = permutedims(Float32.(m["radar"]))
# ecg = permutedims(Float32.(m["ecg"]))
length(rad) == length(ecg) || error("length mismatch")
d.cache[fi] = [rad'; ecg'] # ← ключевая строка
end
data = d.cache[fi]
s = wi * d.step + 1
win = d.win
ϵ = 1e-6
radar_seg = data[1, s:(s+win-1)]
ecg_seg = data[2, s:(s+win-1)]
return radar_seg, ecg_seg
end