当前位置:首页 > 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实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

vue js 实现排序

vue js 实现排序

Vue.js 实现排序的方法 在 Vue.js 中实现排序可以通过多种方式完成,包括使用计算属性、方法或直接操作数据。以下是几种常见的实现方式: 使用计算属性排序 计算属性可以自动响应数据变化并重新…