You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现分段扫频WAV文件生成并合并为单一30秒WAV文件?

实现多频段分段扫频WAV文件的生成与合并

需求拆解

要实现指定的分段扫频WAV,核心是按每个频段的时长要求,计算每个步进频率的持续时间,确保覆盖所有0.1MHz间隔的频率点,最后合并为单一文件:

  • 第一段:150MHz → 200MHz,共500个频率点,总时长5秒 → 每个频率持续0.01秒
  • 第二段:200MHz → 300MHz,共1000个频率点,总时长10秒 → 每个频率持续0.01秒
  • 第三段:300MHz → 400MHz,共1000个频率点,总时长15秒 → 每个频率持续0.015秒

完整实现代码

var tone = require('tonegenerator');
var header = require('waveheader');
var fs = require('fs');

// 生成指定频段的扫频音频数据
function generateSweep(startFreqHz, endFreqHz, stepFreqHz, totalDurationSec) {
    const freqCount = Math.floor((endFreqHz - startFreqHz) / stepFreqHz) + 1;
    const singleToneDuration = totalDurationSec / freqCount;
    let sweepData = [];

    for (let freq = startFreqHz; freq <= endFreqHz; freq += stepFreqHz) {
        const toneSegment = tone({
            freq: freq,
            lengthInSecs: singleToneDuration,
            volume: tone.MAX_16,
            rate: 44100000, // 保持原代码的采样率
            shape: 'sine'
        });
        sweepData = sweepData.concat(toneSegment);
    }
    return sweepData;
}

// 生成三个频段的音频数据(注意单位转换:1MHz = 1000000Hz,0.1MHz = 100000Hz)
const part1 = generateSweep(150000000, 200000000, 100000, 5);
const part2 = generateSweep(200000000, 300000000, 100000, 10);
const part3 = generateSweep(300000000, 400000000, 100000, 15);

// 合并三段音频数据
const fullAudioData = part1.concat(part2, part3);

// 写入最终WAV文件
const outputFile = fs.createWriteStream('multi-band-sweep.wav');
outputFile.write(header(fullAudioData.length * 2, { bitDepth: 16 }));

// 将音频数据转换为16位LE格式
const int16Array = Int16Array.from(fullAudioData);
const bufferSize = int16Array.length * 2;
const buffer = Buffer.allocUnsafe ? Buffer.allocUnsafe(bufferSize) : new Buffer(bufferSize);

int16Array.forEach((value, index) => {
    buffer.writeInt16LE(value, index * 2);
});

outputFile.write(buffer);
outputFile.end();

关键细节说明

  • 函数封装:generateSweep函数统一处理单频段扫频逻辑,通过计算单个频率的持续时间,确保总时长精准匹配需求。
  • 单位转换:所有频率参数需转为Hz(1MHz=1000000Hz),避免频率参数错误。
  • 高效合并:直接在内存中合并音频数组合并,无需生成中间文件,减少IO开销。
  • 格式兼容:沿用原代码的WAV头生成和16位小端格式写入逻辑,保证输出文件的兼容性。

可选:分文件生成后合并

如果需要先生成三个独立的WAV文件,可修改代码分别写入part1.wav、part2.wav、part3.wav,再用ffmpeg合并:

ffmpeg -i "concat:part1.wav|part2.wav|part3.wav" -c copy final-sweep.wav

内容的提问来源于stack exchange,提问作者Peter Stivin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:10:19