当前位置:首页 > 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实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-contain…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统…