У меня есть простая программа на 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);
}