音频(九)——I2S 输出正弦波

news/2024/4/24 16:05:48/文章来源:https://blog.csdn.net/tyustli/article/details/129150328

I2S 输出正弦波

  • PC 端:先生成一个正弦波数组
  • MCU 端:将正弦波数组使用 I2S 输出
  • AP 端:接受从 MCU I2S 端口出来的正弦波数据并测量 THD+N 等数据

PC 端生成正弦波数组

原理

三角函数的公式 y=Asinxy = Asinxy=Asinx

  • A 表示幅值

代码实现

源码

#include <stdio.h>
#include <math.h>
#include <stdint.h>#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 步长并没有考虑实际频率

实际音频输出是需要考虑:采样位数,采样频率,声道数详见音频(一)——基本概念及硬件拓扑

采样位数对应到正弦波中即为幅值

采样频率对应到正弦波中即为频率

基本思路:

  • 采样频率和需要的采样点控制步长
  • 采样位数控制幅值
    • char 型数据,即 8 位采样位数的取值范围 −27——27−1-2^7——2^7-127——271
    • short 型数据,即 16 位采样位数的取值范围 −215——215−1-2^{15}——2^{15}-1215——2151
    • int 型数据, 即 32 位采样位数的取值范围 −231——231−1-2^{31}——2^{31}-1231——2311

源码实现

#include <stdio.h>
#include <math.h>
#include <stdint.h>#define SAMPLE_POINT_NUM        (64)        /* 需要生成的点的个数 */#define SAMPLE_RATE             (48000)     /* 48KHz */
#define SAMPLE_BIT              (16)        /* 采样位数 */
#define SINE_CHANNEL            (1)         /* 采样声道数 */#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 step = 0.0;float data = 0.0;int sin_max_data;sin_max_data = get_sin_max(SAMPLE_BIT - 1);step = 2 * PI / SAMPLE_RATE; /* 采样频率表示采样数据之间的时间间隔 */step *= SAMPLE_RATE / point; /* 只取 point 个点,所以真正的 step 需要乘 SAMPLE_RATE / point */for (int i = 0; i < point; i++){data = sin_max_data * sin(step * 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 3211 6392 9511 12539 15446 18204 20787 23169 25329 27244 28897 30272 31356 32137 32609 32767 32609 32137 31356 30272 28897 27244 25329 23169 20787 18204 15446 12539 9511 6392 3211 0 -3211 -6392 -9511 -12539 -15446 -18204 -20787 -23169 -25329 -27244 -28897 -30272 -31356 -32137 -32609 -32767 -32609 -32137 -31356 -30272 -28897 -27244 -25329 -23169 -20787 -18204 -15446 -12539 -9511 -6392 -3211

从生成的数据中可以看出,数据的最大最小值分别为 32767-32767

波形

将上述数据用散点图绘制出来如下图

在这里插入图片描述

I2S 输出

数据通路

flash -> I2S master SDATAO -> AP

AP 仪器测试

波形测试

图片待补充

FFT 测试

图片待补充

THD+N 测试

THD+N 理论值计算
图片待补充

SNR 测试

图片待补充
THD+N 理论值计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72253.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出C++ ——容器适配器

文章目录一、容器适配器二、deque类简介1. deque的原理2. deque迭代器3. deque的优点和缺陷4. 为什么选择deque作为stack和queue的底层默认容器一、容器适配器 适配器的概念 适配器是STL六大核心组件之一&#xff0c;它是一种设计模式&#xff0c;该种模式是将一个类的接口转换…

国家级高新区企业主要经济指标(2012-2021年)

数据来源&#xff1a;国家统计局 时间跨度&#xff1a;2012-2021 区域范围&#xff1a;全国&#xff08;及各分类统计指标&#xff09; 指标说明&#xff1a;手工提取最新的中国统计年鉴数据中各个excel指标表&#xff0c;形成各个指标文件的多年度数据&#xff0c;便于多年…

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

文章目录1.引言2.Spring Security过滤器链加载1.2.注册名为 springSecurityFilterChain的过滤器2、查看 DelegatingFilterProxy类3.查看 FilterChainProxy类3.1 查看 doFilterInternal方法。3.2 查看 getFilters方法。4 查看 SecurityFilterChain接口5 查看 SpringBootWebSecur…

90%的人都理解错了HTTP中GET与POST的区别

Get和Post是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是Get把参数包含在URL中&#xff0c;Post通过request body传递参数。 你可能自己写过无数个Get和Post请求&#xff0c;或者已经看过很多权威网站总结…

制造企业为何要上数字化工厂系统?

以目前形势来看&#xff0c;数字化转型是制造企业生存的关键&#xff0c;而数字化工厂管理系统是一个综合性、系统性的工程&#xff0c;波及整个企业及其供应链生态系统。数字化工厂系统所要实现的互联互通系统集成、数据信息融合和产品全生命周期集成&#xff0c;将方方面面的…

