Fast Hadamard Transform
This is a faster version for N = 2M, M an integer.
The basic fast transform was published by M. Kunt in 1975. It is speeded up here by adding a reordering before the "guts" of the calculation.
Fortran Code
C
SUBROUTINE HADAM(A,M)
C
C ORDERED HADAMARD TRANSFORM FOR N=2**M, M INTEGER
C
C AUTHOR: B. H. SUITS, MICHIGAN TECHNOLOGICAL UNIVERSITY, 1988.
C
C INPUTS: A = ARRAY TO TRANSFORM (REAL)
C (REPLACED BY TRANSFORM)
C M = LOG BASE TWO OF NUMBER OF DATA POINTS TO TRANSFORM
C (INTEGER, M > -1)
C OUTPUT: A= TRANSFORMED DATA
C
C SEE ALSO: M. KUNT, IEEE TRANSACTIONS ON COMPUTERS, VOL 24,
C PAGE 1120 (1975).
C
C GENERAL REFS: W. K. PRATT, DIGITAL IMAGE PROCESSING,
C (WILEY AND SONS, N.Y. 1978), PAGE 250 FF.
C W. K. PRATT, J. KANE, H. C. ANDREWS, PROC. IEEE, VOL 57,
C NO. 1, PAGE 58 (1969).
C REF. FOR BIT INVERSE PORTION: COOLEY, LEWIS, AND WELCH, IEEE
C TRANSACTIONS E-12, NO. 1 (1965) AS QUOTED IN NUMERICAL
C METHODS, BY DAHLQUIST AND BJORCK, PRENTICE HALL (1974),
C PAGE 416.
C
C COMMENT: TRANSFORM IS NOT NORMALIZED IN THE SENSE DESCRIBED IN
C PRATT'S BOOK OR KUNT'S ROUTINE. TO NORMALIZE, NEED
C TO MULTIPLY EACH ELEMENT BY 1/SQRT(N).
C
C FOR INTEGER, DOUBLE PRECISION, OR OTHER DATA TYPES, CHANGE
C THE TYPE DECLARATION IN THE FOLLOWING LINE.
C
REAL T,A(*)
C
N=2**M
C
C REORDER INTO GRAY SCALE ORDER
C
K1=1
K2=2
DO 10 L=1,M-1
K0=K1
K1=K2
K2=2*K2
DO 10 J=K1,N,K2
DO 10 I=1,K0
IP=I+J
IPP=IP+K0
T=A(IP)
A(IP)=A(IPP)
A(IPP)=T
10 CONTINUE
C
C NOW DO BIT INVERSE SWAP AS IN FOURIER TRANSFORM
C
NV2=N/2
NM1=N-1
J=1
DO 17 I=1,NM1
IF(I.LT.J) THEN
T=A(J)
A(J)=A(I)
A(I)=T
ENDIF
K=NV2
16 IF(K.GE.J) GOTO 17
J=J-K
K=K/2
GOTO 16
17 J=J+K
C
C DO THE UNORDERED TRANSFORM ON THE REORDERED DATA TO GET
C AN ORDERED TRANSFORM.
C
L0=1
DO 20 L=0,M-1
L1=L0
L0=2*L0
DO 20 J=1,L1
DO 20 I=J,N,L0
IP=I+L1
T=A(IP)
A(IP)=A(I)-T
20 A(I)=A(I)+T
C
RETURN
END
B. H. Suits
Physics Dept.
Michigan Technological University
Houghton MI