c/c++语言产生正弦波音频数据代码

/*
 * author: hjjdebug
 * date  : 2023年 12月 12日 星期二 14:33:22 CST
 * descritor: 怎样产生正弦波音频数据
 */

#include
#include
/*
 * 产生1s 440hz, S16格式的音频数据,48K hz 采样,单声道,每个frame大小为1024
 * 这就是数字声音的概念. 采样的数据格式,采样率(每秒采样次数),声道数,frame大小
 * 你可以用如下命令播放生成的声音文件,还可以理解bit率的概念
 * ffplay -f s16le -ar 48000 -ac 1 1.data
 */
#define SAMPLE_RATE 48000
#define FREQUENCY   440
#define FRAME_SIZE  1024
typedef struct {
    short data[FRAME_SIZE];
}Frame;
void create_audio(int seconds, Frame **frame, int *framenum);
void print_data(Frame *frame,int framenum);

int main()
{
    Frame *frame=nullptr;
    int framenum=0;
    create_audio(10,&frame,&framenum); //产生10秒音频数据
    print_data(frame,framenum);
    return 0;
}

void create_audio(int seconds, Frame **a_frame, int *a_framenum)
{
    int framenum = seconds * ((SAMPLE_RATE + FRAME_SIZE -1)/ FRAME_SIZE);
    *a_framenum = framenum;
    Frame *frame=0;
    if(*a_frame==nullptr)
    {
        frame = (Frame *)malloc(framenum * sizeof(Frame));
        *a_frame = frame;
    }
    else
    {
        frame =*a_frame;
    }
    float zeta=0; //每一个frame 的初始角度
    int amp=10000; //幅度
    for(int i=0;i     {
        for(int j=0;j         {
            frame[i].data[j]=amp*sin(2*M_PI*FREQUENCY/SAMPLE_RATE*j+zeta); //每一个数据递进一个角度2*PI*FREQUENCY/SAMPLE_RATE,此值为角速度
        }
        zeta += 2*M_PI*FREQUENCY/SAMPLE_RATE*FRAME_SIZE;
    }
    
}
void print_data(Frame *frame,int framenum)
{
    int k=0;
    FILE *fp=fopen("1.data","wb");
    if(!fp){
        printf("error open 1.data\n");
        exit(1);
    }
    for(int i=0;i     {
        for(int j=0; j         {
            printf("%04d ",frame[i].data[j]);
//            fprintf(fp,"%04d",frame[i].data[j]);
            fwrite(&frame[i].data[j],sizeof(short),1,fp);
            k++;
            if(k%16==0) printf("\n");
        }
        printf("\n\n");
    }
    fclose(fp);
}
 

你可能感兴趣的:(#,音频,ffplay,audio)