{"ast":null,"code":"/*\r\n This file contains the code for LPC generation and its usage.\r\n The code used to generate the LPC was ported  from C++ code originally in the staRt iPad app.\r\n */\n/*\r\n This file contains the code for LPC generation and its usage.\r\n The code used to generate the LPC was ported  from C++ code originally in the staRt iPad app.\r\n */\n\nimport { Complex } from './complex.jsx';\nconst _PI = 3.14159265;\n//var _LPC_ORDER = 80;\nconst _LPC_ORDER = 64;\nconst _MAX_LPC_ORDER = _LPC_ORDER + 1;\nlet delsmp = 0.0;\nconst computeLPC = audio_buffer => {\n  const lpc_coeffs = [];\n  for (let i = 0; i < _LPC_ORDER + 1; i++) {\n    lpc_coeffs.push(0);\n  }\n  const buffer_size = audio_buffer.length;\n  const win = _hann_window(buffer_size);\n  const mean = _meanv(audio_buffer, buffer_size);\n  // remove the mean\n  audio_buffer = _vsadd(audio_buffer, -mean, buffer_size);\n  audio_buffer = _vmul(audio_buffer, win, buffer_size);\n\n  // Original code uses temp buffer that we were able to remove in javascript version.\n  audio_buffer = _highPassFilter(audio_buffer, buffer_size);\n  const coeffs = _lpc_from_data(_LPC_ORDER, buffer_size, audio_buffer);\n  lpc_coeffs[0] = 1.0;\n  for (let i = 1; i < _LPC_ORDER + 1; i++) {\n    lpc_coeffs[i] = -coeffs[i - 1];\n  }\n  return lpc_coeffs;\n};\n\n// Originally this set the value of \"win\"\n// We should probably cache this result as it always generates the same value.\n// Dunno why this is ++i in the original code, out of bounds error? Fixed in mine.\n// CHECKED (Off by a bit for floating)\nconst _hann_window = buffer_size => {\n  const win = [];\n  const W = 0.8165;\n  for (let i = 0; i < buffer_size; ++i) {\n    win.push(W * (1 - Math.cos(2 * _PI * i / buffer_size)));\n  }\n  return win;\n};\nconst _meanv = (buffer, buffer_size) => {\n  let sum = 0;\n  for (let i = 0; i < buffer_size; i++) {\n    sum += buffer[i];\n  }\n  return sum / (buffer_size * 1.0);\n};\nconst _vsadd = (audio_buffer, v, buffer_size) => {\n  const result = [];\n  for (let i = 0; i < buffer_size; i++) {\n    result.push(audio_buffer[i] + v);\n  }\n  return result;\n};\nconst _vmul = (buffer_a, buffer_b, buffer_size) => {\n  const result = [];\n  for (let i = 0; i < buffer_size; i++) {\n    result.push(buffer_a[i] * buffer_b[i]);\n  }\n  return result;\n};\nconst _highPassFilter = (inBuffer, winSize) => {\n  const result = [];\n  const MAGIC_FACTOR = .95;\n  for (let i = 0; i < winSize; i++) {\n    result.push(inBuffer[i] - MAGIC_FACTOR * delsmp);\n    delsmp = inBuffer[i];\n  }\n  return result;\n};\nconst initMatrix = (rows, cols) => {\n  const arr = [];\n  for (let x = 0; x < rows; x++) {\n    arr.push([]);\n    for (let y = 0; y < cols; y++) {\n      arr[x].push(0);\n    }\n  }\n  return arr;\n};\nconst _minvert = (size, mat) => {\n  let item,\n    row,\n    col = 0;\n  let temp = 0.0;\n  // Res appears to be result, but it is actually mat that is modified.\n  let res = initMatrix(_MAX_LPC_ORDER, _MAX_LPC_ORDER);\n  for (row = 1; row <= size; row++) {\n    for (col = 1; col <= size; col++) {\n      if (row == col) {\n        res[row][col] = 1.0;\n      } else {\n        res[row][col] = 0.0;\n      }\n    }\n  }\n  for (item = 1; item <= size; item++) {\n    // TODO Check if this == 0 is correctly handling floats.\n    if (mat[item][item] == 0) {\n      for (row = item; row <= size; row++) {\n        for (col = 1; col <= size; col++) {\n          mat[item][col] = mat[item][col] + mat[row][col];\n          res[item][col] = res[item][col] + res[col][row];\n        }\n      }\n    }\n    for (row = item; row <= size; row++) {\n      temp = mat[row][item];\n      if (temp != 0) {\n        for (col = 1; col <= size; col++) {\n          mat[row][col] = mat[row][col] / temp;\n          res[row][col] = res[row][col] / temp;\n        }\n      }\n    }\n    if (item != size) {\n      for (row = item + 1; row <= size; row++) {\n        temp = mat[row][item];\n        if (temp != 0) {\n          for (col = 1; col <= size; col++) {\n            mat[row][col] = mat[row][col] - mat[item][col];\n            res[row][col] = res[row][col] - res[item][col];\n          }\n        }\n      }\n    }\n  }\n  for (item = 2; item <= size; item++) {\n    for (row = 1; row < item; row++) {\n      temp = mat[row][item];\n      for (col = 1; col <= size; col++) {\n        mat[row][col] = mat[row][col] - temp * mat[item][col];\n        res[row][col] = res[row][col] - temp * res[item][col];\n      }\n    }\n  }\n  for (row = 1; row <= size; row++) {\n    for (col = 1; col <= size; col++) {\n      mat[row][col] = res[row][col];\n    }\n  }\n  return mat;\n};\n\n// result is an array size of _MAX_BLOCK_SIZE\nconst _autocorr = (size, data) => {\n  const result = []; // 1 D array of max size _MAX_BLOCK_SIZE\n\n  // assert(_MAX_BLOCK_SIZE* 2 >= size);\n  let i,\n    j,\n    k = 0; // long\n  let temp,\n    norm = 0.0; // double\n  for (i = 0; i < size / 2; i++) {\n    result.push(0);\n    for (j = 0; j < size - i - 1; j++) {\n      result[i] += data[i + j] * data[j];\n    }\n  }\n\n  // find positive slope, store in j\n  temp = result[0];\n  j = Math.floor(size * 0.02); // Magic 0.02 number\n  while (result[j] < temp && j < size / 2) {\n    temp = result[j];\n    j += 1;\n  }\n  temp = 0.0;\n  for (i = j; i < size * 0.5; i++) {\n    if (result[i] > temp) {\n      j = i;\n      temp = result[i];\n    }\n  }\n  norm = 1.0 / size;\n  k = size / 2;\n  for (i = 0; i < size / 2; i++) {\n    result[i] *= (k - i) * norm;\n  }\n  // There is some weird code in the original source\n  // that sets the local value of j before returning. Dunno why.\n  // It is omited here.\n  return result;\n};\n\n// order is lpc order\n// size is audio_buffer size\n// data is audio_buffer\n// coeffs is the result, a double array the size of order.\nconst _lpc_from_data = (order, size, data) => {\n  const coeffs = [];\n  let r_mat = initMatrix(order, order); // Will be 2d array order x order size.\n  let i,\n    j = 0; // longs\n\n  const corr = _autocorr(size, data);\n  for (i = 1; i < order; i++) {\n    for (j = 1; j < order; j++) {\n      r_mat[i][j] = corr[Math.abs(i - j)];\n    }\n  }\n  r_mat = _minvert(order - 1, r_mat);\n  for (i = 0; i < order - 1; i++) {\n    coeffs.push(0.0);\n    for (j = 0; j < order - 1; j++) {\n      coeffs[i] += r_mat[i + 1][j + 1] * corr[1 + j];\n    }\n  }\n  return coeffs;\n};\n\n// theta is resused on every call to getFrequenciesFromLPC\n// so we declare it here as a global variable and initialize it only once in the function\n// getFrequenciesFromLPC.\nlet theta = null;\n\n// TODO Should pass an options dictionary instead of a long list of parameters.\nconst getFrequenciesFromLPC = (lpcCoeffs, resolution, maxFrequency, sampleRate) => {\n  // H(z) = 1/[1-(a1*z^-1 + a2*z^-2 + ... + aN*z^-N)\n  if (theta === null) {\n    theta = new Array(resolution);\n    const inc = maxFrequency / resolution * Math.PI / (sampleRate / 2);\n    for (let i = 0; i <= resolution; i++) {\n      theta[i] = inc * i;\n    }\n  }\n  const H = new Array(resolution);\n  for (let z = 0; z < resolution; z++) {\n    let temp = new Complex(0, 0);\n    for (let j = 0; j < lpcCoeffs.length; j++) {\n      let v = new Complex(Math.cos(theta[z] * j + 1), Math.sin(theta[z] * j + 1));\n      v = new Complex(lpcCoeffs[j]).mul(v);\n      temp = temp.add(v);\n    }\n    H[z] = new Complex(1).div(temp);\n  }\n  for (let i = 0; i < H.length; i++) {\n    H[i] = 1 * Math.log10(H[i].abs());\n    //H[i] = H[i].abs()\n  }\n  return H;\n};\nconst _biggerThanMyNeighbors = (mags, myLoc, numNeighbors) => {\n  let result = true;\n  // TODO Figure out this magic 5 number. How Local should be based on frequency resolution, atm 50hz.\n  for (let i = myLoc - 5; i < myLoc + numNeighbors; i++) {\n    result = result && mags[myLoc] > mags[i];\n  }\n  return result;\n};\nconst getPeaks = mags => {\n  const MIN_ENERGY = .1;\n  // To improve this we need to make sure we only take the peaks with the most energy for NUM_PEAKS.\n  // Peaks are when slope goes from positive to negative.\n  const HOW_LOCAL = Math.floor(mags.length / 25.0);\n  let slope = 0;\n  let i = 0;\n  const peaks = [];\n  while (slope == 0 && i < mags.length) {\n    if (mags[i] < mags[i + 1]) {\n      slope = 1;\n      break;\n    } else if (mags[i] > mags[i + 1]) {\n      slope = -1;\n    }\n    i++;\n  }\n  for (; i < mags.length; i++) {\n    if (slope == 1) {\n      if (mags[i] > mags[i + 1]) {\n        if (mags[i] > MIN_ENERGY) {\n          if (i > HOW_LOCAL && i < mags.length - HOW_LOCAL && _biggerThanMyNeighbors(mags, i, HOW_LOCAL)) ; // What is the purpose of this if statement? -- Jay\n          {\n            peaks.push(i);\n          }\n        }\n        slope = -1;\n      }\n    } else {\n      // slope == -1\n      if (mags[i] < mags[i + 1]) {\n        slope = 1;\n      }\n    }\n  }\n  return peaks;\n};\nexport { computeLPC, getPeaks, getFrequenciesFromLPC };","map":{"version":3,"names":["Complex","_PI","_LPC_ORDER","_MAX_LPC_ORDER","delsmp","computeLPC","audio_buffer","lpc_coeffs","i","push","buffer_size","length","win","_hann_window","mean","_meanv","_vsadd","_vmul","_highPassFilter","coeffs","_lpc_from_data","W","Math","cos","buffer","sum","v","result","buffer_a","buffer_b","inBuffer","winSize","MAGIC_FACTOR","initMatrix","rows","cols","arr","x","y","_minvert","size","mat","item","row","col","temp","res","_autocorr","data","j","k","norm","floor","order","r_mat","corr","abs","theta","getFrequenciesFromLPC","lpcCoeffs","resolution","maxFrequency","sampleRate","Array","inc","PI","H","z","sin","mul","add","div","log10","_biggerThanMyNeighbors","mags","myLoc","numNeighbors","getPeaks","MIN_ENERGY","HOW_LOCAL","slope","peaks"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/gavt/Wave/lib/lpc.js"],"sourcesContent":["/*\r\n This file contains the code for LPC generation and its usage.\r\n The code used to generate the LPC was ported  from C++ code originally in the staRt iPad app.\r\n */\r\n/*\r\n This file contains the code for LPC generation and its usage.\r\n The code used to generate the LPC was ported  from C++ code originally in the staRt iPad app.\r\n */\r\n\r\n import {Complex} from './complex.jsx';\r\n\r\n const _PI = 3.14159265;\r\n //var _LPC_ORDER = 80;\r\n const _LPC_ORDER = 64;\r\n const _MAX_LPC_ORDER = _LPC_ORDER + 1;\r\n \r\n let delsmp = 0.0;\r\n \r\n const computeLPC = (audio_buffer) => {\r\n     const lpc_coeffs = [];\r\n     for (let i = 0; i < _LPC_ORDER + 1; i++) {\r\n         lpc_coeffs.push(0);\r\n     }\r\n \r\n \r\n     const buffer_size = audio_buffer.length;\r\n     const win = _hann_window(buffer_size);\r\n \r\n     const mean = _meanv(audio_buffer, buffer_size);\r\n     // remove the mean\r\n     audio_buffer = _vsadd(audio_buffer, -mean, buffer_size);\r\n \r\n \r\n     audio_buffer = _vmul(audio_buffer, win, buffer_size);\r\n \r\n     // Original code uses temp buffer that we were able to remove in javascript version.\r\n     audio_buffer = _highPassFilter(audio_buffer, buffer_size);\r\n \r\n \r\n     const coeffs = _lpc_from_data(_LPC_ORDER, buffer_size, audio_buffer);\r\n     lpc_coeffs[0] = 1.0;\r\n     for (let i = 1; i < _LPC_ORDER + 1; i++) {\r\n         lpc_coeffs[i] = -coeffs[i - 1];\r\n     }\r\n     return lpc_coeffs;\r\n };\r\n \r\n // Originally this set the value of \"win\"\r\n // We should probably cache this result as it always generates the same value.\r\n // Dunno why this is ++i in the original code, out of bounds error? Fixed in mine.\r\n // CHECKED (Off by a bit for floating)\r\n const _hann_window = (buffer_size) => {\r\n     const win = [];\r\n     const W = 0.8165;\r\n     for (let i = 0; i < buffer_size; ++i) {\r\n         win.push(W * (1 - Math.cos(2 * _PI * i / buffer_size)));\r\n     }\r\n     return win;\r\n };\r\n \r\n const _meanv = (buffer, buffer_size) => {\r\n     let sum = 0;\r\n     for (let i = 0; i < buffer_size; i++) {\r\n         sum += buffer[i];\r\n     }\r\n     return sum / (buffer_size * 1.0);\r\n };\r\n \r\n const _vsadd = (audio_buffer, v, buffer_size) => {\r\n     const result = [];\r\n     for (let i = 0; i < buffer_size; i++) {\r\n         result.push(audio_buffer[i] + v);\r\n     }\r\n     return result;\r\n };\r\n \r\n const _vmul = (buffer_a, buffer_b, buffer_size) => {\r\n     const result = [];\r\n     for (let i = 0; i < buffer_size; i++) {\r\n         result.push(buffer_a[i] * buffer_b[i]);\r\n     }\r\n     return result;\r\n };\r\n \r\n const _highPassFilter = (inBuffer, winSize) => {\r\n     const result = [];\r\n     const MAGIC_FACTOR = .95;\r\n     for (let i = 0; i < winSize; i++) {\r\n         result.push(inBuffer[i] - MAGIC_FACTOR * delsmp);\r\n         delsmp = inBuffer[i];\r\n     }\r\n     return result;\r\n };\r\n \r\n const initMatrix = (rows, cols) => {\r\n     const arr = [];\r\n     for (let x = 0; x < rows; x++) {\r\n         arr.push([]);\r\n         for (let y = 0; y < cols; y++) {\r\n             arr[x].push(0);\r\n         }\r\n     }\r\n     return arr;\r\n };\r\n \r\n const _minvert = (size, mat) => {\r\n     let item, row, col = 0;\r\n     let temp = 0.0;\r\n     // Res appears to be result, but it is actually mat that is modified.\r\n     let res = initMatrix(_MAX_LPC_ORDER, _MAX_LPC_ORDER);\r\n \r\n     for (row = 1; row <= size; row++) {\r\n         for (col = 1; col <= size; col++) {\r\n             if (row == col) {\r\n                 res[row][col] = 1.0;\r\n             }\r\n             else {\r\n                 res[row][col] = 0.0;\r\n             }\r\n         }\r\n     }\r\n \r\n     for (item = 1; item <= size; item++) {\r\n         // TODO Check if this == 0 is correctly handling floats.\r\n         if (mat[item][item] == 0) {\r\n             for (row = item; row <= size; row++) {\r\n                 for (col = 1; col <= size; col++) {\r\n                     mat[item][col] = mat[item][col] + mat[row][col];\r\n                     res[item][col] = res[item][col] + res[col][row];\r\n                 }\r\n             }\r\n         }\r\n \r\n         for (row = item; row <= size; row++) {\r\n             temp = mat[row][item];\r\n             if (temp != 0) {\r\n                 for (col = 1; col <= size; col++) {\r\n                     mat[row][col] = mat[row][col] / temp;\r\n                     res[row][col] = res[row][col] / temp;\r\n                 }\r\n             }\r\n         }\r\n \r\n         if (item != size) {\r\n             for (row = item + 1; row <= size; row++) {\r\n                 temp = mat[row][item];\r\n                 if (temp != 0) {\r\n                     for (col = 1; col <= size; col++) {\r\n                         mat[row][col] = mat[row][col] - mat[item][col];\r\n                         res[row][col] = res[row][col] - res[item][col];\r\n                     }\r\n                 }\r\n             }\r\n         }\r\n     }\r\n \r\n     for (item = 2; item <= size; item++) {\r\n         for (row = 1; row < item; row++) {\r\n             temp = mat[row][item];\r\n             for (col = 1; col <= size; col++) {\r\n                 mat[row][col] = mat[row][col] - temp * mat[item][col];\r\n                 res[row][col] = res[row][col] - temp * res[item][col];\r\n             }\r\n         }\r\n     }\r\n \r\n     for (row = 1; row <= size; row++) {\r\n         for (col = 1; col <= size; col++) {\r\n             mat[row][col] = res[row][col];\r\n         }\r\n     }\r\n \r\n     return mat;\r\n };\r\n \r\n // result is an array size of _MAX_BLOCK_SIZE\r\n const _autocorr = (size, data) => {\r\n     const result = []; // 1 D array of max size _MAX_BLOCK_SIZE\r\n \r\n     // assert(_MAX_BLOCK_SIZE* 2 >= size);\r\n     let i, j, k = 0; // long\r\n     let temp, norm = 0.0; // double\r\n     for (i = 0; i < size / 2; i++) {\r\n         result.push(0);\r\n         for (j = 0; j < size - i - 1; j++) {\r\n             result[i] += data[i + j] * data[j];\r\n         }\r\n     }\r\n \r\n     // find positive slope, store in j\r\n     temp = result[0];\r\n     j = Math.floor(size * 0.02); // Magic 0.02 number\r\n     while (result[j] < temp && j < size / 2) {\r\n         temp = result[j];\r\n         j += 1;\r\n     }\r\n \r\n     temp = 0.0;\r\n     for (i = j; i < size * 0.5; i++) {\r\n         if (result[i] > temp) {\r\n             j = i;\r\n             temp = result[i];\r\n         }\r\n     }\r\n \r\n     norm = 1.0 / size;\r\n     k = size / 2;\r\n     for (i = 0; i < size / 2; i++) {\r\n         result[i] *= (k - i) * norm;\r\n     }\r\n     // There is some weird code in the original source\r\n     // that sets the local value of j before returning. Dunno why.\r\n     // It is omited here.\r\n     return result;\r\n };\r\n \r\n // order is lpc order\r\n // size is audio_buffer size\r\n // data is audio_buffer\r\n // coeffs is the result, a double array the size of order.\r\n const _lpc_from_data = (order, size, data) => {\r\n     const coeffs = [];\r\n     let r_mat = initMatrix(order, order); // Will be 2d array order x order size.\r\n     let i, j = 0; // longs\r\n \r\n     const corr = _autocorr(size, data);\r\n     for (i = 1; i < order; i++) {\r\n         for (j = 1; j < order; j++) {\r\n             r_mat[i][j] = corr[Math.abs(i - j)];\r\n         }\r\n     }\r\n     r_mat = _minvert(order - 1, r_mat);\r\n     for (i = 0; i < order - 1; i++) {\r\n         coeffs.push(0.0);\r\n         for (j = 0; j < order - 1; j++) {\r\n             coeffs[i] += r_mat[i + 1][j + 1] * corr[1 + j];\r\n         }\r\n     }\r\n     return coeffs;\r\n };\r\n \r\n // theta is resused on every call to getFrequenciesFromLPC\r\n // so we declare it here as a global variable and initialize it only once in the function\r\n // getFrequenciesFromLPC.\r\n let theta = null;\r\n \r\n // TODO Should pass an options dictionary instead of a long list of parameters.\r\n const getFrequenciesFromLPC = (lpcCoeffs, resolution, maxFrequency, sampleRate) => {\r\n     // H(z) = 1/[1-(a1*z^-1 + a2*z^-2 + ... + aN*z^-N)\r\n     if (theta === null) {\r\n         theta = new Array(resolution);\r\n         const inc = (maxFrequency / resolution) * Math.PI / (sampleRate / 2);\r\n         for (let i = 0; i <= resolution; i++) {\r\n             theta[i] = inc * i;\r\n         }\r\n     }\r\n \r\n     const H = new Array(resolution);\r\n \r\n     for (let z = 0; z < resolution; z++) {\r\n         let temp = new Complex(0, 0);\r\n \r\n         for (let j = 0; j < lpcCoeffs.length; j++) {\r\n             let v = new Complex(\r\n                 Math.cos(theta[z] * j + 1),\r\n                 Math.sin(theta[z] * j + 1));\r\n             v = new Complex(lpcCoeffs[j]).mul(v);\r\n             temp = temp.add(v);\r\n         }\r\n         H[z] = new Complex(1).div(temp);\r\n     }\r\n \r\n     for (let i = 0; i < H.length; i++) {\r\n         H[i] = 1 * Math.log10(H[i].abs());\r\n         //H[i] = H[i].abs()\r\n     }\r\n     return H;\r\n };\r\n \r\n \r\n const _biggerThanMyNeighbors = (mags, myLoc, numNeighbors) => {\r\n     let result = true;\r\n     // TODO Figure out this magic 5 number. How Local should be based on frequency resolution, atm 50hz.\r\n     for (let i = myLoc - 5; i < myLoc + numNeighbors; i++) {\r\n         result = result && mags[myLoc] > mags[i];\r\n     }\r\n     return result;\r\n };\r\n \r\n const getPeaks = (mags) => {\r\n     const MIN_ENERGY = .1;\r\n     // To improve this we need to make sure we only take the peaks with the most energy for NUM_PEAKS.\r\n     // Peaks are when slope goes from positive to negative.\r\n     const HOW_LOCAL = Math.floor(mags.length / 25.0);\r\n     let slope = 0;\r\n     let i = 0;\r\n     const peaks = [];\r\n     while (slope == 0 && i < mags.length) {\r\n         if (mags[i] < mags[i + 1]) {\r\n             slope = 1;\r\n             break;\r\n         } else if (mags[i] > mags[i + 1]) {\r\n             slope = -1;\r\n         }\r\n         i++;\r\n     }\r\n     for (; i < mags.length; i++) {\r\n         if (slope == 1) {\r\n             if (mags[i] > mags[i + 1]) {\r\n                 if (mags[i] > MIN_ENERGY) {\r\n                     if (i > HOW_LOCAL && i < mags.length - HOW_LOCAL && _biggerThanMyNeighbors(mags, i, HOW_LOCAL)); // What is the purpose of this if statement? -- Jay\r\n                     {\r\n                         peaks.push(i);\r\n                     }\r\n                 }\r\n                 slope = -1;\r\n             }\r\n         } else { // slope == -1\r\n             if (mags[i] < mags[i + 1]) {\r\n                 slope = 1;\r\n             }\r\n         }\r\n     }\r\n     return peaks;\r\n };\r\n \r\n export {computeLPC, getPeaks, getFrequenciesFromLPC};\r\n "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}