TxRxModels: CardioidFamilyPattern added

This commit is contained in:
zymon 2023-08-28 10:33:22 +02:00
parent 46e4409b06
commit c9ca5626a8

View file

@ -4,6 +4,7 @@ using LinearAlgebra
using StaticArrays using StaticArrays
export directivity_pattern, export directivity_pattern,
CardioidFamilyPattern,
Omnidirectional, Omnidirectional,
Subcardioid, Subcardioid,
Cardioid, Cardioid,
@ -11,7 +12,7 @@ export directivity_pattern,
Bidirectional Bidirectional
export TxRx, TxRxArray export TxRx, TxRxArray
export uniform_circle, fibonacci_sphere export uniform_circle, fibonacci_sphere
export linear_array, circular_array, spherical_array, physical_array export linear_array, circular_array, fibonacci_array, physical_array
abstract type AbstractDirectivityPattern end abstract type AbstractDirectivityPattern end
@ -20,6 +21,13 @@ struct SubcardioidPattern <: AbstractDirectivityPattern end
struct CardioidPattern <: AbstractDirectivityPattern end struct CardioidPattern <: AbstractDirectivityPattern end
struct HypercardioidPattern <: AbstractDirectivityPattern end struct HypercardioidPattern <: AbstractDirectivityPattern end
struct BidirectionalPattern <: AbstractDirectivityPattern end struct BidirectionalPattern <: AbstractDirectivityPattern end
struct CardioidFamilyPattern{T<:Real} <: AbstractDirectivityPattern
ρ::T
function CardioidFamilyPattern(ρ::T) where {T<:Real}
ρ < 0.0 && ρ > 1.0 && error("argument out of range, 0.0 ≤", ρ, " ≤ 1.0")
new{T}(ρ)
end
end
const Omnidirectional = OmnidirectionalPattern() const Omnidirectional = OmnidirectionalPattern()
const Subcardioid = SubcardioidPattern() const Subcardioid = SubcardioidPattern()
@ -28,7 +36,6 @@ const Hypercardioid = HypercardioidPattern()
const Bidirectional = BidirectionalPattern() const Bidirectional = BidirectionalPattern()
abstract type AbstractTxRx end abstract type AbstractTxRx end
struct TxRx{T<:Real, D<:AbstractDirectivityPattern} <: AbstractTxRx struct TxRx{T<:Real, D<:AbstractDirectivityPattern} <: AbstractTxRx
@ -65,6 +72,19 @@ function TxRxArray(
end end
"""
"""
function cardioid_pattern(
d::SVector{3, <:Real},
B::SMatrix{3, 3, <:Real},
ρ::Real,
)::Real
r = [1., 0., 0.]
ρ + (1-ρ) * r' * B' * d
end
""" """
""" """
@ -79,17 +99,14 @@ end
""" """
""" """
function cardioid_pattern( function directivity_pattern(
d::SVector{3, <:Real}, d::SVector{3, <:Real},
B::SMatrix{3, 3, <:Real}, B::SMatrix{3, 3, <:Real},
ρ::Real, dp::CardioidFamilyPattern,
)::Real )::Real
r = [1., 0., 0.] cardioid_pattern(d, B, dp.ρ)
ρ + (1-ρ) * r' * B' * d
end end
""" """
""" """
@ -170,9 +187,6 @@ function fibonacci_sphere(N::Integer)
[f(i, offset, up, N) for i = 0:N-1] [f(i, offset, up, N) for i = 0:N-1]
end end
function linear_array(N::Integer, L::Real) function linear_array(N::Integer, L::Real)
ΔL = L / (N - 1) ΔL = L / (N - 1)
L2 = L / 2 L2 = L / 2
@ -184,13 +198,11 @@ function circular_array(N::Integer, r::Real)
[SVector{3}([r * cos(α), r * sin(α), 0]) for α 0:Δα:2π-Δα] [SVector{3}([r * cos(α), r * sin(α), 0]) for α 0:Δα:2π-Δα]
end end
function spherical_array(N::Integer, r::Real) function fibonacci_array(N::Integer, r::Real)
P = fibonacci_sphere(N) P = fibonacci_sphere(N)
[SVector{3}(r .* p) for p in P] [SVector{3}(r .* p) for p in P]
end end
physical_array = ( physical_array = (
matrix_voice = ( matrix_voice = (
cartesian = [ cartesian = [