当前位置:首页 > JavaScript

js 实现频谱

2026-02-01 12:10:40JavaScript

js 实现频谱

js 实现频谱

JavaScript 实现频谱分析的方法

频谱分析通常涉及音频信号的频率分解,可通过 Web Audio API 实现。以下是核心实现步骤:

使用 Web Audio API 获取音频频谱

// 创建音频上下文
const audioContext = new (window.AudioContext || window.webkitAudioContext)();

// 获取音频源(例如通过麦克风或音频文件)
navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const source = audioContext.createMediaStreamSource(stream);
    const analyser = audioContext.createAnalyser();

    // 连接音频源到分析器
    source.connect(analyser);
    analyser.connect(audioContext.destination);

    // 设置FFT大小(决定频率分段的精度)
    analyser.fftSize = 256;
    const bufferLength = analyser.frequencyBinCount;
    const dataArray = new Uint8Array(bufferLength);

    // 实时获取频谱数据
    function update() {
      analyser.getByteFrequencyData(dataArray);
      // 此处可渲染频谱(如使用Canvas)
      requestAnimationFrame(update);
    }
    update();
  });

可视化频谱(使用Canvas)

const canvas = document.getElementById('visualizer');
const ctx = canvas.getContext('2d');
const WIDTH = canvas.width;
const HEIGHT = canvas.height;

function draw() {
  requestAnimationFrame(draw);
  analyser.getByteFrequencyData(dataArray);

  ctx.clearRect(0, 0, WIDTH, HEIGHT);
  const barWidth = (WIDTH / bufferLength) * 2.5;
  let x = 0;

  for (let i = 0; i < bufferLength; i++) {
    const barHeight = dataArray[i] / 2;
    ctx.fillStyle = `hsl(${i * 2}, 100%, 50%)`;
    ctx.fillRect(x, HEIGHT - barHeight, barWidth, barHeight);
    x += barWidth + 1;
  }
}
draw();

关键参数说明

  • fftSize: 取值范围为32-32768(必须是2的幂),值越大频率分辨率越高但性能开销越大。
  • frequencyBinCount: 等于fftSize/2,表示可获取的频率数据点数。
  • getByteFrequencyData(): 返回0-255的归一化频率数据数组。

可选增强方案

  • 平滑处理:对连续帧的数据做移动平均减少突变
  • 对数缩放:人类听觉对频率的感知呈对数关系,可对低频段增加权重
  • 三维渲染:使用WebGL实现更复杂的频谱粒子效果

浏览器兼容性提示

  • 需处理webkit前缀的旧版API
  • Safari需要用户手势(如点击事件)后才能启动音频上下文

以上代码组合即可实现基础的音频频谱分析与可视化效果,可根据需求调整FFT大小、颜色方案或渲染方式。

标签: 频谱js
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…