产生正弦波会产生噪音

时间:2019-03-23 11:48:23

标签: c audio sine synthesizer sample-rate

我有一个简单的C程序,可以在特定的频率,采样率和幅度下生成方波,效果很好。但是,如果我注释掉相关行并取消注释新的正弦波行,它会生成我的正弦波,但是当我将输出处理为Audacity或SoX时也会产生很多噪声。

但是,包含生成的缓冲区中的数据的日志文件按预期读取,其幅度内的符号值相对于指定频率随时间(采样)振荡,没有意外的值或噪声...

这可能使我认为采样率或其他设置(字节顺序,单声道/立体声,数据类型等)有问题,但是正如我之前所说,方波没有这种麻烦。另外,我确保所有计算都使用双精度浮点类型完成,以便我知道整数强制不是我的问题。我感到难过。欢迎任何帮助或见识。

这就是我所拥有的:

#define pi 3.1415926

int main()
{
    FILE *fer=fopen("log.txt","w");
    double f=440; //freq
    double a=1000; //amplitude
    double p=44100/f; //period

    int16_t *b=malloc(sizeof(int16_t)*44100);
    if(!b)return 1;

    for(int i=0;i<44100;i++)
    {
        double ll=sin( (2.0L*pi/p)*i ) * a;   //SINE WAVE
        // double ll=fmod(i,p)<p/2?a:-a;   //SQUARE WAVE
        b[i]= ll;
        fprintf(fer,"%i\n",b[i]);
    }

    fwrite(b,sizeof(int16_t),44100,stdout);

    free(b);
    fclose(fer);
}

1 个答案:

答案 0 :(得分:1)

您已将二进制输出发送到stdout(它是文本流),并且您大概将其重定向到文件。在某些操作系统上,将转换文本流中的换行符。因此,当看到字节值0x0A或也许0x0D时,它将转换为另一个值,或者可能转换为两个值。它可能是16位值的一部分,例如0x0D00,并且系统不知道这些是16位值。一个提示是,生成的文件大小比预期的大。

解决方案是以二进制模式打开文件并将数据写入该文件。

关于另一个注释:基本值。有时,数据的中心(零值)应位于0x8000处,并且播放器会将其视为未签名并进行调整。我注意到您的数据被视为没有零偏移量的签名数据。

这意味着对于1000的振幅,数据要么在-1000+1000的范围内,要么在3176833768的范围内。