代码之家  ›  专栏  ›  技术社区  ›  Gershom Maes

用于信号处理的奇数函数?

  •  6
  • Gershom Maes  · 技术社区  · 7 年前

    let kInd = (k1, pow) => {
    
      let k2 = 0;
      let k3 = 0;
    
      for (let i = 0; i < pow; i++) {
        k3 = k1 >> 1;
        k2 = 2 * (k2 - k3) + k1;
        k1 = k3;
      }
    
      return k2;
    
    };
    

    let fft = samples => {
    
      let pow = Math.log2(samples.length); // `samples.length` is expected to be 2^int
    
      // ... a bunch of code to generate `rBuff` and `iBuff` arrays representing 
      // real and imaginary components of fourier values
    
      // Now make use of `kInd`; conditionally swap some indexes in `rBuff` and `iBuff`:
      for (let i = 0; i < rBuff.length; i++) {
        let k = kInd(i, pow);
        if (k >= i) continue;
        [ rBuff[i], rBuff[k] ] = [ rBuff[k], rBuff[i] ];
        [ iBuff[i], iBuff[k] ] = [ iBuff[k], iBuff[i] ];
      }
    
      // ... A bit of code to convert to power spectrum and return result
    
    };
    

    kInd 你在干什么? 我运行它来输出一些示例值;它看起来像是以几乎随机的顺序输出2的幂和作为它的 k1 导致完全错误的结果 fft .

    3 回复  |  直到 7 年前
        1
  •  4
  •   Martin Stone    7 年前

    这实现了 butterfly FFT算法的运算。

    例如,运行。。。

    console.log([0,1,2,3,4,5,6,7].map(i => kInd(i, 3)))
    

    [ 0, 4, 2, 6, 1, 5, 3, 7 ]
    

    ... 这是图中的映射:

    http://www.alwayslearn.com/DFT%20and%20FFT%20Tutorial/DFTandFFT_FFT_Butterfly_8_Input.html

        2
  •  1
  •   Nina Scholz    7 年前

    let kInd = (k1, pow) =>{
      let k2 = 0;
      let k3 = 0;
    
      for (let i = 0; i < pow; i++) {
        k3 = k1 >> 1;
        k2 = 2 * (k2 - k3) + k1;
        k1 = k3;
      }
      return k2;
    };
    
    const format = (s, p = 5) => s.toString().padStart(p);
    
    var i,
        l = 16,
        pow = Math.log2(l);
        
    for (i = 0; i < l; i++) {
        document.getElementById('out').innerHTML += `${format(i)} ${format(kInd(i, pow))}<br>`;
    }
    <pre id="out"></pre>
        3
  •  1
  •   Ruzihm aks786    7 年前

    对于任何给定的 pow ,以递增的方式输入 i k s、 周期长度为 2^pow . 有趣的是 结果是什么 k 大于或等于 (在下面的输出中以粗体显示)。

    k(i) >= i 从开始 i=0 :

    功率0: TFFF...

    电源1: TTFFF...

    电源2: TTFTFTFFF...

    电源3: TTTTFTFTFFF...

    TTTTFTTTFTFTFFFTFFF...

    TTTTTTTTFTTTFTTTFTFTFTFTFFFTFFFTFFF...

    let kInd = (k1, pow) => {
      let k2 = 0;
      let k3 = 0;
    
      for (let i = 0; i < pow; i++) {
        k3 = k1 >> 1;
        k2 = 2 * (k2 - k3) + k1;
        k1 = k3;
      }
      return k2;
    };
    
    for (let p = 0; p < 7; p++) {
      for (let i = 0; i < Math.pow(2, p) * 2; i++) {
        let k = kInd(i, p)
        if (k >= i) {
          $('#output').append("<p><b>" + i + "&nbsp;&nbsp;&nbsp;" + p + "->" + k + "</b></p>");
        } else {
          $('#output').append("<p>" + i + "&nbsp;&nbsp;&nbsp;" + p + "->" + k + "</p>");
        }
      }
      $('#output').append("<p>----------------</p>");
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="output"></div>

    我知道这不是一个答案,但我想帮助和评论是不适合的格式,我想放在这里。