diff --git a/src/RoomAcoustics.jl b/src/RoomAcoustics.jl index 7dd52d9..1cb752c 100644 --- a/src/RoomAcoustics.jl +++ b/src/RoomAcoustics.jl @@ -15,4 +15,6 @@ include("utils.jl") include("ISM.jl") include("moving_sources.jl") +include("WASN.jl") + end # module diff --git a/src/WASN.jl b/src/WASN.jl new file mode 100644 index 0000000..2a8ba6e --- /dev/null +++ b/src/WASN.jl @@ -0,0 +1,76 @@ +module WASN + +using LinearAlgebra +using DSP: conv + +using TxRxModels + +using ..RoomAcoustics: AbstractRoom, AbstractRIRConfig, ISM + +export Node, Event +export synth_events + +struct Node + rx::TxRxArray + fs::Real + δ::Real +end + +function Node(rx, δ=0.0) + Node(rx, δ) +end + +struct Event + tx::TxRx + emission::Real + fs::Real + signal::AbstractVector +end + +function synth_events( + nodes::AbstractVector{<:Node}, + events::AbstractVector{<:Event}, + room::AbstractRoom, + rir_config::AbstractRIRConfig, +) + hs = [ISM(nodes[i].rx, events[j].tx, room, rir_config) for i in eachindex(nodes), j in eachindex(events)] + s = [[conv(h, events[j].signal) for h in hs[i, j]] for i in eachindex(nodes), j in eachindex(events)] + + (signals=s, hs=hs) +end + +function synthesise( + nodes::AbstractVector{<:Node}, + events::AbstractVector{<:Event}, + room::AbstractRoom, + rir_config::AbstractRIRConfig, +) + # WARN: THIS FUNCTION ASSUMES NOW THAT ALL sampling rates are the same. + fs = first(nodes).fs + + # Synthesise individual events for given nodes + e_signals, h_s = synth_events(nodes, events, room, rir_config) + + # Find length of the output signal + δ_max = [node.δ for node ∈ nodes] |> maximum; + N = [ceil(Int, (events[j].emission + δ_max)*fs) + length(e_signals[1, j][1]) for j ∈ eachindex(events)] |> maximum + + # Allocate memory for output signals + output = [zeros(N, node.rx.p |> length) for node ∈ nodes] + + for i ∈ eachindex(nodes), j ∈ eachindex(events) + shift_n = floor(Int, (events[j].emission + nodes[i].δ)*fs) + event = e_signals[i,j] + for (idx, channel) in enumerate(event) + output[i][shift_n:shift_n+length(channel)-1, idx] .= channel + end + end + + return ( + node_output = output, + event_signals = e_signals, + h = h_s, + ) +end + +end # module WASN