PHP sin函数上升
我使用此函数在php中生成wav抖动音调:PHP sin函数上升,php,audio,wav,Php,Audio,Wav,我使用此函数在php中生成wav抖动音调: $samples = array(); $amplitude = 8192; $sampleRate = 8000; $samplesCount = 300000; for ($n = 0; $n < $samplesCount; $n++) { $freqOfTone= 4*sin($n*0.00628)+440; $w = 2 * pi() * $freqOfTone / $sampleRate; $samp
$samples = array();
$amplitude = 8192;
$sampleRate = 8000;
$samplesCount = 300000;
for ($n = 0; $n < $samplesCount; $n++) {
$freqOfTone= 4*sin($n*0.00628)+440;
$w = 2 * pi() * $freqOfTone / $sampleRate;
$samples[$n] = (int)($amplitude * sin($n * $w));
}
$samples=array();
$振幅=8192;
$sampleRate=8000;
$samplescont=300000;
对于($n=0;$n<$samplescont;$n++){
$freqOfTone=4*sin($n*0.00628)+440;
$w=2*pi()*$frequeoftone/$sampleRate;
$samples[$n]=(int)(振幅*sin($n*$w));
}
但是产生的声音不是一个持续的摆动,而是上升。。。(正如你在那里听到的:
有人知道为什么吗
谢谢你并没有用同样的方法解决这个问题,但我花了一些时间玩互联网上奇怪的数学角来帮助去除三角锈。帮助我正确看待这个问题 无论如何,这就是我一直在玩的东西(放大器和调频模式,我可以用它玩几个小时):
添加$t
有什么意义?它总是0,但我怀疑问题出在$frequeftone=4*sin($n*0.001)+440;
@Mark Baker是的,不需要。但我在其他情况下使用它,因为计数器$n一直在增加?@BigScar是的,但sin函数应该是2*Pi周期?使用模,它会产生很酷的效果,但即使是(%500),它仍然会上升。要从php生成音调wav,请转到那里:您在两个sin()中都尝试过使用模吗参数?是的,如果我把($n%1000+10000)放入在第二个罪中。但我不明白为什么它没有:它不是2pi周期吗?np!感谢分享这个实验,那真是一个爆炸。我昨晚想把这个扔给你,但忘了——看它的有趣方式,以及它的开源,这样你就可以从代码中找到想法
<?php
$bps = 16; // bits/s
$Bps = $bps / 8; // byte/s
$duration = 30; // Seconds
$frequency = 440; // Hz
$amplitude = 8192;
$samples = array();
$sampleRate = 44100;
$samplesCount = $sampleRate * $duration;
for ($n = 0; $n <= $samplesCount; $n++)
{
// Time
$t = $n / $sampleRate;
// Freq Mod
$mod = 0.1 * sin(2 * M_PI * $frequency * $t * 0.00628);
// Wave
$w = $amplitude * sin(2 * M_PI * $frequency * ($t + $mod));
// Amplitude Mod
($n / ($sampleRate / 10) % 2 == 0) ? $amplitude-- : $amplitude++;
$samples[] = (int)$w;
}
$str = call_user_func_array("pack",
array_merge(array("VVVVVvvVVvvVVv*"),
array(// header
0x46464952, // RIFF
($samplesCount * 2) + 44 - 8, // Filesize
0x45564157, // WAVE
0x20746d66, // "fmt " (chunk)
16, // chunk size
1, // compression (2 byte iteger)
1, // nchannels
$sampleRate, // sample rate
$sampleRate * $Bps, //bytes/second
$Bps, //block align
$bps, //bits/sample
0x61746164, //"data"
$samplesCount * 2 // samples * compressed int
),
$samples //data
)
);
// echo print_r($samples) . PHP_EOL;
$myfile = fopen("/tmp/sine.wav", "wb") or die("Unable to open file!");
fwrite($myfile, $str);
fclose($myfile);