NodeJS 构建具有多个频率的wav文件

fdbelqdn  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(145)

我们想建立一个wav文件与多个频率为指定的持续时间为每个频率。
我将尝试解释使用情形
假设我们需要构建一个wav文件,前5秒的频率范围为150 MHz到200 MHz(从频率150 MHz、150.1MHz、150.2MHz、最高200 MHz应在5秒内结束)接下来的10秒应该从200 MHz到300 MHz接下来的15秒应该从300 MHz到400 MHz一旦生成了所有3个wav文件,我们需要合并/concat所有这些3到一个30秒的单一wav文件(5+10+15)
任何人都可以让我们知道我们如何才能实现这一点。
我的代码:

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


let startFrequency = 2000000;
let stopFrequency = 6000000;
let totalsteps = (stopFrequency- startFrequency) * 10;

let start_freq_1 = startFrequency * 1 + 0.1;
start_sec = 0;
stop_sec = 10;
let secdiff = stopFrequency - startFrequency;
let timediff = Math.round((secdiff / totalsteps) * 10000) / 10000;

var file = fs.createWriteStream('hello_2.wav')
var t =[];
var cycle = Math.floor(44100000/stopFrequency);
var samplesLeft = 0.01 * 44100000;
var cycles = samplesLeft/cycle;

var first = tone({ freq: startFrequency, lengthInSecs: 0.01, volume: tone.MAX_16,  rate: 44100000,  shape: 'square' })
for(var i = start_freq_1; i < cycles; i+=0.1) {

var j = tone({ freq: i.toFixed(1),  lengthInSecs: timediff, volume: tone.MAX_16,  rate: 44100000,  shape: 'square' })

t.push(j)

}

res = first.concat(...t);

 
file.write(header(res.length * 2, {
  bitDepth: 32
}))
 
var data = Int32Array.from(res)
 
var size = data.length * 2 // 2 bytes per sample
if (Buffer.allocUnsafe) { 
  buffer = Buffer.allocUnsafe(size)
} else {
  buffer = new Buffer(size)
}
 
data.forEach(function (value, index) {
  buffer.writeInt16LE(value, index * 2)
})
 
file.write(buffer)
file.end()
gblwokeq

gblwokeq1#

问题与发送到音调函数的速率值有关,在tonegenerator index.js file中,我们可以看到

var cycle = Math.floor(rate/freq);
var samplesLeft = lengthInSecs * rate;
var cycles = samplesLeft/cycle;

由于与频率相比,速率较低,当调用Math.floor()函数时,周期变为零。无法计算周期,因此程序挂起。
根据频率调整速率,使周期变量不为零,而是为正值。

相关问题