本帖最后由 bobbie 于 2022-8-17 15:33 编辑
基于迪文T5L串口屏的频谱图像曲线趋势图显示方案
1.1技术路线 图1 频谱实现方案 1.2CFG配置文件
图2 CFG配置文件修改
主要是将.CFG配置文件中的0x05地址处的bit6设置为1来选择音乐播放,然后将0x07地址处设置为0x10的值,以通过蜂鸣器播放出烧录至迪文屏中的wae.格式音频文件。
1.3音频的播放
图3 音频播放文档参考
在T5L芯片中集成了一个音频管理模块,利用此音频模块可以实现播放开机音乐,按钮点击音效等功能。在此方案中通过DGUS Tool软件来设置”触控控件”的“语音ID”属性,这种控制方式简单方便,不需要写任何C51代码。 图12 “语音ID”属性 1.4快速傅里叶变换算法(FFT) 快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。 计算量小的显著的优点,使得FFT在信号处理技术领域获得了广泛应用,结合高速硬件就能实现对信号的实时处理。例如,对语音信号的分析和合成,对通信系统中实现全数字化的时分制与频分制(TDM/FDM)的复用转换,在频域对信号滤波以及相关分析,通过对雷达、声纳、振动信号的频谱分析以提高对目标的搜索和跟踪的分辨率等等,都要用到FFT。 计算离散傅里叶变换的快速方法,有按时间抽取的FFT算法和按频率抽取的FFT算法。前者是将时域信号序列按偶奇分排,后者是将频域信号序列按偶奇分排。它们都借助于的两个特点:一是周期性;二是对称性,这里符号*代表其共轭。这样,便可以把离散傅里叶变换的计算分成若干步进行,计算效率大为提高。这里采用按频率抽取的 FFT算法,将频域信号序列X(k)分解为奇偶两部分,算法由时域信号序列开始逐级运算,把N点分成N/2点计算FFT,可以把直接计算离散傅里叶变换所需的N次乘法缩减到次。 具体实现代码如下:
struct compx Compx[FFT_N] = {0};//FFT输入和输出:从Compx[0]开始存放,根据大小自己定义 double SIN_TAB[FFT_N / 4 + 1];//定义正弦表的存放空间 void FFT(struct compx *xin) { register int f, m, nv2, nm1, i, k, l, j = 0; struct compx u, w, t;
nv2 = FFT_N / 2;//变址运算,即把自然顺序变成倒位序,采用雷德算法 nm1 = FFT_N - 1; for (i = 0; i < nm1; ++i) { if (i < j)//如果i<j,即进行变址 { t = xin[j]; xin[j] = xin; xin = t; } k = nv2;//求j的下一个倒位序 while (k <= j)//如果k<=j,表示j的最高位为1 { j = j - k;//把最高位变成0 k = k / 2;//k/2,比较次高位,依次类推,逐个比较,直到某个位为0 } j = j + k;//把0改为1 } { int le, lei, ip;//FFT运算核,使用蝶形运算完成FFT运算 f = FFT_N; for (l = 1; (f = f / 2) != 1; ++l);//计算l的值,即计算蝶形级数 for (m = 1; m <= l; m++)// 控制蝶形结级数 { //m表示第m级蝶形,l为蝶形级总数l=log(2)N le = 2 << (m - 1);//le蝶形结距离,即第m级蝶形的蝶形结相距le点 lei = le / 2; //同一蝶形结中参加运算的两点的距离 u.real = 1.0;//u为蝶形结运算系数,初始值为1 u.imag = 0.0; w.real = cos_tab(PI / lei);//w为系数商,即当前系数与前一个系数的商 w.imag = -sin_tab(PI / lei); for (j = 0; j <= lei - 1; j++)//控制计算不同种蝶形结,即计算系数不同的蝶形结 { for (i = j; i <= FFT_N - 1; i = i + le)//控制同一蝶形结运算,即计算系数相同蝶形结 { ip = i + lei;//i,ip分别表示参加蝶形运算的两个节点 t = EE(xin[ip], u);//蝶形运算,详见公式 xin[ip].real = xin.real - t.real; xin[ip].imag = xin.imag - t.imag; xin.real = xin.real + t.real; xin.imag = xin.imag + t.imag; } u = EE(u, w);//改变系数,进行下一个蝶形运算 } } } }
1.5效果演示
1.6视频效果
参考文献: [1] 吴继发, 陈特放. 单片机实现音频频谱显示的快速算法研究[J]. 电子设计工程, 2009, 17(11):2. [2] 陈童, 李松林. 基于Flash平台的网络音频频谱可视化实验设计Experimental design for visualization of audio spectrum based on Flash platform[J]. 实验技术与管理. [3] 纪广兴. 一种音频频谱动画的绘制算法:, CN107221021A[P]. 2017. |