裏目小僧の部屋

jsz変換で周波数特性

<canvas id="ZtrCanvas2" width="300" height="200"></canvas>
<textarea id="ZfrqResponse" value="1" cols=30 rows=1></textarea>
<form name="Zdata">
<textarea name="ZtextArea" value="1" cols=30 rows="5">
f:10:fs/2=600;
a:0.1:10=1.4;
w =tan(PI*f/fs);
w2 = w*w;
w2 = (w^2);
k0 = 1 + a * w + w * w;
k1 = 2 * (1 - w * w);
k2 = 1 - a * w + w * w;
b1 =  k1 / k0;   
b2 = -k2 / k0;   
a0 = w * w / k0; 
a1 = +2 * a0;    
a2 = a0;         
(a0+a1Z+a2*Z2)/(1-b1z^-1 -b2*Z^2)     
</textarea>
<input name='Zbtn' type="button" value="2次LPF"  />
</form>


<form name="Zdata"> 
<textarea name="ZtextArea" value="1"  cols=30  rows="5">
f:10:fs/2=600;
a:0.1:10=1.4;
w =tan(PI*f/fs);
w2 = w*w;
w2 = (w^2);
k0 = 1 + a * w + w * w;
k1 = 2 * (1 - w * w);
k2 = 1 - a * w + w * w;
b1 =  k1 / k0;   
b2 = -k2 / k0;   
1/k0*(1-2Z+Z2)/(1-b1z^-1 -b2*Z^2)     
</textarea>
<input name='Zbtn' type="button" value="2次HPF"  />
</form>
 <script   type="text/javascript" src="./20230319/PaintLogLev.js"></script>
<script   type="text/javascript" src="./20230319/Zfunc.js"></script>
<script  type="text/javascript">
/*  原作:裏目小僧 (日本語以外に翻訳禁止 以外は自由にご利用下さい)*/

TFFTViewF.viewXnum=true; //X軸の数字を描く
TFFTViewF.viewXline=true; //X軸の線を描く
TFFTViewF.viewYnum=true; //Y軸の数字を描く
//TFFTViewF.viewYline=true; //Y軸の線を描く
TFFTViewF.viewYmark=true;
var z;
var za=[];
var zav=[];
var fs=44100;
var cvs = document.getElementById("ZtrCanvas2");
var cv = cvs.getContext("2d");
var xs =cvs.width;
var ys =cvs.height;
var f=1000;
var offc=10;
var upDn=false;
var fmax=fs/2;
var fmin=5;          
const GraphDRAW = function(){
  cv.fillStyle="#ffffff";
  cv.fillRect(0, 0, cvs.width,cvs.height);
 PaintLogLev(cv, xs, ys, 15, -50, fmax, fmin,  zav, clGreen,TFFTViewF ,  [f], 0);

if(offc>0) {--offc;return;}
if(f>fmax)upDn = false;
if(f<fmin)upDn = true;
if(upDn)f*=1.1; else f*=0.8;
};

function onMouseMove(e) {
let x=e.offsetX;
f=PaintLogLev_XtoFrq(cv,x);
offc=30;
};
var zInterval;
 function ZmakeFunc(){
 z.Zformula1(z.form.ZtextArea.value , fs);
  if(!zInterval) zInterval= setInterval(GraphDRAW , 300);
 cvs.addEventListener('mousemove', onMouseMove);
 document.getElementById("ZfrqResponse").value =z.ZJavascCode;
 let n=zav.indexOf(z); if(n>=0) zav.splice(n,1);
 zav.unshift(z)
 GraphDRAW();
 };
  function reMake (e){e.target.Z.ZReMakeFormula(); GraphDRAW(); }
 function ZrangeSet(Z,n,nm,dmin,dmax,d){
   let i=Z.sliders.findIndex((e)=> e.nm==nm);
  if(i<0){
    let s= document.createElement("input");
      s.name = nm;
      s.type = 'range';
      s.step="any";
       if( dmin>0 && dmax>0){
        dmin=Math.log(dmin);
        dmax=Math.log(dmax);
         s.value=Math.log(d);
       } else     s.value=d;
      s.min=dmin;
      s.max=dmax;
   let L=  document.createElement("label");
   L.appendChild( document.createTextNode(nm) ); 
   L.appendChild(s);
    Z.form.appendChild(L);
    s.Z=Z;
    Z.sliders.unshift({nm:nm,s:s});
    Z.sliders[0].s=s;
    s.addEventListener(`input`,reMake);
  } else  {
   let x=  Z.sliders[i].s.value;
   if( dmin>0 && dmax>0) d=Math.exp(x) ;else d=x;
    d = Math.round(d*100)/100;
    const T=Z.form.ZtextArea;/*文字を書き換える*/
    const reg = new RegExp('('+nm+'\\s*:.+=\\s*)(\\d+\\.\\d+|\\d+);');
     T.value = T.value.replace(reg,'$1'+d+';');
    
  };
  return d;
 };


 for(var form of document.forms)
   if(form.Zbtn){
   form.Zbtn.onclick =  function (e){  z=e.target.Z;  ZmakeFunc(); };
   z=new TZformula();
    z.rangeSet=ZrangeSet;
    z.sliders=[];
      form.Zbtn.Z=z;
   z.form=form;
   za.push(z);
  }
 ZmakeFunc();
</script>

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