当前位置:首页 > JavaScript

js实现FFT

2026-02-02 02:47:45JavaScript

FFT算法基础

快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的高效算法,用于将时域信号转换为频域表示。Cooley-Tukey算法是最常见的递归分治实现,时间复杂度为O(n log n)。

JavaScript实现步骤

复数类定义 处理FFT需要复数运算,先定义基础复数操作:

js实现FFT

class Complex {
  constructor(re = 0, im = 0) {
    this.re = re;
    this.im = im;
  }

  add(other) {
    return new Complex(this.re + other.re, this.im + other.im);
  }

  sub(other) {
    return new Complex(this.re - other.re, this.im - other.im);
  }

  mul(other) {
    return new Complex(
      this.re * other.re - this.im * other.im,
      this.re * other.im + this.im * other.re
    );
  }
}

递归FFT实现

js实现FFT

function fft(input) {
  const N = input.length;
  if (N <= 1) return input;

  // 分奇偶项
  const even = fft(input.filter((_, i) => i % 2 === 0));
  const odd = fft(input.filter((_, i) => i % 2 === 1));

  // 合并结果
  const output = Array(N).fill(new Complex());
  for (let k = 0; k < N / 2; k++) {
    const t = odd[k].mul(
      new Complex(
        Math.cos(-2 * Math.PI * k / N),
        Math.sin(-2 * Math.PI * k / N)
      )
    );
    output[k] = even[k].add(t);
    output[k + N/2] = even[k].sub(t);
  }
  return output;
}

使用示例

// 输入信号(需转换为复数形式)
const signal = [1, 1, 1, 1, 0, 0, 0, 0].map(x => new Complex(x));
const spectrum = fft(signal);

// 输出频域幅度
const magnitudes = spectrum.map(c => Math.sqrt(c.re2 + c.im2));
console.log(magnitudes);  // 输出各频率分量幅度

性能优化建议

对于生产环境使用,建议:

  • 使用迭代而非递归实现减少调用开销
  • 预计算旋转因子(twiddle factors)
  • 考虑WebAssembly版实现(如FFTW.js)
  • 注意输入长度必须是2的幂次

现成库推荐

如需直接应用,推荐以下成熟库:

  • math.js:包含完整的FFT实现
  • dsp.js:专攻数字信号处理的库
  • FFT.js:轻量级专用实现

以上实现展示了FFT的核心原理,实际应用中需根据具体场景调整窗函数、零填充等参数。

标签: jsFFT
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选…