我尝试使用以下C代码生成一个440Hz频率的正弦波,持续10秒:
#include <stdio.h>
#include <math.h>
double sine(double amp, double freq, double time);
int main(int argc, char *argv[])
{
int sample_rate = 48000;
double freq = 440;
double amp = 1;
double duration = 10;
double time = 0;
double val = 0;
int temp = 0;
int i = 0;
FILE *fp = fopen("sine.bin", "wb");
if (fp == NULL)
{
return -1;
}
while (i <= sample_rate * duration)
{
val = 32767.0 * sine(amp, freq, time);
temp = (int) val;
fwrite((const void*) &temp, sizeof(int), 1, fp);
time = i / (1.0 * sample_rate);
i++;
}
}
double sine(double amp, double freq, double time)
{
return amp * sin(2.0 * M_PI * freq * time);
}
然而,我得到的是一个220赫兹的正弦波,持续20秒钟。如何修改此代码以产生持续10秒的440Hz正弦波?我编译并运行了这段代码:
gcc sound.c -Wall -Wextra -lm -o sound && ./sound
aplay -r 48000 -f S16_LE sine.bin
2条答案
按热度按时间jdgnovmf1#
看起来很可疑。播放16位(小端序)流
然而写32位整数:
我认为修复方法是用下面这行来替换上面的行:
kq4fsx7k2#
尝试生成
16-bit
声音文件时,使用int
意味着它是32-bit
或64-bit
,因此在处理16-bit
音频时必须使用short
C Programming/limits.h