【发布时间】:2019-03-23 11:48:22
【问题描述】:
我有一个用 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);
}
【问题讨论】:
-
例如,Audacity 中的噪音是什么样的?
-
以前有人问过这个问题,但我找不到。问题在于以文本模式打开文件(默认情况下),数据
0x0D被转换,当它是一个字节时,比如0x140D16 位值。以二进制模式打开文件。我不明白你为什么要向stdout发送二进制数据。大概你重定向输出。看看生成的文件大小,是不是比预期的大? -
另外,数据中没有零偏移。 Audacity会介意吗?还是希望 16 位数据以
0x8000为中心? -
@WeatherVane 是的,你完全正确,在所有方面。使用标准输出只是替代实际文件管理的 CLI 简写。我从未想过
stdout不是二进制流。现在我觉得很笨。我想您可以根据需要创建一个答案,或者我可以删除该问题,因为它是重复的。另外,我不确定我是否理解第二个问题。也许 Audacity 从编码中收集偏移值(带符号的 16 位、32 位浮点数等)——对于 SoX 也是如此
标签: c audio trigonometry synthesizer sample-rate