Home

Awesome

Fast multidimensional Walsh-Hadamard transforms

This package provides functions to compute fast Walsh-Hadamard transforms in Julia, for arbitrary dimensions and arbitrary power-of-two transform sizes, with the three standard orderings: natural (Hadamard), dyadic (Paley), and sequency (Walsh) ordering.

It works by calling Julia's interface to the FFTW library, and can often be orders of magnitude faster than the corresponding fwht functions in the Matlab signal-processing toolbox.

Installation

Within Julia, just use the package manager to run Pkg.add("Hadamard") to install the files.

Usage

After installation, the using Hadamard statement will import the names in the Hadamard module so that you can call the function below.

By default, fwht and ifwht compute the multidimensional WHT, which consists of the ordinary (one-dimensional) WHT performed along each dimension of the input. To perform only the 1d WHT along dimension d, you can can instead use fwht(X, d) and ifwht(X, d) functions. More generally, d can be a tuple or array or dimensions to transform.

The sizes of the transformed dimensions must be powers of two, or an exception is thrown. The non-transformed dimensions are arbitrary. For example, given a 16x20 array X, fwht(X,1) is allowed but fwht(X,2) is not.

These functions compute the WHT normalized similarly to the fwht and ifwht functions in Matlab. Given the Walsh functions, which have values of +1 or -1, fwht multiplies its input by the Walsh functions and divides by n (the length of the input) to obtain the coefficients of each Walsh function in the input. ifwht multiplies its inputs by the Walsh functions and sums them to recover the signal, with no n factor.

Hadamard matrices

We also provide a a function hadamard(n) which returns a Hadamard matrix of order n, similar to the Matlab function of the same name. The known Hadamard matrices up to size 256 are currently supported (via a lookup table), along with any size that factorizes into products of these known sizes and/or powers of two.

The return value of hadamard(n) is a matrix of Int8 values. If you are planning to do matrix computations with this matrix, you may want to convert to Float64 first via float(hadamard(n)).

For many sizes, the Hadamard matrix is not unique; the hadamard function returns an arbitrary choice. For power-of-two sizes, the choice is equivalent to ifwht_natural(eye(n), 1).

You can pretty-print a Hadamard matrix as a table of + and - (characters indicating the signs of the entries) via Hadamard.printsigns, e.g. Hadamard.printsigns(hadamard(28)) for the 28×28 Hadamard matrix.

You can also obtain a Walsh matrix (sequency-ordered Hadamard matrix) of order n by using the function walsh(n); the order n must be powers of two. This function is related to the Hadamard matrix hadamard(n) by a bit-reversal permutation followed by a Gray-code permutation of the rows.

Author

This package was written by Steven G. Johnson.