首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >产生正弦波会产生噪声

产生正弦波会产生噪声
EN

Stack Overflow用户
提问于 2019-03-23 19:48:23
回答 1查看 109关注 0票数 1

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

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

这可能会让我认为采样率或其他设置(字节顺序、单声道/立体声、数据类型等)有问题,但正如我之前所说的,方波没有这样的问题。此外,我还确保所有的计算都是使用双精度浮点类型完成的,这样我就知道整数强制不是我的问题。我被难住了。欢迎任何帮助或见解。

这是我所拥有的:

代码语言:javascript
运行
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-23 20:57:19

您已经将二进制输出发送到stdout,这是一个文本流,并且您可能将其重定向到一个文件。在某些操作系统上,文本流中的换行符被转换。因此,当看到字节值0x0A0x0D时,它将被转换为另一个值,或者可能转换为两个值。它可能是16位值的一部分,例如0x0D00,而系统不知道这些是16位值。一个线索是结果文件的大小比预期的要大。

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

关于另一个注释:基值。有时数据应该以0x8000为中心(零值),并且数据被视为无符号并由玩家进行调整。我注意到,您的数据被视为无零偏移的带符号数据。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55313420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档