三角函数的公式 y = A s i n w x y = Asinwx y=Asinwx
#include
#include
#include
#define SAMPLE_POINT_NUM (64) /* 需要生成的点的个数 */
#define SINE_MAX (512) /* sin 函数幅值 */
#define PI (3.1415926) /* 数学中的常量:Π */
#define POINT_BUFFER_LEN (128)
int generate_data[POINT_BUFFER_LEN]; /* 生成的数据放在此数组中 */
void get_sin_data(unsigned int point)
{
unsigned int i = 0;
float step = 0.0;
float data = 0.0;
int tem = 0;
step = 2 * PI / point; /* 将 sin 函数从 [0-2Π] 等分为 N 个点,则每个点的步长为 2Π/point_num */
for (i = 0; i < point; i++)
{
data = SINE_MAX * sin(step * i);
tem = (int)data;
generate_data[i] = tem;
}
}
int main(int argc, char *argv[])
{
get_sin_data(SAMPLE_POINT_NUM);
for (int i = 0; i < SAMPLE_POINT_NUM; i++)
{
printf("%d ", generate_data[i]);
}
printf("\r\n");
return 0;
}
gcc generate_sin_data.c -lm
需要用到数学库中的函数 sin
,所以链接的时候需要加上 lm
参数
0 50 99 148 195 241 284 324 362 395 425 451 473 489 502 509 512 509 502 489 473 451 425 395 362 324 284 241 195 148 99 50 0 -50 -99 -148 -195 -241 -284 -324 -362 -395 -425 -451 -473 -489 -502 -509 -512 -509 -502 -489 -473 -451 -425 -395 -362 -324 -284 -241 -195 -148 -99 -50
从生成的数据中可以看出,数据的最大最小值分别为 512
和 -512
将上述数据用散点图绘制出来如下图
上一节生成的正弦波数组 幅值
及 step
步长并没有考虑实际频率
实际音频输出是需要考虑:采样位数,采样频率,声道数详见音频(一)——基本概念及硬件拓扑
采样位数对应到正弦波中即为幅值
采样频率对应到正弦波中即为频率
基本思路:
#include
#include
#include
#define SAMPLE_POINT_NUM (48) /* 需要生成的点的个数 */
#define SAMPLE_BIT (16) /* 采样位数 */
#define PI (3.1415926) /* 数学中的常量:Π */
#define POINT_BUFFER_LEN (128)
int generate_data[POINT_BUFFER_LEN]; /* 生成的数据放在此数组中 */
int get_sin_max(int sample_bit)
{
int value = 2;
for (int i = 0; i < sample_bit - 1; i++)
{
value = value * 2;
}
return value - 1;
}
void get_sin_data(unsigned int point)
{
float data = 0.0;
int sin_max_data;
sin_max_data = get_sin_max(SAMPLE_BIT - 1);
for (int i = 0; i < point; i++)
{
data = sin_max_data * sin(2 * PI * (1.0 / point) * i);
generate_data[i] = (int)data;
}
}
int main(int argc, char *argv[])
{
get_sin_data(SAMPLE_POINT_NUM);
for (int i = 0; i < SAMPLE_POINT_NUM; i++)
{
printf("%d, ", generate_data[i]);
}
printf("\r\n");
return 0;
}
gcc generate_sin_data.c -lm
需要用到数学库中的函数 sin
,所以链接的时候需要加上 lm
参数
0, 4276, 8480, 12539, 16383, 19947, 23169, 25995, 28377, 30272, 31650, 32486, 32767, 32486, 31650, 30272, 28377, 25995, 23169, 19947, 16383, 12539, 8480, 4276, 0, -4276, -8480, -12539, -16383, -19947, -23169, -25995, -28377, -30272, -31650, -32486, -32767, -32486, -31650, -30272, -28377, -25995, -23169, -19947, -16383, -12539, -8480, -4276,
从生成的数据中可以看出,数据的最大最小值分别为 32767
和 -32767
,16 位音频数据的取值范围为 − 2 31 —— 2 31 − 1 -2^{31}——2^{31}-1 −231——231−1
将上述数据用散点图绘制出来如下图
sram/flash -> I2S master SDATAO -> AP SDATAI
AP 一起测试时,输入源选择数字音频接口即 I2S,并配置 AP 端 I2S 格式和 MCU 端格式一致