Skip to content

Instantly share code, notes, and snippets.

@safiire
Last active July 19, 2017 00:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save safiire/a2b158d6074e1018e31daf274a3d42ac to your computer and use it in GitHub Desktop.
Save safiire/a2b158d6074e1018e31daf274a3d42ac to your computer and use it in GitHub Desktop.
Same old RC Filter Simulation in Julia
abstract PassiveComponent
type Resistor <: PassiveComponent
value::Complex{Float64}
end
type Capacitor <: PassiveComponent
value::Complex{Float64}
end
type RCFilter
voltage::Real
frequency::Real
resistor::Resistor
capacitor::Capacitor
end
function resistance(capacitor::Capacitor)
0
end
function impedance(resistor::Resistor, frequency::Real = 0)
resistor.value
end
function impedance(capacitor::Capacitor, frequency::Real = 0)
(2π * frequency * capacitor.value)^-1
end
function set_input(filter::RCFilter, voltage::Real, frequency::Real = 0)
filter.voltage = voltage
filter.frequency = frequency
end
function cutoff(filter::RCFilter)
(2π * filter.resistor.value * filter.capacitor.value)^-1
end
function total_impedance(filter::RCFilter)
impedance(filter.resistor, filter.frequency) + impedance(filter.capacitor, filter.frequency)
end
function total_current(filter::RCFilter)
filter.voltage / total_impedance(filter)
end
function voltage_across_resistor(filter::RCFilter)
total_current(filter) * impedance(filter.resistor, filter.frequency)
end
function voltage_across_capacitor(filter::RCFilter)
total_current(filter) * impedance(filter.capacitor, filter.frequency)
end
function frequency_sweep(filter::RCFilter)
map(0:2:127) do midi
f = 440 * 2^((midi - 69) / 12.0)
set_input(filter, 1.0, f)
abs(voltage_across_capacitor(filter))
end
end
function print_frequency_response_graph(filter::RCFilter)
line = repeat("-", 64)
response = map(frequency_sweep(filter)) do voltage
round(Int64, (voltage * 10))
end
println("Frequency Response:")
println(line)
for voltage in 10:-1:0
print("|")
for r in response
print(voltage == r ? "*" : " ")
end
println("|")
end
println(line)
end
r1 = 1.0 # R1 = 220 Ohms
c1 = 0.0001 # C1 = 1uF
filter = RCFilter(1, 0, Resistor(r1), Capacitor(c1))
#fc = cutoff(filter)
print_frequency_response_graph(filter)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment