当前位置:首页 > JavaScript

js实现信号波图

2026-04-04 17:21:38JavaScript

使用Canvas绘制信号波图

在JavaScript中,可以使用Canvas API来绘制信号波图。以下是一个简单的实现示例:

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

function drawSineWave() {
    ctx.clearRect(0, 0, width, height);
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = '#0095DD';

    for (let x = 0; x < width; x++) {
        const y = height/2 + Math.sin(x * 0.05) * 50;
        if (x === 0) {
            ctx.moveTo(x, y);
        } else {
            ctx.lineTo(x, y);
        }
    }

    ctx.stroke();
}

drawSineWave();

使用Web Audio API生成音频信号

Web Audio API可以用来生成和处理音频信号,并可视化波形:

js实现信号波图

const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const analyser = audioContext.createAnalyser();

oscillator.connect(analyser);
analyser.connect(audioContext.destination);

oscillator.type = 'sine';
oscillator.frequency.value = 440;

analyser.fftSize = 2048;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);

function drawWaveform() {
    requestAnimationFrame(drawWaveform);
    analyser.getByteTimeDomainData(dataArray);

    ctx.fillStyle = 'rgb(200, 200, 200)';
    ctx.fillRect(0, 0, width, height);
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'rgb(0, 0, 0)';
    ctx.beginPath();

    const sliceWidth = width * 1.0 / bufferLength;
    let x = 0;

    for (let i = 0; i < bufferLength; i++) {
        const v = dataArray[i] / 128.0;
        const y = v * height / 2;

        if (i === 0) {
            ctx.moveTo(x, y);
        } else {
            ctx.lineTo(x, y);
        }

        x += sliceWidth;
    }

    ctx.lineTo(width, height/2);
    ctx.stroke();
}

oscillator.start();
drawWaveform();

使用第三方库实现高级波形

使用Wave.js等第三方库可以更简单地实现信号波图:

js实现信号波图

import Wave from 'wave.js';

const wave = new Wave({
    container: document.getElementById('wave-container'),
    color: '#4285F4',
    progress: 0.5,
    height: 100,
    amplitude: 40,
    speed: 0.15,
    frequency: 2
});

wave.animate();

响应式信号波图实现

创建响应式信号波图,可以监听窗口大小变化并重绘:

function resizeCanvas() {
    canvas.width = window.innerWidth * 0.8;
    canvas.height = window.innerHeight * 0.3;
    drawSineWave();
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

添加交互功能

为信号波图添加鼠标交互功能,允许用户改变波形参数:

let frequency = 0.05;
let amplitude = 50;

canvas.addEventListener('mousemove', (e) => {
    frequency = e.clientX / width * 0.1;
    amplitude = e.clientY / height * 100;
    drawSineWave();
});

这些方法提供了从基础到高级的信号波图实现方式,可以根据具体需求选择合适的方案。Canvas API适合自定义程度高的场景,Web Audio API适合音频相关的可视化,而第三方库可以快速实现复杂效果。

标签: 信号js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现求导

js实现求导

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

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…