Skip to content

Commit fcf6dd5

Browse files
committed
improve performance in freqresp for tf
1 parent 2f57fc9 commit fcf6dd5

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

src/freqresp.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ function freqresp!(R::Array{T,3}, sys::LTISystem, w_vec::AbstractVector{<:Real})
4242
PermutedDimsArray{T,3,(3,1,2),(2,3,1),Array{T,3}}(R)
4343
end
4444

45+
function freqresp!(R::Array{T,3}, sys::TransferFunction, w_vec::AbstractVector{<:Real}) where T
46+
te = sys.timeevol
47+
ny,nu = noutputs(sys), ninputs(sys)
48+
@boundscheck size(R) == (ny,nu,length(w_vec))
49+
@inbounds for wi = eachindex(w_vec), ui = 1:nu, yi = 1:ny
50+
R[yi,ui,wi] = evalfr(sys.matrix[yi,ui], _freq(w_vec[wi], te))
51+
end
52+
PermutedDimsArray{T,3,(3,1,2),(2,3,1),Array{T,3}}(R)
53+
end
54+
4555
@autovec () function freqresp(G::AbstractMatrix, w_vec::AbstractVector{<:Real})
4656
repeat(G, 1, 1, length(w_vec))
4757
end
@@ -53,12 +63,6 @@ end
5363
_freq(w, ::Continuous) = complex(0, w)
5464
_freq(w, te::Discrete) = cis(w*te.Ts)
5565

56-
function freqresp(sys::AbstractStateSpace, w_vec::AbstractVector{W}) where W <: Real
57-
ny, nu = size(sys)
58-
T = promote_type(Complex{real(eltype(sys.A))}, Complex{W})
59-
R = Array{T, 3}(undef, ny, nu, length(w_vec))
60-
freqresp!(R, sys, w_vec)
61-
end
6266
@autovec () function freqresp!(R::Array{T,3}, sys::AbstractStateSpace, w_vec::AbstractVector{W}) where {T, W <: Real}
6367
ny, nu = size(sys)
6468
@boundscheck size(R) == (ny,nu,length(w_vec))

test/test_freqresp.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ resp2 = reshape((im*w .+ 2)./(im*w .+ 1), length(w), 1, 1)
6767
@inferred freqresp(G2, w)
6868
@inferred freqresp(H2, w)
6969
@test (@allocated freqresp(sys2, w)) < 1.2*56672 # allow 20% increase due to compiler variations
70-
70+
@test (@allocated freqresp(G2, w)) < 1.2*976 # allow 20% increase due to compiler variations
7171

7272
## Complex-coefficient system
7373
sys3 = ss(-1+im, 1, (1-im), (1-im))

0 commit comments

Comments
 (0)