裏目小僧の部屋

jsJavaScriptでラプラス変換の伝達関数を求める

<form id="sFuncT12" onshow="sMake()">
<label>f0<input type="range" step="any" min="100" max="10000" value="1000" name="f0" ></label>
<label>Q <input type="range" step="any" min="0.1" max="5" value="0.7" name="Q"   ></label>
<canvas name="sCanvas" width="300" height="200"></canvas>
<textarea name="HPF1" value="1" cols=30 rows="1">w0=2PI*f0; 1/(1+w0/s);</textarea><input type="button" value="HPF1"/>
<textarea name="LPF1" value="1" cols=30 rows="1">w0=2PI*f0;1/(1+s/w0);</textarea><input type="button" value="LPF1"/>
<textarea name="HPF2" value="1" cols=30 rows="1">w0=2PI*f0;w2=w0*w0;s2/((w2+w0/Q*s+s2);	</textarea>
<input type="button" value="HPF2"/>
<textarea name="LPF2" value="1" cols=30 rows="1">w0=2PI*f0;w2=w0*w0;w2/(w2+w0/Q*s+s2);	</textarea>             
<input type="button" value="LPF2"/>
<textarea name="BPF2" value="1" cols=30 rows="1">w0=2PI*f0;w2=w0*w0;w0/Q*s/(w2+w0/Q*s+s2);</textarea>           
<input type="button" value="BPF2"/>
<textarea name="BEF2" value="1" cols=30 rows="1">w0=2PI*f0;w2=w0*w0;(s2+w2)/(w2+w0/Q*s+s2);</textarea>          
<input type="button" value="BEF2"/>
<textarea name="APF2" value="1" cols=30 rows="1">w0=2PI*f0;w2=w0*w0;(w2-w0/Q*s+s2)/(w2+w0/Q*s+s2);</textarea>   
<input type="button" value="APF2"/>
<textarea name="funcPrt" value="3" cols=33 rows="5">ここに計算式</textarea>   

<script   type="text/javascript" src="./ujs/sFuncMk.js"></script>
<script   type="text/javascript" src="./ujs/PaintLogLev.js"></script>
<script  type="text/javascript">
/*  原作:裏目小僧 (日本語以外に翻訳禁止 以外は自由にご利用下さい)*/
 function ZbaseMk(fs){
   this.L={fs:fs};    //サンプルレート
   this.dBmax=25;
   this.dBmin=-50;
   this.fmin=5;
   this.fmax=fs/2;
   this.z=this;
   return this;
 }
function sMake(FormName){
var z=ZbaseMk(44100); 
    z.frm= document.getElementById(FormName);
    z.frm.z=z;
 function OnSl(e){
  let n=e.target.name;
  z[n]=Math.exp(e.target.value);
  makesFunc();}

function slset(e){let v=e.value;e.step="any";
e.min=Math.log(e.min);e.max=Math.log(e.max);e.value=Math.log(v);
e.addEventListener(`input`,OnSl);
z.L[e.name]=v;
};

slset(z.frm.f0);
slset(z.frm.Q );
z.cvs=z.frm.children['sCanvas'];
z.cv =z.cvs.getContext("2d");
z.btnA=[];
 for(let btn of z.frm)if(btn.type==='button'){
  btn.txt=z.frm.children[btn.value];
    btn.onclick =  function (e){z.txt=e.target.txt;z.funcTxt=sfResponseMk( z.txt.value,z.L );makFunc();  offc=60;     };
  z.btnA.push(btn);
 }
     
const GraphDR = function(z){
  z.cv.fillStyle="#ffffff";
  z.cv.fillRect(0, 0, z.xs,z.ys);
 PaintLogLev(z.cv, z.xs, z.ys, 25, -50, z.fmax, z.fmin, z.zav,TFFTViewF, clGray );
 if(z.fMark)  z.cv.MarkV( z,z.fMark,3);
};
z.makFunc = function (){
   z.pg=Function("fi","LB",z.funcTxt);  
   z.frqResponse=  function (f){ this.pg(f ,this.z.L); };
   z.zav=[z];
   z.xs = z.cvs.width;
   z.ys = z.cvs.height;
   GraphDR(z);
   if(z.frm.funcPrt)z.frm.funcPrt.value=z.funcTxt.replace(/;/g,";\n");
  };
var offc=0;
var btnNo=-1;
z.onTim= function (e){
 if(offc>0) {if(--offc===0)z.fMark=null ;return;}
  if(btnNo>=0){
    z.txt.style.backgroundColor = '';
    z.btnA[btnNo].style.backgroundColor = ''; }
 if(++btnNo >= z.btnA.length)btnNo=0;
 z.txt=z.btnA[btnNo].txt;
 z.txt.style.backgroundColor = clAqua;
 z.btnA[btnNo].style.backgroundColor = clAqua;
 z.funcTxt=sfResponseMk( z.txt.value, z.L);
 z.makFunc();
}
 z.Interval = setInterval(z.onTim , 1000,z);
  z.onTim();
function onMouseMove(e) {
  let x=e.offsetX;
  z.fMark=z_XtoFrq(z.cv,x);
  GraphDR(z);
  offc=5;
 };
 z.cvs.addEventListener('mousemove', onMouseMove);
 
 return z;
 }

let sFuncT12= sMake("sFuncT12");

</script>
</form>

プライバシーポリシー本文は日本語以外に翻訳禁止