生成的正弦波 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 函数中的表达式看起来很可疑。是int
或long
类型的所有组件吗?你写了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 声音中的静态噪声的主要内容,如果未能解决你的问题,请参考以下文章