单片机如何生成周期正弦波

news/2024/11/17 9:38:20/

一,简介

在某些场景需要使用单片机的IIS等外设播放正弦波音频数据。本文介绍一种“笨方法”来生成固定频率和固定幅度的正弦波定点型数据,记录总结学习使用。

二,步骤简介

总体步骤概述:
1,使用Audition生成制定波形,并转成pcm格式;
2,写个main函数将所需要的数据读取并打印,然后运行重定向到txt中;
3,将txt中的数据复制到IIS的播放buffer中进行播放即可;

本篇文章使用采样率48K,幅值-6db ,频率1KHz的正弦信号来距离说明。

2.1 使用Audition生成制定波形,并转成pcm格式

打开Audition,生成音调:
在这里插入图片描述
新建音频文件,点击确定:
在这里插入图片描述
设置波形信号开始的频率和幅值:
在这里插入图片描述
设置波形信号结束的频率和幅值:
在这里插入图片描述
点击“确定”,一个立体声的指定音源就做好了:
在这里插入图片描述
使用Audition快捷键“Alt+Z”查看生成波形信号频率,点击“扫描选区”看到左右声道的频率都是1KHz:
在这里插入图片描述
将当前的浮点型数据转换成定点数据,使用快捷键“Ctrl + S”,将文件另存为.pcm格式,并保存到指定的路径:
在这里插入图片描述

至此,我们的音源文件已经生成并准备完毕。

2,写个main函数将所需要的数据读取并打印,然后运行重定向到txt中

main函数代码如下所示:
这里IN_32BITPCM_FILE使用刚才生成的pcm文件;
DATA_SAMPLE_LEN设置为96,原因是因为1KHz频率周期是1ms,48K采样率1ms采样点个数为48,又因为是立体音,所以这里读取96个采样点。

#include <stdio.h>#define IN_32BITPCM_FILE "-6db_1K_48KSr.pcm"
#define READ_DATA_SAMPLE_LEN    96int main()
{int ret = -1;FILE *fp = NULL;int buffer[192] = {0};fp = fopen(IN_32BITPCM_FILE,"rb");if(fp == NULL) {printf("%s: open file failed \n",__func__);return -1;}fseek(fp,0,SEEK_SET);ret = fread(buffer,sizeof(char),READ_DATA_SAMPLE_LEN*sizeof(buffer[0]),fp);if(ret <=0 ) {printf("%s: ERROR:read file data failed \n",__func__);fclose(fp);return -1;}for(int i=0; i< READ_DATA_SAMPLE_LEN; i++){printf("0x%08X, ", buffer[i]);if(((i+1)%8) == 0){printf("\n");}}fclose(fp);return ret;
}

打开MINGW64把刚才的main函数进行编译,默认生成a.exe:
在这里插入图片描述
运行a.exe并把打印输出结果重定向到test.txt:
在这里插入图片描述
打开test.txt查看生成的正弦波定点数据,发现我们想要的数据已经整齐的排列好:
在这里插入图片描述

2.3 接下来就把这些数据拷贝到指定的数组中

备注:为了使生成的数据和音频播放的缓存buffer进行匹配,这里可将该周期数据多复制几份,然后循环从存放生成完整周期的数据的数组中去取数据复制到音频播放的缓存数组即可。

三,总结

本文主要介绍了一种笨方法生成定点数据的正弦波,供参考使用。后续会介绍如何使用CORDIC算法生成各种频率和幅值及采样率的正弦波形。欢迎一起讨论交流~


http://www.ppmy.cn/news/493424.html

相关文章

【openGauss简单数据库管理---快速入门】

【openGauss简单数据库管理---快速入门】 &#x1f53b; 一、openGauss数据库管理&#x1f530; 1.1 连接openGauss数据库&#x1f530; 1.2 创建数据库&#x1f530; 1.3 查看数据库和切换数据库&#x1f530; 1.4 修改数据库&#x1f530; 1.5 删除数据库&#x1f530; 1.6 启…

众安科技统一运维管理平台监控软件打造站点集中式监控

在当今信息化时代&#xff0c;企业的IT基础设施日益庞大而复杂&#xff0c;对运维团队的管理和监控提出了更高的要求。为了提高运维效率、降低风险&#xff0c;众安科技积极倡导并实施统一运维管理平台&#xff0c;通过监控软件打造站点集中式监控体系。本文将详细介绍众安科技…

JDK自带的构建线程池的方式之newSingleThreadExecutor

newSingleThreadExecutor从名称上就可以知道这个是一个单例的线程池。在这个线程池中只有一个线程来处理任务。 就可以使用在业务涉及到顺序消费的时候。 newSingleThreadExecutor的代码展示 可以从这个在Executors中的静态方法newSingleThreadExecutor可以发现&#xff0c;该…

通信专业技术人员职业水平考试岗位设置与岗位描述

级别资格名称考核内容岗位描述初级不分专业计算机与通信技术领域的基本知识和技能&#xff1b;现代通信网的基本构成、业务流程和应用模式&#xff1b;通信网的交换、传输和终端的基本技术&#xff1b;通信软件开发技术及流程&#xff1b;通信领域网管、安全、测试等技术&#…

魔兽世界技能输出宏

1、顺序执行&#xff08;每一次只执行一个技能&#xff09; #showtooltip /castsequence 鬼影缠身,腐蚀术,痛楚,痛苦无常

WPS启用宏

WPS默认是没有启用宏的&#xff0c;点击开发者工具后可以看到宏的选项都是灰色的&#xff0c;需要安装wps的vba插件才可以使用。WPS2016版操作步骤如下&#xff1a; 1.下载vba插件&#xff1a; 网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1SDOgr5O5LNSc…

wps 宏 js宏

For Each pf In ActiveSheet.PivotTables("数据透视表1").DataFields: pf.Function xlAverage: Next js 宏 /*** 打印题号列表 Macro* 宏由 huxinxiang 录制&#xff0c;时间: 2022/10/14*/ function 打印题号列表() {var list1 [];for (var index 1; index < …

“宏”在开发中的使用

一、认识“宏” 宏定义又称为宏代换、宏替换&#xff0c;简称“宏” 1、不带参数的宏定义 格式&#xff1a; #define 标识符 字符串//其中的标识符就是所谓的符号常量&#xff0c;也称为“宏名”。 预处理&#xff08;预编译&#xff09;工作也叫做宏展开&#xff1a;将宏…