生成样本音频数据:试图产生音乐板噼啪声? (C ++)

时间:2010-11-28 18:27:04

标签: c++ audio

我尝试这样的代码:

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%?

1 个答案:

答案 0 :(得分:1)

sin()将返回介于-1和1之间的值,因此当乘以数字x时,结果将在-x和x之间变化。
如果x大于或小于数组类型的数字边界,则会导致伪影。

Buffer似乎是一个char数组,这对于audiobuffer来说并不常见。

通常它们是整数或双数。当它是一个整数数组时,幅度应该在INT_MIN和INT_MAX之间。当它是一个双精度数组时,振幅通常在-1和1之间变化。

在你的情况下,我会尝试使用CHAR_MAX? (编辑:并松开“/ 100”)

但我猜测调用函数不期望char数组,因为幅度最多有256个离散的可能值,这将导致较差的音频质量。这个术语称为位深度。

另请查看sinusoids