Skip to content

Commit

Permalink
analog-filter-designer: cutoff frequency output
Browse files Browse the repository at this point in the history
  • Loading branch information
ChSotiriou committed Feb 8, 2025
1 parent c8700b5 commit 1e4cdf8
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 0 deletions.
11 changes: 11 additions & 0 deletions dist/tools/general/analog-filter-designer/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,16 @@ <h1 class="text-center mb-4">Analog Filter Designer</h1>

<hr />


<div class="input-group mb-3">
<span class="input-group-text bg-dark text-white" data-toggle="tooltip"
title="Output Cutoff Frequency">$f_c$</span>
<input required type="text" class="form-control"
id="out_fc" readonly value="">
</div>

<hr />

<div id="plot">
</div>

Expand Down Expand Up @@ -183,6 +193,7 @@ <h1 class="text-center mb-4">Analog Filter Designer</h1>
<script src="js/ngrp.js"></script>
<script src="js/ngspice.js"></script>
<script src="js/models.js"></script>
<script src="js/eng2num.js"></script>
<script src="js/main.js"></script>

</body>
Expand Down
47 changes: 47 additions & 0 deletions dist/tools/general/analog-filter-designer/js/eng2num.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
spiceUnitsMap = {
'f': 1e-15,
'p': 1e-12,
'n': 1e-9,
'u': 1e-6,
'm': 1e-3,
'': 1,
'k': 1e3,
'meg': 1e6,
'g': 1e9,
't': 1e12
}

unitsMapInverted = Object.create(null)
unitsMapInverted[-15] = 'f'
unitsMapInverted[-12] = 'p'
unitsMapInverted[-9] = 'n'
unitsMapInverted[-6] = 'u'
unitsMapInverted[-3] = 'm'
unitsMapInverted[0] = ''
unitsMapInverted[3] = 'k'
unitsMapInverted[6] = 'M'
unitsMapInverted[9] = 'G'
unitsMapInverted[12] = 'T'

function eng2num(eng) {
eng = eng.toLowerCase()

result = eng.match(/\d+/g)
num = result[0]
dec = result.length == 2 ? result[1] : 0

units = eng.match(/[a-z]+/)
units = units == null ? '' : units[0]
multiplier = spiceUnitsMap[units]

return parseFloat(num + '.' + dec) * multiplier
}

function num2eng(num) {
const toOptionalFixed = (num, digits) =>
`${Number.parseFloat(num.toFixed(digits))}`;

scale = Math.floor(Math.log10(num) / 3) * 3
unit = unitsMapInverted[scale]
return `${toOptionalFixed(num / 10**scale, 3)} ${unit}`
}
4 changes: 4 additions & 0 deletions dist/tools/general/analog-filter-designer/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,14 @@ function update() {
if (!args_elem.every(x => x.validity.valid)) return

args = args_elem.map(x => x.value)
args_num = args.map(x => eng2num(x))

sim_model = createFormattedString(sim_models[sim_name], args)
document.getElementById('spice-input').textContent = sim_model

freq = freq_models[sim_name](args_num)
document.getElementById("out_fc").value = num2eng(freq) + 'Hz'

processSimulation()
}

Expand Down
7 changes: 7 additions & 0 deletions dist/tools/general/analog-filter-designer/js/models.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ downloadURL = function(data, fileName) {

const sim_command = `.ac dec 500 1 {0}`

const freq_models = {
'se_rc': (args) => 1/(2*Math.PI*args[1]*args[2]),
'se_rc_hpf': (args) => 1/(2*Math.PI*args[1]*args[2]),
'diff_rc': (args) => 1/(2*2*Math.PI*args[1]*args[2]),
'lrc_lpf': (args) => 1/(2*Math.PI*Math.sqrt(args[1]*args[3])),
}

const sim_models = {
// ----------------------------------------
'se_rc': `Single Ended RC LPF
Expand Down

0 comments on commit 1e4cdf8

Please sign in to comment.