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")
|