langs a-z
This commit is contained in:
parent
db842d013d
commit
d066446780
11389 changed files with 98361 additions and 1020 deletions
|
|
@ -0,0 +1,25 @@
|
|||
open Complex
|
||||
|
||||
let fac k n =
|
||||
let m2pi = -4.0 *. acos 0.0 in
|
||||
polar 1.0 (m2pi*.(float k)/.(float n))
|
||||
|
||||
let merge l r n =
|
||||
let f (k,t) x = (succ k, (mul (fac k n) x) :: t) in
|
||||
let z = List.rev (snd (List.fold_left f (0,[]) r)) in
|
||||
(List.map2 add l z) @ (List.map2 sub l z)
|
||||
|
||||
let fft lst =
|
||||
let rec ditfft2 a n s =
|
||||
if n = 1 then [List.nth lst a] else
|
||||
let odd = ditfft2 a (n/2) (2*s) in
|
||||
let even = ditfft2 (a+s) (n/2) (2*s) in
|
||||
merge odd even n in
|
||||
ditfft2 0 (List.length lst) 1;;
|
||||
|
||||
let show l =
|
||||
let pr x = Printf.printf "(%f %f) " x.re x.im in
|
||||
(List.iter pr l; print_newline ()) in
|
||||
let indata = [one;one;one;one;zero;zero;zero;zero] in
|
||||
show indata;
|
||||
show (fft indata)
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
FFT(v)=my(t=-2*Pi*I/#v,tt);vector(#v,k,tt=t*(k-1);sum(n=0,#v-1,v[n+1]*exp(tt*n)));
|
||||
FFT([1,1,1,1,0,0,0,0])
|
||||
49
Task/Fast-Fourier-transform/PL-I/fast-fourier-transform.pli
Normal file
49
Task/Fast-Fourier-transform/PL-I/fast-fourier-transform.pli
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
test: PROCEDURE OPTIONS (MAIN, REORDER); /* Derived from Fortran Rosetta Code */
|
||||
|
||||
/* In-place Cooley-Tukey FFT */
|
||||
FFT: PROCEDURE (x) RECURSIVE;
|
||||
DECLARE x(*) COMPLEX FLOAT (18);
|
||||
DECLARE t COMPLEX FLOAT (18);
|
||||
DECLARE ( N, Half_N ) FIXED BINARY (31);
|
||||
DECLARE ( i, j ) FIXED BINARY (31);
|
||||
DECLARE (even(*), odd(*)) CONTROLLED COMPLEX FLOAT (18);
|
||||
DECLARE pi FLOAT (18) STATIC INITIAL ( 3.14159265358979323E0);
|
||||
|
||||
N = HBOUND(x);
|
||||
|
||||
if N <= 1 THEN return;
|
||||
|
||||
allocate odd((N+1)/2), even(N/2);
|
||||
|
||||
/* divide */
|
||||
do j = 1 to N by 2; odd((j+1)/2) = x(j); end;
|
||||
do j = 2 to N by 2; even(j/2) = x(j); end;
|
||||
|
||||
/* conquer */
|
||||
call fft(odd);
|
||||
call fft(even);
|
||||
|
||||
/* combine */
|
||||
half_N = N/2;
|
||||
do i=1 TO half_N;
|
||||
t = exp(COMPLEX(0, -2*pi*(i-1)/N))*even(i);
|
||||
x(i) = odd(i) + t;
|
||||
x(i+half_N) = odd(i) - t;
|
||||
end;
|
||||
|
||||
FREE odd, even;
|
||||
|
||||
END fft;
|
||||
|
||||
|
||||
DECLARE data(8) COMPLEX FLOAT (18) STATIC INITIAL (
|
||||
1, 1, 1, 1, 0, 0, 0, 0);
|
||||
DECLARE ( i ) FIXED BINARY (31);
|
||||
|
||||
call fft(data);
|
||||
|
||||
do i=1 TO 8;
|
||||
PUT SKIP LIST ( fixed(data(i), 25, 12) );
|
||||
end;
|
||||
|
||||
END test;
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
sub fft {
|
||||
return @_ if @_ == 1;
|
||||
my @evn = fft( @_[0,2...^* >= @_] );
|
||||
my @odd = fft( @_[1,3...^* >= @_] );
|
||||
my $twd = 2i * pi / @_; # twiddle factor
|
||||
@odd »*=« (^@odd).map(* * $twd)».exp;
|
||||
return @evn »+« @odd, @evn »-« @odd;
|
||||
}
|
||||
|
||||
my @seq = ^16;
|
||||
my $cycles = 3;
|
||||
my @wave = (@seq »*» (2*pi / @seq * $cycles))».sin;
|
||||
say "wave: ", @wave.fmt("%7.3f");
|
||||
|
||||
say "fft: ", fft(@wave)».abs.fmt("%7.3f");
|
||||
100
Task/Fast-Fourier-transform/Run-BASIC/fast-fourier-transform.run
Normal file
100
Task/Fast-Fourier-transform/Run-BASIC/fast-fourier-transform.run
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
cnt = 8
|
||||
sig = int(log(cnt) /log(2) +0.9999)
|
||||
|
||||
pi = 3.14159265
|
||||
real1 = 2^sig
|
||||
|
||||
real = real1 -1
|
||||
real2 = int(real1 / 2)
|
||||
real4 = int(real1 / 4)
|
||||
real3 = real4 +real2
|
||||
|
||||
dim rel(real1)
|
||||
dim img(real1)
|
||||
dim cmp(real3)
|
||||
|
||||
for i = 0 to cnt -1
|
||||
read rel(i)
|
||||
read img(i)
|
||||
next i
|
||||
|
||||
data 1,0, 1,0, 1,0, 1,0, 0,0, 0,0, 0,0, 0,0
|
||||
|
||||
sig2 = int(sig / 2)
|
||||
sig1 = sig -sig2
|
||||
cnt1 = 2^sig1
|
||||
cnt2 = 2^sig2
|
||||
|
||||
dim v(cnt1 -1)
|
||||
v(0) = 0
|
||||
dv = 1
|
||||
ptr = cnt1
|
||||
|
||||
for j = 1 to sig1
|
||||
hlfPtr = int(ptr / 2)
|
||||
pt = cnt1 - hlfPtr
|
||||
for i = hlfPtr to pt step ptr
|
||||
v(i) = v(i -hlfPtr) + dv
|
||||
next i
|
||||
dv = dv + dv
|
||||
ptr = hlfPtr
|
||||
next j
|
||||
|
||||
k = 2 *pi /real1
|
||||
|
||||
for x = 0 to real4
|
||||
cmp(x) = cos(k *x)
|
||||
cmp(real2 - x) = 0 - cmp(x)
|
||||
cmp(real2 + x) = 0 - cmp(x)
|
||||
next x
|
||||
|
||||
print "fft: bit reversal"
|
||||
|
||||
for i = 0 to cnt1 -1
|
||||
ip = i *cnt2
|
||||
for j = 0 to cnt2 -1
|
||||
h = ip +j
|
||||
g = v(j) *cnt2 +v(i)
|
||||
if g >h then
|
||||
temp = rel(g)
|
||||
rel(g) = rel(h)
|
||||
rel(h) = temp
|
||||
temp = img(g)
|
||||
img(g) = img(h)
|
||||
img(h) = temp
|
||||
end if
|
||||
next j
|
||||
next i
|
||||
|
||||
t = 1
|
||||
for stage = 1 to sig
|
||||
print " stage:- "; stage
|
||||
d = int(real2 / t)
|
||||
for ii = 0 to t -1
|
||||
l = d *ii
|
||||
ls = l +real4
|
||||
for i = 0 to d -1
|
||||
a = 2 *i *t +ii
|
||||
b = a +t
|
||||
f1 = rel(a)
|
||||
f2 = img(a)
|
||||
cnt1 = cmp(l) *rel(b)
|
||||
cnt2 = cmp(ls) *img(b)
|
||||
cnt3 = cmp(ls) *rel(b)
|
||||
cnt4 = cmp(l) *img(b)
|
||||
rel(a) = f1 + cnt1 - cnt2
|
||||
img(a) = f2 + cnt3 + cnt4
|
||||
rel(b) = f1 - cnt1 + cnt2
|
||||
img(b) = f2 - cnt3 - cnt4
|
||||
next i
|
||||
next ii
|
||||
t = t +t
|
||||
next stage
|
||||
|
||||
print " Num real imag"
|
||||
for i = 0 to real
|
||||
if abs(rel(i)) <10^-5 then rel(i) = 0
|
||||
if abs(img(i)) <10^-5 then img(i) = 0
|
||||
print " "; i;" ";using("##.#",rel(i));" ";img(i)
|
||||
next i
|
||||
end
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#import nat
|
||||
#import flo
|
||||
|
||||
f = <1+0j,1+0j,1+0j,1+0j,0+0j,0+0j,0+0j,0+0j> # complex sequence of 4 1's and 4 0's
|
||||
|
||||
g = c..mul^*D(sqrt+ float+ length,..u_fw_dft) f # its fft
|
||||
|
||||
#cast %jLW
|
||||
|
||||
t = (f,g)
|
||||
Loading…
Add table
Add a link
Reference in a new issue