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
|
# File 'lib/roctave/filter.rb', line 23
def cascade (flt)
my_b = numerator
my_a = denominator
his_b = flt.numerator
his_a = flt.denominator
c = my_b
d = his_b
len = c.length + d.length - 1
d = len.times.collect do |i|
([0, i - d.length + 1].max .. [c.length - 1, i].min).inject(0.0){|sum, k| sum + c[k]*d[i-k]}
end
b = d
c = my_a
d = his_a
len = c.length + d.length - 1
d = len.times.collect do |i|
([0, i - d.length + 1].max .. [c.length - 1, i].min).inject(0.0){|sum, k| sum + c[k]*d[i-k]}
end
a = d
b.collect!{|v| v/ a[0]}
a.collect!{|v| v/ a[0]}
fir = true
a[1..-1].each do |v|
fir = false if v != 0.0
end
if fir then
r = Roctave::FirFilter.new(b)
else
r = Roctave::IirFilter.new(b, a)
end
r
end
|