-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiscrete_fourier_transform.sf
49 lines (35 loc) · 1.17 KB
/
discrete_fourier_transform.sf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/ruby
# Simple implementation of the Discrete Fourier transform.
# See also:
# https://www.youtube.com/watch?v=MY4luNgGfms
# https://en.wikipedia.org/wiki/Discrete_Fourier_transform
func discrete_fourier_transform (N, k, x={ _ }) {
var t = (-Num.tau.i * k / N)
sum(^N, {|n|
x(n) * exp(t * n)
})
}
func discrete_fourier_transform_2 (N, k, x={ _ }) {
var t = (Num.tau * k / N)
var a = sum(^N, {|n|
x(n) * cos(t * n)
})
var b = sum(^N, {|n|
x(n) * sin(t * n)
})
return (a, -b)
}
func dft (wave) {
wave.map_kv {|k|
discrete_fourier_transform(wave.len, k, { wave[_] })
}
}
var cycles = 3
var sequence = 0..15
var wave = sequence.map {|n| sin(n * Num.tau / sequence.len * cycles) }
var trans = dft(wave)
say "wave: #{wave.map {|w| '%6s' % w.round(-40).as_dec(3) }.join(' ')}"
say "dft : #{trans.map {|w| '%6s' % w.round(-40).as_dec(3) }.join(' ')}"
__END__
wave: 0 0.924 0.707 -0.383 -1 -0.383 0.707 0.924 0 -0.924 -0.707 0.383 1 0.383 -0.707 -0.924
dft : 0 0 0 -8i 0 0 0 0 0 0 0 0 0 8i 0 0