fft1d.mjs

import get from 'lodash-es/get.js'
import _fft1d from './_fft1d.mjs'


/**
 * FFT1D
 *
 * @param {Array} arr 輸入數據陣列
 * @param {Object} [opt={}] 選項物件
 * @param {String} [opt.type='dft'] 輸入計算方式字串,'dft'為使用mathjs對任意n點做真實n點DFT(2冪次走Cooley-Tukey、其餘走Chirp-Z),數據品質最佳但非2冪次時較慢;'pow2'為先補零至2冪次(最少4點)再使用ml-fft之radix-2 FFT,速度極快適合前端即時繪圖,但輸出點數為補零後之2冪次,且非2冪次輸入時頻率bin為DTFT插值而非真實n點DFT,預設'dft'
 * @return {Array} 回傳轉換後數據陣列
 * @example
 *
 * let arr
 * let res
 *
 * arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
 * res = wf.fft1d(arr)
 * console.log(res)
 * // => [
 * //   [ 120, 0 ],
 * //   [ -8, 40.21871593700678 ],
 * //   [ -8, 19.31370849898476 ],
 * //   [ -8.000000000000002, 11.972846101323912 ],
 * //   [ -8, 8 ],
 * //   [ -7.999999999999999, 5.345429103354391 ],
 * //   [ -8, 3.3137084989847594 ],
 * //   [ -8.000000000000002, 1.5912989390372623 ],
 * //   [ -8, 0 ],
 * //   [ -8, -1.5912989390372623 ],
 * //   [ -7.999999999999999, -3.3137084989847594 ],
 * //   [ -7.999999999999998, -5.345429103354393 ],
 * //   [ -7.999999999999999, -8 ],
 * //   [ -7.999999999999999, -11.97284610132391 ],
 * //   [ -7.999999999999997, -19.31370849898476 ],
 * //   [ -7.999999999999993, -40.21871593700678 ]
 * // ]
 *
 * arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
 * res = wf.fft1d(arr, { type: 'pow2' })
 * console.log(res)
 * // => [
 * //   [ 120, 0 ],
 * //   [ -8, 40.21871593700678 ],
 * //   [ -8, 19.31370849898476 ],
 * //   [ -7.999999999999999, 11.972846101323913 ],
 * //   [ -8, 8 ],
 * //   [ -8, 5.345429103354391 ],
 * //   [ -8, 3.313708498984761 ],
 * //   [ -7.999999999999999, 1.5912989390372623 ],
 * //   [ -8, 0 ],
 * //   [ -7.999999999999999, -1.5912989390372623 ],
 * //   [ -8, -3.313708498984761 ],
 * //   [ -8, -5.345429103354391 ],
 * //   [ -8, -8 ],
 * //   [ -7.999999999999999, -11.972846101323913 ],
 * //   [ -8, -19.31370849898476 ],
 * //   [ -8, -40.21871593700678 ]
 * // ]
 *
 * //非2冪次時, type='pow2'會補零至2冪次(3點補至4點), 輸出點數與'dft'不同
 * arr = [1, 2, 3]
 * res = wf.fft1d(arr, { type: 'pow2' })
 * console.log(res)
 * // => [ [ 6, 0 ], [ -2, -2 ], [ 2, 0 ], [ -2, 2 ] ]
 *
 */
let fft1d = (arr, opt = {}) => {

    //type
    let type = get(opt, 'type', 'dft')

    return _fft1d(arr, 'norm', type)
}


export default fft1d