-
Notifications
You must be signed in to change notification settings - Fork 5
/
dsp_windows.jl
107 lines (90 loc) · 2.85 KB
/
dsp_windows.jl
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
module Windows
using KDSP
export rect, hanning, hamming, tukey, cosine, lanczos,
triang, bartlett, gaussian, bartlett_hann, blackman,
kaiser
#
# Window functions
#
# Rectangular window function of length N.
function rect(n::Integer)
ones(n,1)
end
# Hanning window of length N.
function hanning(n::Integer)
[0.5*(1 - cos(2*pi*k/(n-1))) for k=0:(n-1)]
end
# Hamming window of length N.
function hamming(n::Integer)
[0.54 - 0.46*cos(2*pi*k/(n-1)) for k=0:(n-1)]
end
# Tukey window of length N, parameterized by alpha. For
# alpha = 0, the window is equivalent to a rectangular window.
# For alpha = 1, the window is a hann window.
function tukey(n::Integer, alpha::Real)
# check that alpha is reasonable
if abs(alpha) > 1
error("tukey window alpha parameter must be 0 <= alpha <= 1.");
end
# if alpha is less than machine precision, call it zero and return the
# rectangular window for this length. if we don't short circuit this
# here, it will blow up below.
t = zeros(n,1)
if abs(alpha) <= eps()
t = rect(n)
else
for k=0:(n-1)
if k <= alpha/2*(n-1)
t[k+1] = 0.5*(1 + cos(pi*(2*k/(alpha*(n-1)) - 1)))
elseif k <= (n-1)*(1 - alpha/2)
t[k+1] = 1
else
t[k+1] = 0.5*(1 + cos(pi*(2*k/(alpha*(n-1)) - 2/alpha + 1)))
end
end
end
# return filter vector
t
end
# Cosine window of length N. Also called the sine window for obvious reasons.
function cosine(n::Integer)
[sin(pi*k/(n-1)) for k=0:(n-1)]
end
# Lanczos window of length N.
function lanczos(n::Integer)
[sinc(2*k/(n-1) - 1) for k=0:(n-1)]
end
# triangular window of length N.
function triang(n::Integer)
[2/(n+1)*((n+1)/2 - abs(k - (n-1)/2)) for k=0:(n-1)]
end
# bartlett window of length N.
function bartlett(n::Integer)
[2/(n-1)*((n-1)/2 - abs(k - (n-1)/2)) for k=0:(n-1)]
end
# gaussian window of length N parameterized by the standard deviation
# sigma
function gaussian(n::Integer, sigma::Real)
if !(0 < sigma <= 0.5)
error("sigma must be greater than 0 and less than or equal to 0.5.")
end
[exp(-0.5*((k-(n-1)/2)/(sigma*(n-1/2)))^2) for k=0:(n-1)]
end
# bartlett-hann window of length n
function bartlett_hann(n::Integer)
a0, a1, a2 = 0.62, 0.48, 0.38
_arg = (k,l) -> 2*pi*l*k/(n-1)
[a0 - a1*abs(k/(n-1) - 0.5) - a2*cos(_arg(k,1)) for k=0:(n-1)]
end
# "exact" blackman window, alpha=0.16
function blackman(n::Integer)
a0, a1, a2 = 7938/18608, 9240/18608, 1430/18608
_arg = (k,l) -> 2*pi*l*k/(n-1)
[a0 - a1*cos(_arg(k,1)) + a2*cos(_arg(k,2)) for k=0:(n-1)]
end
# kaiser window parameterized by alpha
function kaiser(n::Integer, alpha::Real)
pf = 1.0/besseli(0,pi*alpha)
[pf*besseli(0, pi*alpha*(sqrt(1 - (2*k/(n-1) - 1)^2))) for k=0:(n-1)]
end
end # end module definition