bobbie 发表于 2022-8-17 17:18:20

【开源】基于迪文T5L屏幕的音频播放与可视化

基于迪文T5L屏幕的音频播放与可视化1.1.技术路线       之前的频率趋势图像方案已经可以基本实现音频可视化的效果,但是与传统频谱相比,没有把振幅量化显示;而且实时写点较慢。为解决以上两个问题,提出如下图所示方案: 图1 实现频率与振幅可视化1.2.艺术字变量显示       艺术字变量显示控件和数据变量显示控件,都是用来显示数值的显示控件,比如显示int整数, float浮点数等,而不同之处就是艺术字变量显示控件是利用数字图标来显示数值的,而数据变量显示控件则是利用字库中的数字字符来显示数值的,利用数字图标的好处就是可以做到界面精美,而且字体大小可以做到任意自如,艺术字变量显示控件总共需要12个数字图标,按照排列顺序分别为”0123456789-.”,这些数字图标我们是可以通过PS等其他绘图工具制作而成的,要保证所有的数字图标大小都一样,当需要显示某一个具体的数值时, 艺术字变量显示控件就会利用这些数字图标来组合成想要的数值。图2艺术字变量显示控件的指令存储格式
图4 icl文件的制作
       想要显示某一个具体的数值时,就往此地址处写入相应的数据,设置数字图标所在的icl文件,并同时指定数字图标在此icl文件中的起始位置,即可完成功能需求。在此方案中将频率数量级制成icl文件,把数据存入其中,实时显示。部分代码和demo如下: 图5 demo界面设置#include "sys.h"xdata float val;
void float_val_disp(float val,u16 resolution){#define VAL_SP0x1004 //艺术字变量显示控件的SP地址#define VAL_VP0x1000 //艺术字变量显示控件的VP地址#define RESOLUTION_ADDR(VAL_SP+5) //分辨率属性的地址,高字节设置整数的位数,低字节设置小数的位数#define INTEGER_NUM4
if(!(resolution&0xff00)resolution |= (INTEGER_NUM<<8);
sys_write_vp(RESOLUTION_ADDR,(u8*)&resolution,1);//动态修改分辨率属性sys_write_vp(VAL_VP,(u8*)&val,2);//设置要显示的数值}

1.3.程序优化
上述代码已经实现目标功能,然而由于音频控制直接由按键返回键设定,无法由代码控制,导致刷新频率有限。由此提出如下图所示方案:http://inforum.dwin.com.cn:20080/data/attachment/forum/202208/17/173604plxd4s244hl1qill.png       此框架的大致原理是先利用定时器来产生一个按钮点击扫描信号is_btn_scan,此扫描信号的周期为30ms,周期值可随意设置,建议值在10ms-50ms之间,既兼顾到了按钮点击响应的时效性,也兼顾到了最少的CPU占用量。当is_btn_scan扫描信号到了之后,用sys_read_vp函数进行读取按钮键值的操作,如果读取到的键值不为0,说明用户点击了界面上的按钮,接下来就是对此按钮点击操作立即进行事件响应,,再根据按钮键值划分范围,将此按钮产生的点击事件派发给相应的界面进行处理。处理完成之后,再将键值给清0即可。搭配FFT函数使用,用按键控制频谱显示的同时也直接控制了声音。具体内容如附件所示。


1.4.效果预览
1.5.视频演示 Bilibili: https://www.bilibili.com/video/BV1SP41157uF?share_source=copy_web&vd_source=d92404e3c71c2242785616ae6c55dd40


参考资料:.ASIC设计 智能屏IOT应用 熊家余单片机实现音频频谱显示的快速算法研究
页: [1]
查看完整版本: 【开源】基于迪文T5L屏幕的音频播放与可视化