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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +33 -0
  4. data/ext/roctave/cu8_file_reader.c +331 -0
  5. data/ext/roctave/cu8_file_reader.h +30 -0
  6. data/ext/roctave/extconf.rb +6 -0
  7. data/ext/roctave/fir_filter.c +795 -0
  8. data/ext/roctave/fir_filter.h +29 -0
  9. data/ext/roctave/freq_shifter.c +410 -0
  10. data/ext/roctave/freq_shifter.h +29 -0
  11. data/ext/roctave/iir_filter.c +462 -0
  12. data/ext/roctave/iir_filter.h +29 -0
  13. data/ext/roctave/roctave.c +38 -0
  14. data/ext/roctave/roctave.h +27 -0
  15. data/lib/roctave.rb +168 -0
  16. data/lib/roctave/bilinear.rb +92 -0
  17. data/lib/roctave/butter.rb +87 -0
  18. data/lib/roctave/cheby.rb +180 -0
  19. data/lib/roctave/cu8_file_reader.rb +45 -0
  20. data/lib/roctave/dft.rb +280 -0
  21. data/lib/roctave/filter.rb +64 -0
  22. data/lib/roctave/finite_difference_coefficients.rb +73 -0
  23. data/lib/roctave/fir.rb +121 -0
  24. data/lib/roctave/fir1.rb +134 -0
  25. data/lib/roctave/fir2.rb +246 -0
  26. data/lib/roctave/fir_design.rb +311 -0
  27. data/lib/roctave/firls.rb +380 -0
  28. data/lib/roctave/firpm.rb +499 -0
  29. data/lib/roctave/freq_shifter.rb +47 -0
  30. data/lib/roctave/freqz.rb +233 -0
  31. data/lib/roctave/iir.rb +80 -0
  32. data/lib/roctave/interp1.rb +78 -0
  33. data/lib/roctave/plot.rb +748 -0
  34. data/lib/roctave/poly.rb +46 -0
  35. data/lib/roctave/roots.rb +73 -0
  36. data/lib/roctave/sftrans.rb +157 -0
  37. data/lib/roctave/version.rb +3 -0
  38. data/lib/roctave/window.rb +116 -0
  39. data/roctave.gemspec +79 -0
  40. data/samples/butter.rb +12 -0
  41. data/samples/cheby.rb +28 -0
  42. data/samples/dft.rb +18 -0
  43. data/samples/differentiator.rb +48 -0
  44. data/samples/differentiator_frequency_scaling.rb +52 -0
  45. data/samples/fft.rb +40 -0
  46. data/samples/finite_difference_coefficient.rb +53 -0
  47. data/samples/fir1.rb +13 -0
  48. data/samples/fir2.rb +14 -0
  49. data/samples/fir2_windows.rb +29 -0
  50. data/samples/fir2bank.rb +30 -0
  51. data/samples/fir_low_pass.rb +44 -0
  52. data/samples/firls.rb +77 -0
  53. data/samples/firpm.rb +78 -0
  54. data/samples/hilbert_transformer.rb +20 -0
  55. data/samples/hilbert_transformer_frequency_scaling.rb +47 -0
  56. data/samples/plot.rb +45 -0
  57. data/samples/stem.rb +8 -0
  58. data/samples/type1.rb +25 -0
  59. data/samples/type3.rb +24 -0
  60. data/samples/windows.rb +25 -0
  61. metadata +123 -0
@@ -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,3 @@
1
+ module Roctave
2
+ VERSION = '0.0.1'
3
+ end
@@ -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
+
@@ -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
+