apply_a_digital_filter.sf 1018 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Apply_a_digitial_filter_(direct_form_II_transposed)
  4. #
  5. func TDF_II_filter(signal, a, b) {
  6. var out = [0]*signal
  7. for i in ^signal {
  8. var this = 0
  9. for j in ^b { i-j >= 0 && (this += b[j]*signal[i-j]) }
  10. for j in ^a { i-j >= 0 && (this -= a[j]* out[i-j]) }
  11. out[i] = this/a[0]
  12. }
  13. return out
  14. }
  15. var signal = [
  16. -0.917843918645, 0.141984778794, 1.20536903482, 0.190286794412,
  17. -0.662370894973, -1.00700480494, -0.404707073677, 0.800482325044,
  18. 0.743500089861, 1.01090520172, 0.741527555207, 0.277841675195,
  19. 0.400833448236, -0.2085993586, -0.172842103641, -0.134316096293,
  20. 0.0259303398477, 0.490105989562, 0.549391221511, 0.9047198589
  21. ]
  22. var a = [1.00000000, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17]
  23. var b = [0.16666667, 0.5, 0.5, 0.16666667 ]
  24. var f = TDF_II_filter(signal, a, b)
  25. say "["
  26. say f.map { "% 0.8f" % _ }.slices(5).map{.join(', ')}.join(",\n")
  27. say "]"