Skip to content

Commit 404d7ab

Browse files
committed
Durbin algorithm works correctly
1 parent fc9d6e7 commit 404d7ab

File tree

3 files changed

+26
-43
lines changed

3 files changed

+26
-43
lines changed

src/signalcorr.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ crosscor(x::AbstractVecOrMat, y::AbstractVecOrMat; demean::Bool=true) =
530530
#
531531
#######################################
532532

533-
function pacf_regress!(r::RealMatrix, X::RealMatrix, lags::IntegerVector, mk::Integer)
533+
function pacf_regress!(r::AbstractMatrix, X::AbstractMatrix, lags::IntegerVector, mk::Integer)
534534
lx = size(X, 1)
535535
tmpX = ones(eltype(X), lx, mk + 1)
536536
for j = 1 : size(X,2)
@@ -548,8 +548,8 @@ function pacf_regress!(r::RealMatrix, X::RealMatrix, lags::IntegerVector, mk::In
548548
r
549549
end
550550

551-
function pacf_yulewalker!(r::RealMatrix, X::AbstractMatrix{T}, lags::IntegerVector, mk::Integer) where T<:RealFP
552-
tmp = Vector{T}(undef, mk)
551+
function pacf_yulewalker!(r::AbstractMatrix, X::AbstractMatrix, lags::IntegerVector, mk::Integer)
552+
tmp = Vector{eltype(X)}(undef, mk)
553553
for j = 1 : size(X,2)
554554
acfs = autocor(X[:,j], 1:mk)
555555
for i = 1 : length(lags)
@@ -571,7 +571,7 @@ using the Yule-Walker equations.
571571
572572
`r` must be a matrix of size `(length(lags), size(x, 2))`.
573573
"""
574-
function pacf!(r::RealMatrix, X::AbstractMatrix{T}, lags::IntegerVector; method::Symbol=:regression) where T<:RealFP
574+
function pacf!(r::AbstractMatrix, X::AbstractMatrix, lags::IntegerVector; method::Symbol=:regression)
575575
lx = size(X, 1)
576576
m = length(lags)
577577
minlag, maxlag = extrema(lags)
@@ -602,11 +602,11 @@ If `x` is a vector, return a vector of the same length as `lags`.
602602
If `x` is a matrix, return a matrix of size `(length(lags), size(x, 2))`,
603603
where each column in the result corresponds to a column in `x`.
604604
"""
605-
function pacf(X::RealMatrix, lags::IntegerVector; method::Symbol=:regression)
605+
function pacf(X::AbstractMatrix, lags::IntegerVector; method::Symbol=:regression)
606606
out = Matrix{float(eltype(X))}(undef, length(lags), size(X,2))
607607
pacf!(out, float(X), lags; method=method)
608608
end
609609

610-
function pacf(x::RealVector, lags::IntegerVector; method::Symbol=:regression)
610+
function pacf(x::AbstractVector, lags::IntegerVector; method::Symbol=:regression)
611611
vec(pacf(reshape(x, length(x), 1), lags, method=method))
612612
end

src/toeplitzsolvers.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
# Symmetric Toeplitz solver
2-
function durbin!(r::AbstractVector{T}, y::AbstractVector{T}) where T<:BlasReal
2+
function durbin!(r::AbstractVector{T}, y::AbstractVector{T}) where T
33
n = length(r)
44
n <= length(y) || throw(DimensionMismatch("Auxiliary vector cannot be shorter than data vector"))
55
y[1] = -r[1]
66
β = one(T)
77
α = -r[1]
88
for k = 1:n-1
9-
β *= one(T) - α*α
9+
β *= one(T) - abs2(α)
1010
α = -r[k+1]
1111
for j = 1:k
1212
α -= r[k-j+1]*y[j]
1313
end
1414
α /= β
1515
for j = 1:div(k,2)
1616
tmp = y[j]
17-
y[j] += α*y[k-j+1]
18-
y[k-j+1] += α*tmp
17+
y[j] += α*conj(y[k-j+1])
18+
y[k-j+1] += α*conj(tmp)
1919
end
20-
if isodd(k) y[div(k,2)+1] *= one(T) + α end
20+
if isodd(k) y[div(k,2)+1] += α*conj(y[div(k,2)+1]) end
2121
y[k+1] = α
2222
end
2323
return y
2424
end
25-
durbin(r::AbstractVector{T}) where {T<:BlasReal} = durbin!(r, zeros(T, length(r)))
25+
durbin(r::AbstractVector{T}) where T = durbin!(r, zeros(T, length(r)))
2626

2727
function levinson!(r::AbstractVector{T}, b::AbstractVector{T}, x::AbstractVector{T}) where T<:BlasReal
2828
n = length(b)

test/signalcorr.jl

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -104,34 +104,17 @@ c22 = crosscor(x2, x2)
104104

105105

106106
## pacf
107-
x_pacf = [-2.133252557240862
108-
.1775816414485478
109-
-.6264517920318317
110-
-.8809042583216906
111-
.09251017186697393
112-
-.9271887119115569
113-
3.355819743178915
114-
-.2834039258495755
115-
.5354280026977677
116-
.39182285417742585]
117-
118-
rpacfr = [-0.2181581223814188
119-
0.1950153168287112
120-
0.1443158046061393
121-
-0.1997912294497786
122-
1.686452299291934
123-
-1.446624527965185]
124-
125-
@test pacf(real.(x_pacf), 1:4) rpacfr[1:4]
126-
127-
rpacfy = [-0.2211730116688735
128-
0.1896833143080208
129-
0.1118570207337193
130-
-0.1750206698354201
131-
0.04490978543108597
132-
-0.3715806391613901
133-
-0.1743836518336153
134-
0.07574637899230210
135-
0.04970724340234131]
136-
137-
@test pacf(real.(x_pacf), 1:4, method=:yulewalker) rpacfy[1:4]
107+
108+
pacfr = [-1.598495044296996e-03 - 2.915104118351207e-01im
109+
-5.560162016912027e-01 + 2.950837739894279e-01im
110+
-2.547001916363494e-02 + 2.326084658014266e-01im
111+
-5.427443903358727e-01 + 3.146715147305132e-01im];
112+
113+
@test pacf(x1, 1:4) pacfr[1:4]
114+
115+
pacfy = [-1.598495044296996e-03 - 2.915104118351207e-01im
116+
-5.560162016912027e-01 + 2.950837739894279e-01im
117+
-2.547001916363494e-02 + 2.326084658014266e-01im
118+
-5.427443903358727e-01 + 3.146715147305132e-01im];
119+
120+
@test pacf(x1, 1:4, method=:yulewalker) pacfy

0 commit comments

Comments
 (0)