123456789101112131415161718192021222324252627282930313233 |
- #!/usr/bin/ruby
- #
- ## https://rosettacode.org/wiki/Apply_a_digitial_filter_(direct_form_II_transposed)
- #
- func TDF_II_filter(signal, a, b) {
- var out = [0]*signal
- for i in ^signal {
- var this = 0
- for j in ^b { i-j >= 0 && (this += b[j]*signal[i-j]) }
- for j in ^a { i-j >= 0 && (this -= a[j]* out[i-j]) }
- out[i] = this/a[0]
- }
- return out
- }
- var signal = [
- -0.917843918645, 0.141984778794, 1.20536903482, 0.190286794412,
- -0.662370894973, -1.00700480494, -0.404707073677, 0.800482325044,
- 0.743500089861, 1.01090520172, 0.741527555207, 0.277841675195,
- 0.400833448236, -0.2085993586, -0.172842103641, -0.134316096293,
- 0.0259303398477, 0.490105989562, 0.549391221511, 0.9047198589
- ]
- var a = [1.00000000, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17]
- var b = [0.16666667, 0.5, 0.5, 0.16666667 ]
- var f = TDF_II_filter(signal, a, b)
- say "["
- say f.map { "% 0.8f" % _ }.slices(5).map{.join(', ')}.join(",\n")
- say "]"
|