Standard Wavelet Transforms
WaveletsExt.DWT.dwt_stepWaveletsExt.DWT.dwt_step!WaveletsExt.DWT.dwtallWaveletsExt.DWT.idwt_stepWaveletsExt.DWT.idwt_step!WaveletsExt.DWT.idwtallWaveletsExt.DWT.iwpdWaveletsExt.DWT.iwpd!WaveletsExt.DWT.iwpdallWaveletsExt.DWT.iwptallWaveletsExt.DWT.wpdWaveletsExt.DWT.wpd!WaveletsExt.DWT.wpdallWaveletsExt.DWT.wptall
Transforms on 1 Signal
Public API
Wavelets.Transforms.wpt — FunctionwptPerform a discrete wavelet packet transform of the array x. See also: dwt, wavelet
Wavelets.Transforms.wpt — Methodwpt(x, wt[, L])
wpt(x, wt, tree)Returns the wavelet packet transform (WPT) for L levels or by given quadratic tree.
Arguments
x::AbstractVector{T} where T<:Numberorx::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet decomposition whereas a matrix input undergoes 2D wavelet decomposition.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.tree::BitVector: Quadtree to transform to be computed accordingly.
Returns
::Array{T,1}or::Array{T,2}: Transformed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
wt = wavelet(WT.haar)
xw = wpt(x, wt)
# 2D wavelet decomposition
x = randn(8,8)
wt = wavelet(WT.haar)
xw = wpt(x, wt)Wavelets.Transforms.wpt! — Functionwpt!Same as wpt but without array allocation.
Wavelets.Transforms.wpt! — Methodwpt!(y, x, wt[, L])
wpt!(y, x, wt, tree)Same as wpt but without array allocation.
Arguments
y::AbstractVector{T} where T<:Numberory::AbstractArray{T,2} where T<:Number: Allocated output vector/matrix.x::AbstractVector{T} where T<:Numberorx::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet packet transform whereas a matrix input undergoes 2D wavelet packet transform.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.tree::BitVector: Quadtree to transform to be computed accordingly.
Returns
::Array{T,1}or::Array{T,2}: Transformed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
xw = similar(x)
wt = wavelet(WT.haar)
wpt!(xw, x, wt)
# 2D wavelet decomposition
x = randn(8,8)
xw = similar(x)
wt = wavelet(WT.haar)
wpt!(xw, x, wt)Wavelets.Transforms.iwpt — FunctioniwptPerform an inverse discrete wavelet packet transform of the array x. See also: idwt, wavelet
Wavelets.Transforms.iwpt — Methodiwpt(xw, wt[, L])
iwpt(xw, wt, tree)Returns the inverse wavelet packet transform (IWPT) for L levels or by given quadratic tree.
Arguments
xw::AbstractVector{T} where T<:Numberorxw::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet reconstruction whereas a matrix input undergoes 2D wavelet reconstruction.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.tree::BitVector: Quadtree to transform to be computed accordingly.
Returns
::Array{T,1}or::Array{T,2}: Reconstructed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
wt = wavelet(WT.haar)
xw = wpt(x, wt)
# 1D wavelet reconstruction
y = iwpt(xw, wt)
# 2D wavelet decomposition
x = randn(8,8)
wt = wavelet(WT.haar)
xw = wpt(x, wt)
# 2D wavelet reconstruction
y = iwpt(xw, wt)Wavelets.Transforms.iwpt! — Functioniwpt!Same as iwpt but without array allocation.
Wavelets.Transforms.iwpt! — Methodiwpt!(x̂, xw, wt[, L])
iwpt!(x̂, xw, wt, tree)Same as iwpt but without array allocation.
Arguments
x̂::AbstractVector{T} where T<:Numberorx̂::AbstractArray{T,2} where T<:Number: Allocated output vector/matrix.xw::AbstractVector{T} where T<:Numberorxw::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet packet reconstruction whereas a matrix input undergoes 2D wavelet packet reconstruction.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.tree::BitVector: Quadtree to transform to be computed accordingly.
Returns
::Array{T,1}or::Array{T,2}: Reconstructed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
xw = similar(x)
wt = wavelet(WT.haar)
wpt!(xw, x, wt)
# 1D wavelet reconstruction
y = similar(x)
iwpt!(y, xw, wt)
# 2D wavelet decomposition
x = randn(8,8)
xw = similar(x)
wt = wavelet(WT.haar)
wpt!(xw, x, wt)
# 2D wavelet reconstruction
y = similar(x)
iwpt!(y, xw, wt)WaveletsExt.DWT.wpd — Functionwpd(x, wt[, L])Returns the wavelet packet decomposition (WPD) for L levels for input signal x.
Arguments
x::AbstractVector{T} where T<:Numberorx::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet decomposition whereas a matrix input undergoes 2D wavelet decomposition.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.
Returns
::Array{T,2}or::Array{T,3}: Decomposed signal. For an input vectorx, output is a 2D matrix where each column corresponds to a level of decomposition. For an input matrixx, output is a 3D array where each slice of dimension 3 corresponds to a level of decomposition.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)
# 2D wavelet decomposition
x = randn(8,8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)WaveletsExt.DWT.wpd! — Functionwpd!(y, x, wt[, L])Same as wpd but without array allocation.
Arguments
y::AbstractArray{T,2} where T<:Numberory::AbstractArray{T,3} where T<:Number: An allocated array to write the outputs ofxonto.x::AbstractVector{T} where T<:Numberorx::AbstractArray{T,2} where T<:Number: Input vector/matrix. A vector input undergoes 1D wavelet decomposition whereas a matrix input undergoes 2D wavelet decomposition.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.
Returns
y::AbstractArray{T,2} where T<:Numberory::AbstractArray{T,3} where T<:Number: Decomposed signal. For an input vector, output is a 2D matrix where each column corresponds to a level of decomposition. For an input matrix, output is a 3D array where each slice of dimension 3 corresponds to a level of decomposition.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
xw = Array{eltype(x)}(undef, (8,3))
wt = wavelet(WT.haar)
wpd!(xw, x, wt)
# 2D wavelet decomposition
x = randn(8,8)
xw = Array{eltype(x)}(undef, (8,8,3))
wt = wavelet(WT.haar)
wpd!(xw, x, wt)WaveletsExt.DWT.iwpd — Functioniwpd(xw, wt[, L])
iwpd(xw, wt, tree)Computes the inverse wavelet packet decomposition (IWPD) for L levels or by given tree.
Arguments
x̂::AbstractVector{T} where T<:Numberorx̂::AbstractArray{T,2} where T<:Number: Allocated output vector/matrix for reconstructed signal.xw::AbstractArray{T,2} where T<:Numberorxw::AbstractArray{T,3} where T<:Number: Input array. A 2D input undergoes 1D wavelet reconstruction whereas a 3D input undergoes 2D wavelet reconstruction.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:minimum(size(x)[1:end-1]) |> maxtransformlevels) Number of levels of wavelet decomposition.tree::BitVector: Binary tree or Quadtree for inverse transform to be computed accordingly.
Returns
x̂::Array{T,1}orx̂::Array{T,2}: Reconstructed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)
# 1D wavelet reconstruction
y = iwpd(xw, wt)
# 2D wavelet decomposition
x = randn(8,8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)
# 2D wavelet reconstruction
y = iwpd(xw, wt)WaveletsExt.DWT.iwpd! — Functioniwpd(x̂, xw, wt[, L])
iwpd(x̂, xw, wt, tree)Same as iwpd but without array allocation.
Arguments
x̂::AbstractVector{T} where T<:Numberorx̂::AbstractArray{T,2} where T<:Number: Allocated output vector/matrix for reconstructed signal.xw::AbstractArray{T,2} where T<:Numberorxw::AbstractArray{T,3} where T<:Number: Input array. A 2D input undergoes 1D wavelet reconstruction whereas a 3D input undergoes 2D wavelet reconstruction.wt::OrthoFilter: Wavelet filter.L::Integer: (Default:maxtransformlevels(x)) Number of levels for wavelet decomposition.tree::BitVector: Binary tree or Quadtree to transform to be computed accordingly.
Returns
x̂::Array{T,1}orx̂::Array{T,2}: Reconstructed signal.
Examples:
using Wavelets, WaveletsExt
# 1D wavelet decomposition
x = randn(8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)
y = similar(x)
# 1D wavelet reconstruction
iwpd!(y, xw, wt)
# 2D wavelet decomposition
x = randn(8,8)
wt = wavelet(WT.haar)
xw = wpd(x, wt)
y = similar(x)
# 2D wavelet reconstruction
iwpd!(y, xw, wt)Transforms on Multiple Signals
Public API
WaveletsExt.DWT.dwtall — Functiondwtall(x, wt[, L])Computes the discrete wavelet transform (DWT) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input x.
dwt is currently available for 1-D, 2-D, and 3-D signals only.
Arguments
x::AbstractArray{T} where T<:Number: Input signals, where each slice corresponds to one signal. For a set of input signalsxof dimension $n$, signals are sliced on the $n$-th dimension.wt::OrthoFilter: Orthogonal wavelet filter.L::Integer: (Default:Wavelets.maxtransformlevels(xᵢ)) Number of levels of wavelet transforms.
Returns
::Array{T}: Slices of transformed signals. Signals are sliced the same way as the input signal x.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# DWT on all signals in x
xw = dwtall(x, wt)WaveletsExt.DWT.idwtall — Functionidwtall(xw, wt[, L])Computes the inverse discrete wavelet transform (iDWT) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input xw.
idwt is currently available for 1-D, 2-D, and 3-D signals only.
Arguments
xw::AbstractArray{T} where T<:Number: Input decomposed signals, where each slice corresponds to one signal. For a set of input signalsxwof dimension $n$, signals are sliced on the $n$-th dimension.wt::OrthoFilter: Wavelet used.L::Integer: (Default:Wavelets.maxtransformlevels(xwᵢ)) Number of levels of wavelet transforms.
Returns
::Array{T}: Slices of reconstructed signals. Signals are sliced the same way as the input xw.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# DWT on all signals in x
xw = dwtall(x, wt)
# iDWT on all signals
x̂ = idwtall(xw, wt)WaveletsExt.DWT.wptall — Functionwptall(x, wt[, L])
wptall(x, wt, tree)Computes the wavelet packet transform (WPT) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input x.
wpt is currently available for 1-D and 2-D signals only.
Arguments
x::AbstractArray{T} where T<:Number: Input signals, where each slice corresponds to one signal. For a set of input signalsxof dimension $n$, signals are sliced on the $n$-th dimension.wt::OrthoFilter: Wavelet used.L::Integer: (Default:Wavelets.maxtransformlevels(xᵢ)) Number of levels of wavelet decomposition.tree::BitVector: (Default:Wavelets.maketree(xᵢ, :full)) Tree to follow for wavelet decomposition. Default value is only applicable for 1D signals.
Returns
::Array{T}: Slices of transformed signals. Signals are sliced the same way as the input signal x.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# WPT on all signals in x
xw = wptall(x, wt)WaveletsExt.DWT.iwptall — Functioniwptall(xw, wt[, L])
iwptall(xw, wt, tree)Computes the inverse wavelet packet transform (iWPT) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input xw.
iwpt is currently available for 1-D and 2-D signals only.
Arguments
x::AbstractArray{T} where T<:Number: Input signals, where each slice corresponds to one signal. For a set of input signalsxof dimension $n$, signals are sliced on the $n$-th dimension.wt::OrthoFilter: Wavelet used.L::Integer: (Default:Wavelets.maxtransformlevels(xᵢ)) Number of levels of wavelet decomposition.tree::BitVector: (Default:Wavelets.maketree(xᵢ, :full)) Tree to follow for wavelet decomposition. Default value is only applicable for 1D signals.
Returns
::Array{T}: Slices of transformed signals. Signals are sliced the same way as the input signal x.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# WPT on all signals in x
xw = wptall(x, wt)
# iWPT on all signals on x
x̂ = iwptall(xw, wt)WaveletsExt.DWT.wpdall — Functionwpdall(x, wt[, L])Computes the wavelet packet decomposition (WPD) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input x.
Arguments
x::AbstractArray{T} where T<:Number: Input signals, where each slice corresponds to one signal. For a set of input signalsxof dimension $n$, signals are sliced on the $n$-th dimension.wt::OrthoFilter: Wavelet used.L::Integer: (Default:minimum(size(x)[1:end-1]) |> maxtransformlevels) Number of levels of wavelet decomposition.
Returns
::Array{T}: Array of decomposed signals. Signals are sliced by the final dimension.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# WPT on all signals in x
xw = wpdall(x, wt)WaveletsExt.DWT.iwpdall — Functioniwpdall(xw, wt[, L; standard])
iwpdall(xw, wt, tree[; standard])Computes the inverse wavelet packet decomposition (IWPD) on each slice of signal. Signals are sliced on the $n$-th dimension for an $n$-dimensional input xw.
Arguments
xw::AbstractArray{T} where T<:Number: Input signals, where each slice corresponds to one signal decomposition. For a set of input signalsxof dimension $n$,xwis sliced on the $n$-th dimension.wt::OrthoFilter: Wavelet used.L::Integer: (Default:Wavelets.maxtransformlevels(xᵢ)) Number of levels of wavelet decomposition.
Keyword Arguments
standard::Bool: (Default:true) Whether to compute the standard or non-standard wavelet transform. Only applicable for 2D signals.
Returns
::Array{T}: Array of decomposed signals. Signals are sliced by the final dimension.
Examples
using Wavelets, WaveletsExt
# Generate random signals
x = randn(32, 5)
# Create wavelet
wt = wavelet(WT.db4)
# WPD on all signals in x
xw = wpdall(x, wt)
# IWPD on all signals
x̂ = iwpdall(xw, wt)Single Step Transforms
Private API
WaveletsExt.DWT.dwt_step — Functiondwt_step(v, h, g)Perform one level of the discrete wavelet transform (DWT) on the vector v, which is the d-th level scaling coefficients (Note the 0th level scaling coefficients is the raw signal). The vectors h and g are the detail and scaling filters.
Arguments
v::AbstractVector{T} where T<:Number: Vector of coefficients from a node at leveld.h::Vector{S} where S<:Number: High pass filter.g::Vector{S} where S<:Number: Low pass filter.
Returns
w₁::Vector{T}: Output from the low pass filter.w₂::Vector{T}: Output from the high pass filter.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8)
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
# One step of DWT
DWT.dwt_step(v, h, g)dwt_step(v, h, g)Compute 1 step of 2D discrete wavelet transform (DWT).
Arguments
v::AbstractArray{T,2} where T<:Number: Array of coefficients of size $(n,m)$.h::Array{S,1} where S<:Number: High pass filter.g::Array{S,1} where S<:Number: Low pass filter.
Returns
w₁::Array{T,2}: Top left output. Result of low pass filter on columns + low pass filter on rows.w₂::Array{T,2}: Top left output. Result of low pass filter on columns + high pass filter on rows.w₃::Array{T,2}: Top left output. Result of high pass filter on columns + low pass filter on rows.w₄::Array{T,2}: Top left output. Result of high pass filter on columns + high pass filter on rows.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8,8)
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
# One step of DWT
DWT.dwt_step(v, h, g)WaveletsExt.DWT.dwt_step! — Functiondwt_step!(w₂, w₂, v, h, g)Same as dwt_step but without array allocation.
Arguments
w₁::AbstractVector{T} where T<:Number: Vector allocation for output from low pass filter.w₂::AbstractVector{T} where T<:Number: Vector allocation for output from high pass filter.v::AbstractVector{T} where T<:Number: Vector of coefficients from a node at leveld.h::Vector{S} where S<:Number: High pass filter.g::Vector{S} where S<:Number: Low pass filter.
Returns
w₁::Vector{T}: Output from the low pass filter.w₂::Vector{T}: Output from the high pass filter.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8)
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
w₁ = zeros(8)
w₂ = zeros(8)
# One step of DWT
DWT.dwt_step!(w₁, w₂, v, 0, h, g)dwt_step!(v, w₁, w₂, w₃, w₄, h, g, temp)Same as 2D version of dwt_step but without array allocation.
Arguments
w₁::AbstractArray{T,2} where T<:Number: Array allocation for top left output.w₂::AbstractArray{T,2} where T<:Number: Array allocation for top right output.w₃::AbstractArray{T,2} where T<:Number: Array allocation for bottom left output.w₄::AbstractArray{T,2} where T<:Number: Array allocation for bottom right output.v::AbstractArray{T,2} where T<:Number: Array of coefficients to be transformed.h::Array{S,1} where S<:Number: High pass filter.g::Array{S,1} where S<:Number: Low pass filter.temp::AbstractArray{T,2} where T<:Number: Array allocation for intermediate computations.
Returns
w₁::Array{T,2}: Top left output. Result of low pass filter on columns + low pass filter on rows.w₂::Array{T,2}: Top left output. Result of low pass filter on columns + high pass filter on rows.w₃::Array{T,2}: Top left output. Result of high pass filter on columns + low pass filter on rows.w₄::Array{T,2}: Top left output. Result of high pass filter on columns + high pass filter on rows.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8,8)
temp = similar(v)
w₁ = Array{Float64,2}(undef, (4,4))
w₂ = Array{Float64,2}(undef, (4,4))
w₃ = Array{Float64,2}(undef, (4,4))
w₄ = Array{Float64,2}(undef, (4,4))
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
# One step of DWT
DWT.dwt_step!(w₁, w₂, w₃, w₄, v, h, g, temp)WaveletsExt.DWT.idwt_step — Functionidwt_step(w₁, w₂, h, g)Perform one level of the inverse discrete wavelet transform (IDWT) on the vectors w₁ and w₂, which are the scaling and detail coefficients. The vectors h and g are the detail and scaling filters.
Arguments
w₁::AbstractVector{T} where T<:Number: Vector allocation for output from low pass filter.w₂::AbstractVector{T} where T<:Number: Vector allocation for output from high pass filter.h::Vector{S} where S<:Number: High pass filter.g::Vector{S} where S<:Number: Low pass filter.
Returns
v::Vector{T}: Reconstructed coefficients.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8)
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
# One step of SDWT
w₁, w₂ = DWT.dwt_step(v, h, g)
# One step of ISDWT
v̂ = DWT.idwt_step(w₁, w₂, h, g)See also: idwt_step!
idwt_step(w₁, w₂, w₃, w₄, h, g)Computes one step of inverse discrete wavelet transform on 2D-signals.
Arguments
w₁::AbstractArray{T,2} where T<:Number: Top left child coefficients.w₂::AbstractArray{T,2} where T<:Number: Top right child coefficients.w₃::AbstractArray{T,2} where T<:Number: Bottom left child coefficients.w₄::AbstractArray{T,2} where T<:Number: Bottom right child coefficients.h::Array{S,1} where S<:Number: High pass filter.g::Array{S,1} where S<:Number: Low pass filter.
Returns
::Array{T,2}: Reconstructed coefficients.
WaveletsExt.DWT.idwt_step! — Functionidwt_step!(v, w₁, w₂, h, g)Same as idwt_step but without array allocation.
Arguments
v::AbstractVector{T} where T<:Number: Vector allocation for reconstructed coefficients.w₁::AbstractVector{T} where T<:Number: Vector allocation for output from low pass filter.w₂::AbstractVector{T} where T<:Number: Vector allocation for output from high pass filter.h::Vector{S} where S<:Number: High pass filter.g::Vector{S} where S<:Number: Low pass filter.
Returns
v::Vector{T}: Reconstructed coefficients.
Examples
using Wavelets, WaveletsExt
# Setup
v = randn(8)
v̂ = similar(v)
wt = wavelet(WT.haar)
g, h = WT.makereverseqmfpair(wt, true)
# One step of SDWT
w₁, w₂ = DWT.dwt_step(v, h, g)
# One step of ISDWT
DWT.idwt_step!(v̂, w₁, w₂, h, g)See also: idwt_step
idwt_step!(v, w₁, w₂, w₃, w₄, h, g, temp)Same as 2D version of idwt_step but without array allocation.
Arguments
v::AbstractArray{T,2} where T<:Number: Array allocation for inverse transformed output.w₁::AbstractArray{T,2} where T<:Number: Array allocation for top left coefficients.w₂::AbstractArray{T,2} where T<:Number: Array allocation for top right coefficients.w₃::AbstractArray{T,2} where T<:Number: Array allocation for bottom left coefficients.w₄::AbstractArray{T,2} where T<:Number: Array allocation for bottom right coefficients.h::Array{S,1} where S<:Number: High pass filter.g::Array{S,1} where S<:Number: Low pass filter.temp::AbstractArray{T,2} where T<:Number: Array allocation for intermediate computations.
Returns
v::Array{T,2}: Reconstructed coefficients.