如何实现分段扫频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
相关产品推荐
相关产品推荐

