dsp-filter-library
Version:
A comprehensive DSP library with 23 window functions, advanced FIR/IIR filter design, biquad combination, and interactive visualization
1 lines • 11.4 kB
Source Map (JSON)
{"version":3,"file":"IIRDesigner.cjs","sources":["../../src/iir/IIRDesigner.js"],"sourcesContent":["// IIR filter designer\r\nimport { BLT } from \"../digital/BLT.js\";\r\nimport { Response } from \"../digital/Response.js\";\r\nimport { SOS } from \"../digital/SOS.js\";\r\nimport { Prototypes } from \"../analog/Prototypes.js\";\r\nimport { IIRFilter } from \"../model/IIRFilter.js\";\r\n\r\nfunction divC(a,b){ const d=b.re*b.re+b.im*b.im||1e-300; return {re:(a.re*b.re+0*b.im)/d, im:(0*b.re-a.re*b.im)/d}; }\r\n\r\nexport class IIRDesigner {\r\n constructor(spec){\r\n this.spec = spec; // {family, kind, N, Rp?, Rs?, Fs, f1, f2?}\r\n }\r\n design(){\r\n const { family, kind, Fs } = this.spec;\r\n let { N, f1, f2 } = this.spec;\r\n const Rp=this.spec.Rp ?? 1, Rs=this.spec.Rs ?? 60;\r\n\r\n // Prototype\r\n let proto;\r\n switch(family){\r\n case 'butter': proto=Prototypes.butter(N); break;\r\n case 'cheby1': proto=Prototypes.cheby1(N, Rp); break;\r\n case 'cheby2': proto=Prototypes.cheby2(N, Rs); break;\r\n case 'ellip': proto=Prototypes.ellipHybrid(N, Rp, Rs); break;\r\n case 'linkwitz': {\r\n const lr=Prototypes.linkwitzRiley(N);\r\n N=lr.enforcedOrder ?? N;\r\n proto={poles:lr.poles, zeros:[]};\r\n break;\r\n }\r\n case 'bessel': proto=Prototypes.bessel(N); break;\r\n default: proto=Prototypes.butter(N);\r\n }\r\n proto.family=family; proto.order=N;\r\n\r\n // Map + BLT\r\n let zPoles=[], zZeros=[];\r\n if(kind==='lowpass'||kind==='highpass'){\r\n const Oc=BLT.prewarp(f1,Fs);\r\n const sPoles=proto.poles.map(p=> kind==='lowpass'? {re:p.re*Oc, im:p.im*Oc} : divC({re:Oc,im:0}, p));\r\n const sZeros=proto.zeros.map(z=> kind==='lowpass'? {re:z.re*Oc, im:z.im*Oc} : divC({re:Oc,im:0}, z));\r\n zPoles=sPoles.map(s=>BLT.sToZ(s,Fs));\r\n zZeros=sZeros.map(s=>BLT.sToZ(s,Fs));\r\n if((['butter','cheby1','bessel','linkwitz'].includes(family)) && kind==='highpass'){\r\n for(let k=0;k<N;k++) zZeros.push({re:1,im:0});\r\n }\r\n } else {\r\n if(!f2) throw new Error('bandpass/bandstop require f2');\r\n if(f2<f1){ const t=f1; f1=f2; f2=t; }\r\n const O1=BLT.prewarp(f1,Fs), O2=BLT.prewarp(f2,Fs), B=O2-O1, O0=Math.sqrt(O1*O2);\r\n const sPoles=[], sZeros=[];\r\n if(kind==='bandpass'){\r\n for(const p of proto.poles){ const [r1,r2]=BLT.quad({re:1,im:0},{re:-(p.re*B),im:-(p.im*B)},{re:O0*O0,im:0}); sPoles.push(r1,r2); }\r\n for(const z of proto.zeros){ const [r1,r2]=BLT.quad({re:1,im:0},{re:-(z.re*B),im:-(z.im*B)},{re:O0*O0,im:0}); sZeros.push(r1,r2); }\r\n if(['butter','cheby1','bessel','linkwitz'].includes(family)){ for(let k=0;k<N;k++) sZeros.push({re:0,im:0}); }\r\n zPoles=sPoles.map(s=>BLT.sToZ(s,Fs)); zZeros=sZeros.map(s=>BLT.sToZ(s,Fs));\r\n if(['butter','cheby1','bessel','linkwitz'].includes(family)){ for(let k=0;k<N;k++) zZeros.push({re:-1,im:0}); }\r\n else if(family==='cheby2' && (N%2===1)){ zZeros.push({re:1,im:0},{re:-1,im:0}); }\r\n } else {\r\n for(const p of proto.poles){ const [r1,r2]=BLT.quad({re:p.re,im:p.im},{re:-B,im:0},{re:p.re*O0*O0,im:p.im*O0*O0}); sPoles.push(r1,r2); }\r\n for(const z of proto.zeros){ const [r1,r2]=BLT.quad({re:z.re,im:z.im},{re:-B,im:0},{re:z.re*O0*O0,im:z.im*O0*O0}); sZeros.push(r1,r2); }\r\n for(let k=0;k<N;k++){ sZeros.push({re:0,im:O0},{re:0,im:-O0}); }\r\n zPoles=sPoles.map(s=>BLT.sToZ(s,Fs)); zZeros=sZeros.map(s=>BLT.sToZ(s,Fs));\r\n }\r\n }\r\n\r\n // SOS + gain normalization\r\n const sections = SOS.fromZPK(zZeros, zPoles, 1);\r\n let wRef=0;\r\n if(kind==='highpass') wRef=Math.PI;\r\n if(kind==='bandpass'){ const f0=Math.sqrt(f1*f2); wRef=2*Math.PI*(f0/Fs); }\r\n const Href=Response.H_w_IIR(sections, wRef), g=1/(Math.hypot(Href.re,Href.im)||1e-12);\r\n sections[0].b=[sections[0].b[0]*g, sections[0].b[1]*g, sections[0].b[2]*g];\r\n\r\n return new IIRFilter({sections, Fs, zPoles, zZeros});\r\n }\r\n}\r\n"],"names":["Prototypes","BLT","SOS","Response","IIRFilter"],"mappings":"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"}