function alignsignals{T <: Real}(x::Array{T, 1}, u::Array{T, 1})
# Delay as lag of cross correlation peak from origin of time.
lₓ = length(x)
lᵤ = length(u)
lₛ = lₓ + lᵤ - 1
sₓᵤ::Array{T, 1} = xcorr(x, u)
if mod(lₛ, 2) == 0
ct_idx = fld(lₛ, 2)
else
ct_idx = fld(lₛ, 2) + 1
end
_::Array{T, 1}, pk_idx::Array{Int, 1} = findmax(sₓᵤ, 1)
δ::Int = ct_idx - pk_idx[1]
# Align:
y = zeros(T, lᵤ)
if δ > 0
y[1:(lᵤ - δ)] = u[(δ + 1):lᵤ]
else
y[(-δ + 1):lᵤ] = u[1:(lᵤ - -δ)]
end
return y, δ
end
function rfftalignsignals{T <: Real}(x::Array{T, 1}, u::Array{T, 1}; ncores::Int = 1)
lₓ = length(x)
lᵤ = length(u)
FFTW.set_num_threads(ncores)
x_nfft = nextprod(primes(10), lₓ)
u_nfft = nextprod(primes(10), lᵤ)
nfft = max(x_nfft, u_nfft)
X = rfft([x; zeros(nfft - lₓ)])
U = rfft([u; zeros(nfft - lᵤ)])
Sₓᵤ = conj(X) .* U
sₓᵤ = flipdim(fftshift(irfft(Sₓᵤ, 2 * length(Sₓᵤ) - 1)), 1)
lₛ = length(sₓᵤ)
if mod(lₛ, 2) == 0
ct_idx = fld(lₛ, 2)
else
ct_idx = fld(lₛ, 2) + 1
end
_::Array{T, 1}, pk_idx::Array{Int, 1} = findmax(sₓᵤ, 1)
δ::Int = ct_idx - pk_idx[1]
# Align:
y = zeros(T, lᵤ)
if δ > 0
y[1:(lᵤ - δ)] = u[(δ + 1):lᵤ]
else
y[(-δ + 1):lᵤ] = u[1:(lᵤ - -δ)]
end
return y, δ
end
function fftalignsignals{T <: Real}(x::Array{T, 1}, u::Array{T, 1}; ncores::Int = 1)
lₓ = length(x)
lᵤ = length(u)
FFTW.set_num_threads(ncores)
x_nfft = nextprod(primes(10), lₓ)
u_nfft = nextprod(primes(10), lᵤ)
nfft = max(x_nfft, u_nfft)
X = fft([x; zeros(x_nfft - lₓ)])
U = fft([u; zeros(u_nfft - lᵤ)])
Sₓᵤ = conj(X) .* U
sₓᵤ = abs(flipdim(fftshift(ifft(Sₓᵤ)), 1))
lₛ = length(sₓᵤ)
if mod(lₛ, 2) == 0
ct_idx = fld(lₛ, 2)
else
ct_idx = fld(lₛ, 2) + 1
end
_::Array{T, 1}, pk_idx::Array{Int, 1} = findmax(sₓᵤ, 1)
δ::Int = ct_idx - pk_idx[1]
# Align:
y = zeros(T, lᵤ)
if δ > 0
y[1:(lᵤ - δ)] = u[(δ + 1):lᵤ]
else
y[(-δ + 1):lᵤ] = u[1:(lᵤ - -δ)]
end
return y, δ
end