DSP (Digital Signal Processing) functions
Archived 5 months ago
T
Tiffany
Copy Paster!
```js
zeros=n=>Array(n).fill(0);
linspace=(s,e,n)=>Array.from({length:n},(_,i)=>s+i*((e-s)/(n-1)));
cAdd=(a,b)=>[a[0]+b[0],a[1]+b[1]];cSub=(a,b)=>[a[0]-b[0],a[1]-b[1]];
cMul=(a,b)=>[a[0]*b[0]-a[1]*b[1],a[0]*b[1]+a[1]*b[0]];
cDiv=(a,b)=>[
(a[0]*b[0]+a[1]*b[1])/(b[0]**2+b[1]**2),
(a[1]*b[0]-a[0]*b[1])/(b[0]**2+b[1]**2)
];
cMag=c=>sqrt(c[0]**2+c[1]**2);cPhase=c=>atan2(c[1],c[0]);
mix=(a,b,t)=>a+(b-a)*t;mod=(n,m)=>(n%m+m)%m;fract=x=>(x%1+1)%1;
rndRang=(mn,mx)=>mn+(mx-mn)*Math.random();
pow2=(x,y)=>(abs(x)**y)*sign(x);safe=x=>isFinite(x)?x:0;
clamp=(x,mn,mx)=>min(max(x,mn),mx);
normalize=(a,low=-1,high=1)=>{
let mn=min(...a),mx=max(...a);
if(mn===mx)return a.map(()=>low);
return a.map(v=>(v-mn)*(high-low)/(mx-mn)+low);
};
movAvg=(s,w)=>{const r=[];for(let i=0;i<=s.length-w;i++){let t=0;for(let j=0;j<w;j++)t+=s[i+j];r.push(t/w)}return r};
TAU=Math.PI*2;
FFT=(x,inverse=false)=>{const N=x.length;if(N<=1)return x;const even=[],odd=[];for(let i=0;i<N;i+=2){even.push(x[i]);odd.push(x[i+1]?x[i+1]:[0,0])}const e=FFT(even,inverse),o=FFT(odd,inverse);const T=[];const angle=TAU*(inverse?1:-1)/N;for(let k=0;k<N/2;k++){const t=cMul([Math.cos(angle*k),Math.sin(angle*k)],o[k]);T[k]=cAdd(e[k],t);T[k+N/2]=cSub(e[k],t)}return T};
IFFT=a=>{const N=a.length;return FFT(a,true).map(complex=>[complex[0]/N,complex[1]/N]);};
readNearest=(a,i)=>a[mod(floor(i),a.length)];
readLinear=(a,i)=>mix(a[mod(floor(i),a.length)],a[mod(floor(i)+1,a.length)],fract(i));
```
What more should I add?
