diff --git a/dist/tools/general/analog-filter-designer/index.html b/dist/tools/general/analog-filter-designer/index.html index 334925d..147ab31 100644 --- a/dist/tools/general/analog-filter-designer/index.html +++ b/dist/tools/general/analog-filter-designer/index.html @@ -139,6 +139,16 @@

Analog Filter Designer


+ +
+ $f_c$ + +
+ +
+
@@ -183,6 +193,7 @@

Analog Filter Designer

+ diff --git a/dist/tools/general/analog-filter-designer/js/eng2num.js b/dist/tools/general/analog-filter-designer/js/eng2num.js new file mode 100644 index 0000000..057ce4c --- /dev/null +++ b/dist/tools/general/analog-filter-designer/js/eng2num.js @@ -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}` +} diff --git a/dist/tools/general/analog-filter-designer/js/main.js b/dist/tools/general/analog-filter-designer/js/main.js index 89de02d..441b07b 100644 --- a/dist/tools/general/analog-filter-designer/js/main.js +++ b/dist/tools/general/analog-filter-designer/js/main.js @@ -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() } diff --git a/dist/tools/general/analog-filter-designer/js/models.js b/dist/tools/general/analog-filter-designer/js/models.js index 145f75f..ea30c4b 100644 --- a/dist/tools/general/analog-filter-designer/js/models.js +++ b/dist/tools/general/analog-filter-designer/js/models.js @@ -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