roctave 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +33 -0
- data/ext/roctave/cu8_file_reader.c +331 -0
- data/ext/roctave/cu8_file_reader.h +30 -0
- data/ext/roctave/extconf.rb +6 -0
- data/ext/roctave/fir_filter.c +795 -0
- data/ext/roctave/fir_filter.h +29 -0
- data/ext/roctave/freq_shifter.c +410 -0
- data/ext/roctave/freq_shifter.h +29 -0
- data/ext/roctave/iir_filter.c +462 -0
- data/ext/roctave/iir_filter.h +29 -0
- data/ext/roctave/roctave.c +38 -0
- data/ext/roctave/roctave.h +27 -0
- data/lib/roctave.rb +168 -0
- data/lib/roctave/bilinear.rb +92 -0
- data/lib/roctave/butter.rb +87 -0
- data/lib/roctave/cheby.rb +180 -0
- data/lib/roctave/cu8_file_reader.rb +45 -0
- data/lib/roctave/dft.rb +280 -0
- data/lib/roctave/filter.rb +64 -0
- data/lib/roctave/finite_difference_coefficients.rb +73 -0
- data/lib/roctave/fir.rb +121 -0
- data/lib/roctave/fir1.rb +134 -0
- data/lib/roctave/fir2.rb +246 -0
- data/lib/roctave/fir_design.rb +311 -0
- data/lib/roctave/firls.rb +380 -0
- data/lib/roctave/firpm.rb +499 -0
- data/lib/roctave/freq_shifter.rb +47 -0
- data/lib/roctave/freqz.rb +233 -0
- data/lib/roctave/iir.rb +80 -0
- data/lib/roctave/interp1.rb +78 -0
- data/lib/roctave/plot.rb +748 -0
- data/lib/roctave/poly.rb +46 -0
- data/lib/roctave/roots.rb +73 -0
- data/lib/roctave/sftrans.rb +157 -0
- data/lib/roctave/version.rb +3 -0
- data/lib/roctave/window.rb +116 -0
- data/roctave.gemspec +79 -0
- data/samples/butter.rb +12 -0
- data/samples/cheby.rb +28 -0
- data/samples/dft.rb +18 -0
- data/samples/differentiator.rb +48 -0
- data/samples/differentiator_frequency_scaling.rb +52 -0
- data/samples/fft.rb +40 -0
- data/samples/finite_difference_coefficient.rb +53 -0
- data/samples/fir1.rb +13 -0
- data/samples/fir2.rb +14 -0
- data/samples/fir2_windows.rb +29 -0
- data/samples/fir2bank.rb +30 -0
- data/samples/fir_low_pass.rb +44 -0
- data/samples/firls.rb +77 -0
- data/samples/firpm.rb +78 -0
- data/samples/hilbert_transformer.rb +20 -0
- data/samples/hilbert_transformer_frequency_scaling.rb +47 -0
- data/samples/plot.rb +45 -0
- data/samples/stem.rb +8 -0
- data/samples/type1.rb +25 -0
- data/samples/type3.rb +24 -0
- data/samples/windows.rb +25 -0
- metadata +123 -0
data/lib/roctave/poly.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
## Copyright (C) 1994-2015 John W. Eaton (GNU Octave implementation)
|
2
|
+
## Copyright (C) 2019 Théotime Bollengier <theotime.bollengier@gmail.com>
|
3
|
+
##
|
4
|
+
## This file is part of Roctave
|
5
|
+
##
|
6
|
+
## Roctave is free software: you can redistribute it and/or modify
|
7
|
+
## it under the terms of the GNU General Public License as published by
|
8
|
+
## the Free Software Foundation, either version 3 of the License, or
|
9
|
+
## (at your option) any later version.
|
10
|
+
##
|
11
|
+
## Roctave is distributed in the hope that it will be useful,
|
12
|
+
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
## GNU General Public License for more details.
|
15
|
+
##
|
16
|
+
## You should have received a copy of the GNU General Public License
|
17
|
+
## along with Roctave. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
|
20
|
+
module Roctave
|
21
|
+
|
22
|
+
##
|
23
|
+
# Returns the coefficients of the polynomial whose roots are the elements of the input array.
|
24
|
+
# @param x [Array<Numeric>] An array containing the roots of a polynomial
|
25
|
+
# @return [Array<Numeric>] An array containing coefficients of a polynomial whose roots are +x+.
|
26
|
+
def self.poly (x)
|
27
|
+
m = x.length
|
28
|
+
|
29
|
+
if m == 0 then
|
30
|
+
return [1.0]
|
31
|
+
else
|
32
|
+
v = x
|
33
|
+
end
|
34
|
+
|
35
|
+
y = Array.new(m+1){0.0}
|
36
|
+
y[0] = 1.0
|
37
|
+
(1..m).each do |j|
|
38
|
+
tmp = (1..j).collect{|i| y[i] - v[j-1]*y[i-1]}
|
39
|
+
y[1..j] = tmp
|
40
|
+
end
|
41
|
+
|
42
|
+
y
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
## Copyright (C) 1994-2015 John W. Eaton (GNU Octave implementation)
|
2
|
+
## Copyright (C) 2019 Théotime Bollengier <theotime.bollengier@gmail.com>
|
3
|
+
##
|
4
|
+
## This file is part of Roctave
|
5
|
+
##
|
6
|
+
## Roctave is free software: you can redistribute it and/or modify
|
7
|
+
## it under the terms of the GNU General Public License as published by
|
8
|
+
## the Free Software Foundation, either version 3 of the License, or
|
9
|
+
## (at your option) any later version.
|
10
|
+
##
|
11
|
+
## Roctave is distributed in the hope that it will be useful,
|
12
|
+
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
## GNU General Public License for more details.
|
15
|
+
##
|
16
|
+
## You should have received a copy of the GNU General Public License
|
17
|
+
## along with Roctave. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
|
20
|
+
module Roctave
|
21
|
+
|
22
|
+
##
|
23
|
+
# Compute the roots of the polynomial C.
|
24
|
+
#
|
25
|
+
# For a vector C with N components, return the roots of the
|
26
|
+
# polynomial
|
27
|
+
# c(1) * x^(N-1) + ... + c(N-1) * x + c(N)
|
28
|
+
#
|
29
|
+
# @param v [Array<Numeric>] Coefficients of the polynomial. First element is the highest order
|
30
|
+
# @return [Array<Numeric>] Array containing the roots.
|
31
|
+
def self.roots (v)
|
32
|
+
n = v.length
|
33
|
+
|
34
|
+
## If v = [ 0 ... 0 v(k+1) ... v(k+l) 0 ... 0 ],
|
35
|
+
## we can remove the leading k zeros,
|
36
|
+
## and n - k - l roots of the polynomial are zero.
|
37
|
+
|
38
|
+
return [] if v.empty?
|
39
|
+
|
40
|
+
f = []
|
41
|
+
v.each_with_index do |e, i|
|
42
|
+
f << i unless e.abs == 0.0
|
43
|
+
end
|
44
|
+
m = f.length
|
45
|
+
return [] if f.empty?
|
46
|
+
|
47
|
+
v = v[f.first .. f.last]
|
48
|
+
l = v.length
|
49
|
+
|
50
|
+
if l > 1 then
|
51
|
+
a = Matrix.build(l-1, l-1) do |row, col|
|
52
|
+
if row == col + 1 then
|
53
|
+
1.0
|
54
|
+
elsif row == 0 then
|
55
|
+
-v[1+col].to_f / v[0]
|
56
|
+
else
|
57
|
+
0.0
|
58
|
+
end
|
59
|
+
end
|
60
|
+
d = a.eigen.d
|
61
|
+
r = (0...l-1).collect{|i| d[i, i]}
|
62
|
+
if (f[-1] + 1) < n then
|
63
|
+
r = r + Roctave.zeros(n - f[-1] - 1)
|
64
|
+
end
|
65
|
+
else
|
66
|
+
r = Roctave.zeros(n - f[-1] - 1)
|
67
|
+
end
|
68
|
+
|
69
|
+
r
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
@@ -0,0 +1,157 @@
|
|
1
|
+
## Copyright (C) 1999-2001 Paul Kienzle <pkienzle@users.sf.net> (GNU Octave implementation)
|
2
|
+
## Copyright (C) 2019 Théotime Bollengier <theotime.bollengier@gmail.com>
|
3
|
+
##
|
4
|
+
## This file is part of Roctave
|
5
|
+
##
|
6
|
+
## Roctave is free software: you can redistribute it and/or modify
|
7
|
+
## it under the terms of the GNU General Public License as published by
|
8
|
+
## the Free Software Foundation, either version 3 of the License, or
|
9
|
+
## (at your option) any later version.
|
10
|
+
##
|
11
|
+
## Roctave is distributed in the hope that it will be useful,
|
12
|
+
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
## GNU General Public License for more details.
|
15
|
+
##
|
16
|
+
## You should have received a copy of the GNU General Public License
|
17
|
+
## along with Roctave. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
|
20
|
+
module Roctave
|
21
|
+
|
22
|
+
##
|
23
|
+
# Transform band edges of a generic lowpass filter (cutoff at W=1)
|
24
|
+
# represented in splane zero-pole-gain form. W is the edge of the
|
25
|
+
# target filter (or edges if band pass or band stop). Stop is true for
|
26
|
+
# high pass and band stop filters or false for low pass and band pass
|
27
|
+
# filters. Filter edges are specified in radians, from 0 to pi (the
|
28
|
+
# nyquist frequency).
|
29
|
+
#
|
30
|
+
# References:
|
31
|
+
#
|
32
|
+
# Proakis & Manolakis (1992). Digital Signal Processing. New York:
|
33
|
+
# Macmillan Publishing Company.
|
34
|
+
#
|
35
|
+
# @param sz [Array<Numeric>] Zeros in S plane
|
36
|
+
# @param sp [Array<Numeric>] Poless in S plane
|
37
|
+
# @param sg [Numeric] Gain in S plane
|
38
|
+
# @param w [Array<Float>] Cuttoff frequency. It is an array of either one or two Floats
|
39
|
+
# @param stop [Boolean] True for high pass and band stop, false for low pass and band pass
|
40
|
+
# @return [Array<Array{Numeric}>] An array of transformed zeros, poles and gain in the S plane [sz, sp, sg]
|
41
|
+
def self.sftrans(sz, sp, sg, w, stop)
|
42
|
+
case w
|
43
|
+
when Numeric
|
44
|
+
w = [w.to_f]
|
45
|
+
when Range
|
46
|
+
w = [w.begin.to_f, w.end.to_f].sort
|
47
|
+
when Array
|
48
|
+
case w.length
|
49
|
+
when 1
|
50
|
+
w = [w.first.to_f]
|
51
|
+
when 2
|
52
|
+
w = [w.first.to_f, w.last.to_f].sort
|
53
|
+
else
|
54
|
+
raise ArgumentError.new "Must specify at most 2 frequency band edges"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
raise ArgumentError.new "w must be a Float, a Range or an array"
|
58
|
+
end
|
59
|
+
raise ArgumentError.new "band edges must not be equal" if w.length > 1 and w.first == w.last
|
60
|
+
stop = not(not(stop))
|
61
|
+
|
62
|
+
c = 1.0
|
63
|
+
p = sp.length
|
64
|
+
z = sz.length
|
65
|
+
if z > p or p == 0 then
|
66
|
+
raise ArgumentError.new "sftrans: must have at least as many poles as zeros in s-plane"
|
67
|
+
end
|
68
|
+
|
69
|
+
if w.length == 2 then
|
70
|
+
fl = w.first
|
71
|
+
fh = w.last
|
72
|
+
if stop then
|
73
|
+
## ---------------- ------------------------- ------------------------ ##
|
74
|
+
## Band Stop zero: b ± sqrt(b^2-FhFl) pole: b ± sqrt(b^2-FhFl) ##
|
75
|
+
## S(Fh-Fl) pole: ±sqrt(-FhFl) zero: ±sqrt(-FhFl) ##
|
76
|
+
## S -> C -------- gain: -x gain: -1/x ##
|
77
|
+
## S^2+FhFl b=C/x (Fh-Fl)/2 b=C/x (Fh-Fl)/2 ##
|
78
|
+
## ---------------- ------------------------- ------------------------ ##
|
79
|
+
if sz.empty? then
|
80
|
+
sg = sg * (1.0 / sp.inject(1.0){|m, v| m * (-v)}).real
|
81
|
+
elsif sp.empty? then
|
82
|
+
sg = sg * (sz.inject(1.0){|m, v| m * (-v)}).real
|
83
|
+
else
|
84
|
+
sg = sg * (sz.inject(1.0){|m, v| m * (-v)} / sp.inject(1.0){|m, v| m * (-v)}).real
|
85
|
+
end
|
86
|
+
b = sp.collect{|v| (c*(fh-fl)/2.0)/v}
|
87
|
+
sp = b.collect{|v| v + Math.sqrt(v**2 - fh*fl)} + b.collect{|v| v - Math.sqrt(v**2 - fh*fl)}
|
88
|
+
ext = [Math.sqrt(Complex(-fh*fl)), -Math.sqrt(Complex(-fh*fl))]
|
89
|
+
if sz.empty? then
|
90
|
+
sz = (1 .. 2*p).collect{|i| ext[i % 2]}
|
91
|
+
else
|
92
|
+
b = sz.collect{|v| (c*(fh-fl)/2.0)/v}
|
93
|
+
sz = b.collect{|v| v + Math.sqrt(v**2-fh*fl)} + b.collect{|v| v - Math.sqrt(v**2-fh*fl)}
|
94
|
+
if p > z then
|
95
|
+
sz = sz + (1 .. 2*(p-z)).collect{|i| ext[i%2]}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
else
|
99
|
+
## ---------------- ------------------------- ------------------------ ##
|
100
|
+
## Band Pass zero: b ± sqrt(b^2-FhFl) pole: b ± sqrt(b^2-FhFl) ##
|
101
|
+
## S^2+FhFl pole: 0 zero: 0 ##
|
102
|
+
## S -> C -------- gain: C/(Fh-Fl) gain: (Fh-Fl)/C ##
|
103
|
+
## S(Fh-Fl) b=x/C (Fh-Fl)/2 b=x/C (Fh-Fl)/2 ##
|
104
|
+
## ---------------- ------------------------- ------------------------ ##
|
105
|
+
sg = sg * (c/(fh-fl))**(z-p)
|
106
|
+
b = sp.collect{|v| v*((fh-fl)/(2.0*c))}
|
107
|
+
sp = b.collect{|v| v + Math.sqrt(v**2-fh*fl)} + b.collect{|v| v - Math.sqrt(v**2-fh*fl)}
|
108
|
+
if sz.empty? then
|
109
|
+
sz = Array.new(p){0.0}
|
110
|
+
else
|
111
|
+
b = sz.collect{|v| v*((fh-fl)/(2.0*c))}
|
112
|
+
sz = b.collect{|v| v + Math.sqrt(v**2-fh*fl)} + b.collect{|v| v - Math.sqrt(v**2-fh*fl)}
|
113
|
+
if p > z then
|
114
|
+
sz = sz + Array.new(p-z){0.0}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
else
|
119
|
+
fc = w.first
|
120
|
+
if stop then
|
121
|
+
## ---------------- ------------------------- ------------------------ ##
|
122
|
+
## High Pass zero: Fc C/x pole: Fc C/x ##
|
123
|
+
## S -> C Fc/S pole: 0 zero: 0 ##
|
124
|
+
## gain: -x gain: -1/x ##
|
125
|
+
## ---------------- ------------------------- ------------------------ ##
|
126
|
+
if sz.empty? then
|
127
|
+
sg = sg * (1.0 / sp.inject(1.0){|m, v| m * (-v)}).real
|
128
|
+
elsif sp.empty? then
|
129
|
+
sg = sg * sz.inject(1.0){|m, v| m * (-v)}.real
|
130
|
+
else
|
131
|
+
sg = sg * (sz.inject(1.0){|m, v| m * (-v)} / sp.inject(1.0){|m, v| m * (-v)}).real
|
132
|
+
end
|
133
|
+
sp = sp.collect{|v| c*fc/v}
|
134
|
+
if sz.empty? then
|
135
|
+
sz = Array.new(p){0.0}
|
136
|
+
else
|
137
|
+
sz = sz.collect{|v| c*fc/v}
|
138
|
+
if p > z then
|
139
|
+
sz = sz + Array.new(p-z){0.0}
|
140
|
+
end
|
141
|
+
end
|
142
|
+
else
|
143
|
+
## ---------------- ------------------------- ------------------------ ##
|
144
|
+
## Low Pass zero: Fc x/C pole: Fc x/C ##
|
145
|
+
## S -> C S/Fc gain: C/Fc gain: Fc/C ##
|
146
|
+
## ---------------- ------------------------- ------------------------ ##
|
147
|
+
sg = sg * (c/fc)**(z-p)
|
148
|
+
sp = sp.collect{|v| fc * v / c}
|
149
|
+
sz = sz.collect{|v| fc * v / c}
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
return [sz, sp, sg]
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
@@ -0,0 +1,116 @@
|
|
1
|
+
## Copyright (C) 2019 Théotime Bollengier <theotime.bollengier@gmail.com>
|
2
|
+
##
|
3
|
+
## This file is part of Roctave
|
4
|
+
##
|
5
|
+
## Roctave is free software: you can redistribute it and/or modify
|
6
|
+
## it under the terms of the GNU General Public License as published by
|
7
|
+
## the Free Software Foundation, either version 3 of the License, or
|
8
|
+
## (at your option) any later version.
|
9
|
+
##
|
10
|
+
## Roctave is distributed in the hope that it will be useful,
|
11
|
+
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
## GNU General Public License for more details.
|
14
|
+
##
|
15
|
+
## You should have received a copy of the GNU General Public License
|
16
|
+
## along with Roctave. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
|
19
|
+
module Roctave
|
20
|
+
# @!group Windows
|
21
|
+
|
22
|
+
##
|
23
|
+
# Hann window
|
24
|
+
# @param n [Integer] Length of the window
|
25
|
+
# @return [Array<Float>]
|
26
|
+
def self.hann (n)
|
27
|
+
n = [1, n.to_i].max
|
28
|
+
t = n - 1
|
29
|
+
(0...n).collect{|i| 0.5 - 0.5*Math.cos(2.0*Math::PI*i/t)}
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
##
|
34
|
+
# Hamming window
|
35
|
+
# @param n [Integer] Length of the window
|
36
|
+
# @return [Array<Float>]
|
37
|
+
def self.hamming (n)
|
38
|
+
n = [1, n.to_i].max
|
39
|
+
t = n - 1
|
40
|
+
(0...n).collect{|i| 0.54 - 0.46*Math.cos(2.0*Math::PI*i/t)}
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
##
|
45
|
+
# Blackman window
|
46
|
+
# @param n [Integer] Length of the window
|
47
|
+
# @param alpha [Float]
|
48
|
+
# @return [Array<Float>]
|
49
|
+
def self.blackman (n, alpha = 0.16)
|
50
|
+
n = [1, n.to_i].max
|
51
|
+
t = n - 1
|
52
|
+
#(0...n).collect{|i| 0.42 - 0.5*Math.cos(2.0*Math::PI*i/t) + 0.08*Math.cos(4.0*Math::PI*i/t)}
|
53
|
+
a0 = (1.0 - alpha) / 2.0
|
54
|
+
a1 = 0.5
|
55
|
+
a2 = alpha / 2.0
|
56
|
+
(0...n).collect{|i| a0 - a1*Math.cos(2.0*Math::PI*i/t) + a2*Math.cos(4.0*Math::PI*i/t)}
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
##
|
61
|
+
# Nuttall window
|
62
|
+
# @param n [Integer] Length of the window
|
63
|
+
# @return [Array<Float>]
|
64
|
+
def self.nuttall (n)
|
65
|
+
n = [1, n.to_i].max
|
66
|
+
t = n - 1
|
67
|
+
a0 = 0.355768
|
68
|
+
a1 = 0.487396
|
69
|
+
a2 = 0.144232
|
70
|
+
a3 = 0.012604
|
71
|
+
(0...n).collect{|i| a0 - a1*Math.cos(2.0*Math::PI*i/t) + a2*Math.cos(4.0*Math::PI*i/t) - a3*Math.cos(6.0*Math::PI*i/t)}
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
##
|
76
|
+
# Blackman-Nuttall window
|
77
|
+
# @param n [Integer] Length of the window
|
78
|
+
# @return [Array<Float>]
|
79
|
+
def self.blackman_nuttall (n)
|
80
|
+
n = [1, n.to_i].max
|
81
|
+
t = n - 1
|
82
|
+
a0 = 0.3635819
|
83
|
+
a1 = 0.4891775
|
84
|
+
a2 = 0.1365995
|
85
|
+
a3 = 0.0106411
|
86
|
+
(0...n).collect{|i| a0 - a1*Math.cos(2.0*Math::PI*i/t) + a2*Math.cos(4.0*Math::PI*i/t) - a3*Math.cos(6.0*Math::PI*i/t)}
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
##
|
91
|
+
# Blackman-Harris window
|
92
|
+
# @param n [Integer] Length of the window
|
93
|
+
# @return [Array<Float>]
|
94
|
+
def self.blackman_harris (n)
|
95
|
+
n = [1, n.to_i].max
|
96
|
+
t = n - 1
|
97
|
+
a0 = 0.35875
|
98
|
+
a1 = 0.48829
|
99
|
+
a2 = 0.14128
|
100
|
+
a3 = 0.01168
|
101
|
+
(0...n).collect{|i| a0 - a1*Math.cos(2.0*Math::PI*i/t) + a2*Math.cos(4.0*Math::PI*i/t) - a3*Math.cos(6.0*Math::PI*i/t)}
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
##
|
106
|
+
# Gaussian window
|
107
|
+
# @param n [Integer] Length of the window
|
108
|
+
# @param sigma [Float] The standard deviation of the Gaussian function is sigma*N/2 sampling periods.
|
109
|
+
# @return [Array<Float>]
|
110
|
+
def self.gaussian (n, sigma = 0.4)
|
111
|
+
n = [1, n.to_i].max
|
112
|
+
t = n - 1
|
113
|
+
(0...n).collect{|i| Math.exp(-0.5*((i - t/2.0)/(sigma*t/2.0))**2)}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
data/roctave.gemspec
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.expand_path('../lib/roctave/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "roctave"
|
5
|
+
s.version = Roctave::VERSION
|
6
|
+
s.date = Time.now.strftime '%Y-%m-%d'
|
7
|
+
s.summary = "Some Matlab / Gnu Octave functions implemented in Ruby."
|
8
|
+
s.description = "Roctave is an attempt to provide some Matlab / Gnu Octave functions in a Ruby gem to generate and analyze digital filters."
|
9
|
+
s.license = 'GPL-3.0+'
|
10
|
+
s.authors = ["Théotime Bollengier"]
|
11
|
+
s.email = 'theotime.bollengier@gmail.com'
|
12
|
+
s.homepage = 'https://gitlab.com/theotime_bollengier/roctave'
|
13
|
+
s.add_runtime_dependency 'gnuplot', '~> 2.6', '>= 2.6.2'
|
14
|
+
s.files = [
|
15
|
+
'LICENSE',
|
16
|
+
'README.md',
|
17
|
+
'roctave.gemspec',
|
18
|
+
'ext/roctave/extconf.rb',
|
19
|
+
'ext/roctave/roctave.c',
|
20
|
+
'ext/roctave/roctave.h',
|
21
|
+
'ext/roctave/fir_filter.c',
|
22
|
+
'ext/roctave/fir_filter.h',
|
23
|
+
'ext/roctave/iir_filter.c',
|
24
|
+
'ext/roctave/iir_filter.h',
|
25
|
+
'ext/roctave/cu8_file_reader.c',
|
26
|
+
'ext/roctave/cu8_file_reader.h',
|
27
|
+
'ext/roctave/freq_shifter.c',
|
28
|
+
'ext/roctave/freq_shifter.h',
|
29
|
+
'lib/roctave.rb',
|
30
|
+
'lib/roctave/version.rb',
|
31
|
+
'lib/roctave/bilinear.rb',
|
32
|
+
'lib/roctave/butter.rb',
|
33
|
+
'lib/roctave/cheby.rb',
|
34
|
+
'lib/roctave/dft.rb',
|
35
|
+
'lib/roctave/finite_difference_coefficients.rb',
|
36
|
+
'lib/roctave/fir1.rb',
|
37
|
+
'lib/roctave/fir2.rb',
|
38
|
+
'lib/roctave/fir_design.rb',
|
39
|
+
'lib/roctave/firls.rb',
|
40
|
+
'lib/roctave/firpm.rb',
|
41
|
+
'lib/roctave/filter.rb',
|
42
|
+
'lib/roctave/fir.rb',
|
43
|
+
'lib/roctave/iir.rb',
|
44
|
+
'lib/roctave/cu8_file_reader.rb',
|
45
|
+
'lib/roctave/freq_shifter.rb',
|
46
|
+
'lib/roctave/freqz.rb',
|
47
|
+
'lib/roctave/interp1.rb',
|
48
|
+
'lib/roctave/plot.rb',
|
49
|
+
'lib/roctave/poly.rb',
|
50
|
+
'lib/roctave/roots.rb',
|
51
|
+
'lib/roctave/sftrans.rb',
|
52
|
+
'lib/roctave/window.rb',
|
53
|
+
'samples/butter.rb',
|
54
|
+
'samples/cheby.rb',
|
55
|
+
'samples/dft.rb',
|
56
|
+
'samples/differentiator_frequency_scaling.rb',
|
57
|
+
'samples/differentiator.rb',
|
58
|
+
'samples/fft.rb',
|
59
|
+
'samples/finite_difference_coefficient.rb',
|
60
|
+
'samples/fir1.rb',
|
61
|
+
'samples/fir2bank.rb',
|
62
|
+
'samples/fir2.rb',
|
63
|
+
'samples/fir2_windows.rb',
|
64
|
+
'samples/fir_low_pass.rb',
|
65
|
+
'samples/firls.rb',
|
66
|
+
'samples/firpm.rb',
|
67
|
+
'samples/hilbert_transformer_frequency_scaling.rb',
|
68
|
+
'samples/hilbert_transformer.rb',
|
69
|
+
'samples/plot.rb',
|
70
|
+
'samples/stem.rb',
|
71
|
+
'samples/type1.rb',
|
72
|
+
'samples/type3.rb',
|
73
|
+
'samples/windows.rb'
|
74
|
+
]
|
75
|
+
s.extensions = [
|
76
|
+
'ext/roctave/extconf.rb'
|
77
|
+
]
|
78
|
+
end
|
79
|
+
|