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

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…