生成的正弦波 pcm 声音中的静态噪声

Posted

技术标签:

【中文标题】生成的正弦波 pcm 声音中的静态噪声【英文标题】:Static noise in generated sine wave pcm sound 【发布时间】:2021-10-08 13:44:33 【问题描述】:

这与here 的问题非常相似,但我似乎无法应用该解决方案。

我有一个对正弦波进行采样并将其写入 pcm 文件的代码。用ffplay听的时候,有一些不知道从哪里来的静电噪音。基于上述帖子中的解决方案,我使用二进制文件进行写入,并确保我以带符号的 8 位格式播放文件。

这是我使用的代码:

int createSineWavePCM(int freq, int sample_rate) 
    char out_name[100];
    sprintf(out_name, "../sine_freq%d_sr%d.pcm", freq, sample_rate);
    ofstream outfile(out_name, ios::binary);

    char data[1000000];
    for (int j = 0 ; j < 1000000 ; ++j) 
        double ll = 50.0L * sin((2.0L * M_PIl * j * freq / sample_rate));
        data[j] = ll;
    

    outfile.write(data, sizeof data);
    outfile.close();
    cout << "Stored sine wave pcm file in " << out_name << endl;

    return 0;

我使用 freq = 440 和 sample_rate = 44100,然后我玩:

ffplay pcm_file -f s8 -sample_rate 44100

关于什么可能导致静电噪音的任何想法?

【问题讨论】:

我以前回答过这个问题。这可能是相关的:***.com/questions/10844122/… 另一件事要检查。将数据声明为 signed char 而不是 char。根据编译器和编译器标志,char 是有符号还是无符号有时会模棱两可。 【参考方案1】:

sin 函数中的表达式看起来很可疑。是intlong 类型的所有组件吗?你写了2.0L,我很惊讶它的解析,但L 通常将一个数字转换为long。此外,M_PI 似乎附加了一个l,这也可能使其成为long。如果是这种情况,正在执行的除法freq / sample_rate 很可能是整数除法。

【讨论】:

感谢您的回复。我在想这个问题可能与在写入数据数组时将 sin 值转换为 char 有关,所以我试图在 double 值中具有高精度,但我可能没有正确地做到这一点.. 无论如何,做类似的事情:double ll = 50.0 * sin((2.0 * M_PI * j * 440.0 / 44100.0)); 给我同样的问题 我没有意识到这是 C++。我对这些数据类型或 C++ 中的转换如何工作一无所知。在 Java 中,我们不能简单地将 double 放入一个字节中。也许音质与它是 8 位有关?我从来没有使用过小于 16 位的任何东西,也不知道这种格式的 A-440 会发生什么。

以上是关于生成的正弦波 pcm 声音中的静态噪声的主要内容,如果未能解决你的问题,请参考以下文章

matlab 生成白噪声和正弦波复合信号

LabVIEW软件中,正弦信号与正弦波的区别

简单的 AudioQueue 正弦波——为啥会失真?

噪声正弦时间序列中的实时峰值检测

直流无刷电机的正弦波控制

音频基础学习二——声音的波形