function _czt (arr) {
    const n = arr.length
    const w = exp(divideScalar(multiplyScalar(-1, multiplyScalar(I, tau)), n))
    const chirp = []
    for (let i = 1 - n; i < n; i++) {
      chirp.push(pow(w, divideScalar(pow(i, 2), 2)))
    }
    const N2 = pow(2, ceil(log2(n + n - 1)))
    const xp = [
      ...new Array(n).fill(0).map((_, i) => multiplyScalar(arr[i], chirp[n - 1 + i])),
      ...new Array(N2 - n).fill(0)
    ]
    const ichirp = [
      ...new Array(n + n - 1).fill(0).map((_, i) => divideScalar(1, chirp[i])),
      ...new Array(N2 - (n + n - 1)).fill(0)
    ]
    const fftXp = _fft(xp)
    const fftIchirp = _fft(ichirp)
    const fftProduct = new Array(N2).fill(0).map((_, i) => multiplyScalar(fftXp[i], fftIchirp[i]))
    const ifftProduct = dotDivide(conj(_ndFft(conj(fftProduct))), N2)
    const ret = []
    for (let i = n - 1; i < n + n - 1; i++) {
      ret.push(multiplyScalar(ifftProduct[i], chirp[i]))
    }
    return ret
  }
Perform an 1-dimensional non-power-of-2 Fourier transform using Chirp-Z Transform

@param {Array} arr      The array
@return {Array}         resulting array