Sat Oct 29 2016 14:14:35 GMT+0900 (JST)

BiquadFilterNode と IIRFilterNode の getFrequencyResponse を実装した。

計算部分は共通にしてある。式の意味はさっぱり分からない。

function getFilterResponse(b, a, freq, mag, phase, sampleRate) {
  for (let i = 0, imax = freq.length; i < imax; i++) {
    const w0 = 2 * Math.PI * (freq[i] / sampleRate);
    const ca = compute(a, Math.cos, w0);
    const sa = compute(a, Math.sin, w0);
    const cb = compute(b, Math.cos, w0);
    const sb = compute(b, Math.sin, w0);

    mag[i]   = Math.sqrt((cb * cb + sb * sb) / (ca * ca + sa * sa));
    phase[i] =  Math.atan2(sa, ca) - Math.atan2(sb, cb);
  }
}

function compute(values, fn, w0) {
  let result = 0;

  for (let i = 0, imax = values.length; i < imax; i++) {
    result += values[i] * fn(w0 * i);
  }

  return result;
}