资源简介
纯C语言,利用正弦波生成生成产生类似do、re、mi、fa、so的音频wave文件
代码片段和文件信息
// sin.cpp : Defines the entry point for the console application.
#include
#include
#include
#include
#include
#define PI 3.1425926
int main()
{
char *sine_buf =(char *) malloc(100000 * sizeof(char));
int i;
struct bb
{
char RiffID[4]; // ‘R‘‘I‘‘F‘‘F‘ “RIFF“标志
int RiffSize; // 文件长度(WAVE文件的大小 不含前8个字节)
char RiffFormat[4]; // ‘W‘‘A‘‘V‘‘E‘ “WAVE“标志
char FmtID[4]; // ‘f‘‘m‘‘t‘‘ ‘ “fmt “标志
int FmtSize; //过渡字节(不定)16 for PCM. This is the size of the rest of the Subchunk which follows this number.
unsigned short FormatTag; //格式类别 当FormatTag=1,用的就是非压缩格式。
unsigned short Channels; //通道数(单声道为1 双声道为2)
int SamplesPerSec; //采样率(每秒样本数) 表示每个通道的播放速度
int AvgBytesPerSec; //波形音频数据传输速率 其值为:通道数*每秒数据位数*每样本的数据位数/8 播放软件可以利用该值估计缓冲区大小
unsigned short BlockAlign; //每样本的数据位数(按字节算) 其值为:通道数*每样本的数据位值/8, 播放软件需要一次处理多个该值大小的字节数据 以便将其值用于缓冲区的调整
unsigned short BitsPerSample; //每样本的数据位数 表示每个声道中各个样本的数据位数. 如果有多个声道对每个声道而言 样本大小都一样
char DataID[4]; // ‘d‘‘a‘‘t‘‘a‘
int DataSize; //语音数据的长度
}sTest;
FILE *fp1;
fp1=fopen(“q.txt““wb“);
if(fp1==NULL)
{
printf(“open file zk1 fail! \n“);
return;
}
int iSamplesPerSec = 8000; //正弦波的采样频率
int iPerSec = 300; //正弦波的频率
static double wt = 0; //采样角度
for(i=0;i<2500;i++)
{
sine_buf[i]= (char)(127 + 127*sin(wt));
fwrite(&sine_buf[i]11fp1);
wt += 2*PI*iPerSec / iSamplesPerSec;
if (wt > 2*PI)
{
wt -= 2 * PI;
}
}
fclose(fp1);
fp1=fopen(“q.txt““a+“);
if(fp1==NULL)
{
printf(“open file fail! \n“);
return;
}
for(i=0;i<1500;i++)
{
sine_buf[i]= 0;
fwrite(&sine_buf[i]11fp1);
}
iSamplesPerSec = 8000; //正弦波的采样频率
iPerSec = 400; //正弦波的频率
wt = 0; //采样角度
for(i=0;i<2500;i++)
{
sine_buf[i]= (char)(127 + 127*sin(wt));
fwrite(&sine_buf[i]11fp1);
wt += 2*PI*iPerSec / iSamplesPerSec;
if (wt > 2*PI)
{
wt -= 2 * PI;
}
}
fclose(fp1);
fp1=fopen(“q.txt““a+“);
if(fp1==NULL)
{
printf(“open file fail! \n“);
return;
}
for(i=0;i<1500;i++)
{
sine_buf[i]= 0;
fwrite(&sine_buf[i]11fp1);
}
iSamplesPerSec = 8000; //正弦波的采样频率
iPerSec = 500; //正弦波的频率
wt = 0; //采样角度
for(i=0;i<2500;i++)
{
sine_buf[i]= (char)(127 + 127*sin(wt));
fwrite(&sine_buf[i]11fp1);
wt += 2*PI*iPerSec / iSamplesPerSec;
if (wt > 2*PI)
{
wt -= 2 * PI;
}
}
fclose(fp1);
fp1=fopen(“q.txt““a+“);
if(fp1==NULL)
{
printf(“open file fail! \n“);
return;
}
for(i=0;i<1500;i++)
{
sine_buf[i]= 0;
fwrite(&sine_buf[i]11fp1);
}
iSamplesPerSec = 8000; //正弦波的采样频率
iPerSec = 600; //正弦波的频率
wt = 0; //采样角度
for(i=0;i<2500;i++)
{
sine_buf[i]= (char
评论
共有 条评论