File: RC-lpf.rb

package info (click to toggle)
ruby-gsl 2.1.0.1%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 4,892 kB
  • ctags: 5,459
  • sloc: ansic: 61,660; ruby: 15,656; sh: 19; makefile: 10
file content (47 lines) | stat: -rwxr-xr-x 1,001 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
#!/usr/bin/env ruby
# Transfer function of a RC low-pass filter
require("gsl")
include GSL::CONST::NUM

class RC_LPF
  def initialize(r, c)
    @r = r
    @c = c
    @fp = 1.0/(2*Math::PI*r*c)
    @omegap = 1.0/(r*c)
    puts("Pole at #{fp} Hz")
  end

  def Vout(f)
    if f.class == GSL::Vector
      out = GSL::Vector::Complex[f.size]
      i = 0
      f.each do |freq|
        a = 1.0/GSL::Complex[1.0, freq/@fp]
        out[i] = a
        i += 1
      end
      return out
    else
      1.0/GSL::Complex(1.0, f/@fp)
    end
  end

  attr_reader :r, :c, :fp
end

# Create RC filter
R = 1*KILO    # 1 [kOhm]
C = 1*MICRO   # 1 [muF]
lpf = RC_LPF.new(R, C)

# Frequency, 1Hz - 10kHz, 100 divisions
f = GSL::Vector.logspace2(1, 10*KILO, 100)

# Transfer function
tf = lpf.Vout(f)

GSL::graph([f, tf.amp.dB], "-C -l x -g 3 -y -100 10 -X 'Frequency [Hz]' -Y 'dB' --toggle-rotate-y-label")
GSL::graph([f, tf.phase/Math::PI], "-C -l x -g 3 -X 'Frequency [Hz]' -Y 'Phase [Pi]' --toggle-rotate-y-label")