The code compiles to 2 objects. In linux you have to use ar to make a libwht.a static library from the objects.

wht.bi file:

Code: Select all

`#inclib "wht"`

declare sub fht_float alias "fht_float" (x as single ptr,ln2size as ulongint)

declare sub fht_double alias "fht_double" (x as double ptr,ln2size as ulongint)

function fht_popcount(p as ulong) as ulong

p= p - ((p shr 1) and &h55555555)

p = (p and &h33333333) + ((p shr 2) and &h33333333)

return (((p + (p shr 4)) and &h0F0F0F0F) * &h01010101) shr 24

end function

'No scaling Walsh Hadamard transform

'Number of elements in x() must be a power of 2. eg dim as single x(7)=8 elements

'dim as single x(15)=16 elemets

sub wht_raw overload(x() as single)

fht_float(@x(0),fht_popcount(ubound(x)))

end sub

sub wht_raw(x() as double)

fht_double(@x(0),fht_popcount(ubound(x)))

end sub

'WHT with scaling

sub wht overload(x() as single)

wht_raw(x())

dim as ulong ub=ubound(x)

dim as single scale=1.0/sqr(ub+1)

for i as ulong=0 to ub

x(i)*=scale

next

end sub

sub wht(x() as double)

wht_raw(x())

dim as ulong ub=ubound(x)

dim as double scale=1.0/sqr(ub+1)

for i as ulong=0 to ub

x(i)*=scale

next

end sub

test.bas:

Code: Select all

`#include "wht.bi"`

dim as single x(15) '16 elements labeled 0 to 15

for i as ulong=0 to ubound(x)

x(i)=1!:next

'Walsh Hadamard transform of 16 elements (n=4. 2 to the power of 4 = 16)

wht(x())

for i as ulong=0 to ubound(x)

print x(i):next

'undo because the transform is self-inverse

wht(x())

for i as ulong=0 to ubound(x)

print x(i):next