国产真无线蓝牙耳机哪个好?国产半入耳蓝牙耳机推荐

近几年&#xff0c;生活中随处可见的有戴蓝牙耳机的人&#xff0c;而蓝牙耳机也因为使用更便捷、功能更先进受到了不少用户的喜爱。蓝牙耳机按照佩戴方式来划分&#xff0c;可以有入耳式、半入耳式、头戴式等。在此&#xff0c;我来给大家推荐几款国产半入耳蓝牙耳机&#xff0…

数字IC设计工程师是做什么的?

随着我国半导体产业的发展&#xff0c;近几年的新入行的从业人员&#xff0c;除了微电子相关专业的&#xff0c;还有就是物理、机械、数学、计算机等专业&#xff0c;很多人对这一高薪行业充满了好奇&#xff0c;那么数字IC设计工程师到底是做什么的&#xff1f; 首先来看看数…

每日一题——L1-069 胎压监测(15)

L1-069 胎压监测 分数 15 小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#…

如何通过一台 iPhone 申请一个 icloud 邮箱账号 后缀为 @icloud.com

总目录 iOS开发笔记目录 从一无所知到入门 文章目录需求关键步骤步骤后续需求 在 iPhone 自带的邮箱软件中添加账号&#xff0c;排第一位的是 iCloud 邮箱&#xff1a; 选 iCloud 之后&#xff1a; 提示信息是exampleicloud.com&#xff0c;也就是说是有icloud.com为域的邮箱…

ElementUI--Dialog 弹框的使用

第一步&#xff1a;从官方文档中拷贝一个对话框到你的页面中 <el-dialog title"为中华民族之崛起而学习" :visible.sync"dialogVisible" width"30%" :fullscreen"false" :close-on-press-escape"false" show-close:close…

【蓝桥集训】第六天——递归

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.树的遍历2.递归求阶乘3.求斐波那契数列1.树的遍历 一个二叉树&#xff0c;树中每个节点的权值互不相同。 现在给出它的后…

人工智能基础部分13-LSTM网络:预测上证指数走势

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下LSTM网络&#xff0c;主要运用于解决序列问题。 一、LSTM网络简单介绍 LSTM又称为&#xff1a;长短期记忆网络&#xff0c;它是一种特殊的 RNN。LSTM网络主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题…

【OpenCV学习笔记01】- 初步使用OpenCV实现人脸识别

想要使用opencv实现人脸识别&#xff0c;我们需要做这样几步&#xff1a; 1.opencv-python的安装 这里我们使用的python的opencv-python库&#xff0c;在安装opencv-python库之前&#xff0c;我们需要安装numpy, matplotlib。 # 安装指令 # 安装 numpy pip install numpy # …

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个&#xff0c;逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处&#xff0c;本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架&#xff1a;Django、Tornado、Flask、Twisted。 …

Python os和sys模块

一、os模块 os 模块是 Python中的一个内置模块&#xff0c;也是 Python中整理文件和目录最为常用的模块。 该模块提供了非常丰富的方法用来处理文件和目录。比如&#xff1a;显示当前目录下所有文件/删除某个文件/获取文件大小 1、获取当前的工作路径 在 Python 中&#xff0…

linux查看WWN号及常见问题解决

linux查看WWN号及常见问题解决查看WWN号查看WWID号查询常见问题查看WWN号 要查看CentOS 6.7版本的WWN号&#xff0c;可以执行以下步骤&#xff1a; 1.确保已经连接了存储设备。 lspci | grep -i fibre2.在终端中输入命令&#xff1a;lsscsi&#xff0c;然后按 Enter 键。该命令…

redhawk:GSC file与STA file

1.GSC file redhawk做lowpower分析时需要GSC&#xff08;Global Switching Configuration&#xff09;file指导block/instance/power domain的开关状态。 Syntax&#xff08;in GSR file&#xff09;: GSC_FILES <gsc_FilePathName> Syntax&#xff08;in GSC file&a…

易基因|RRBS单碱基绘制580种动物的基因组规模DNA甲基化谱:Nature子刊

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2023年01月16日&#xff0c;奥地利科学院分子医学研究中心(CeMM)研究团队在《Nat Commun》杂志发表了题为“Comparative analysis of genome-scale, base-resolution DNA methylation prof…

【Git】Git是什么?简单说说Git的工作机制?Git的常用命令有那些?

目录 一、Git是什么? 二、简单说说Git的工作机制&#xff1f; 三、Git的常用命令有那些&#xff1f; &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、Git是什么? Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可…

Git push报错DeployKey does not support push code

错误描述用Git从本地仓库上传服务器仓库报错&#xff1a;DeployKey does not support push code错误代码&#xff1a;(通过$ git push origin master命令从本地仓库上传到服务器仓库)错误原因&#xff1a;没有注册ssh公钥解决办法&#xff1a;添加ssh公钥&#xff1a;先生成对应…