我尝试这样的代码:
static float shift = 0.0;
double amplitude = 1000000 * pow(10, 1 / 400.0);
for (int i = 0; i < nSampleSize / nBlockAlign; i ++)
{
// Sound :)
Buffer [i] = amplitude * sin((shift + i)) / 100;
}
shift = shift + amplitude * nSampleSize / nBlockAlign ;
return (char *)Buffer;
它通常给出正确的结果,但方式2响亮。怎么让它减少95%?
答案 0 :(得分:1)
sin()将返回介于-1和1之间的值,因此当乘以数字x时,结果将在-x和x之间变化。
如果x大于或小于数组类型的数字边界,则会导致伪影。
Buffer似乎是一个char数组,这对于audiobuffer来说并不常见。
通常它们是整数或双数。当它是一个整数数组时,幅度应该在INT_MIN和INT_MAX之间。当它是一个双精度数组时,振幅通常在-1和1之间变化。
在你的情况下,我会尝试使用CHAR_MAX? (编辑:并松开“/ 100”)
但我猜测调用函数不期望char数组,因为幅度最多有256个离散的可能值,这将导致较差的音频质量。这个术语称为位深度。
另请查看sinusoids