0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32单片机的音乐频谱显示器设计

CHANBAEK 来源:电子甲 作者:电子甲 2023-08-22 15:47 次阅读
  1. 系统设计主要涉及的有作为核心进行计算的STM32单片机的主控电路设计、实现蓝牙电磁数据传输的MH-M18蓝牙音频采集电路的设计、负责提供音乐切换控制信号的按键状态采集电路、对FFT变换计算所得频谱进行展示的OLED显示电路以及作为物理功放的LM386音频放大电路设计。
  2. 原理图:
    图片

3.程序框图

图片

主程序首先进行初始化,对系统的ADC定时器、OLED等等进行初始参数配置,其后是对设计目标的计算工作。本设计主要分为三个大的模块,一是蓝牙的数据接收,二是音乐的传输播放,三是时域信号傅里叶变换后的频域展示,其中最主要的是时域信号傅里叶变换后的频域展示。主程序main中主要对频谱在OLED上的显示规则、FFT计算的相关需求进行了设计。

图片

主程序的总体设计思路是系统开机后首先对STM32单片机内部进行复位,之后是对各项设置进行一个初始化操作,包括定时器、模数转换器通信协议等方面,然后程序开始正式运行,执行功放和FFT任务,进入循环和等待控制信号。

图片

蓝牙传输模块的作用是接收源设备所发射的蓝牙音频信号,并提供给音频放大电路进行放大及播放。蓝牙传输子程序,首先需要判断蓝牙状态,确认蓝牙开启后进行参数扫描,扫描后选择目标设备来进行连接,连接成功之后即可根据指令进行音频信号接收。本设计的蓝牙音乐源为手机,因此需设置适用于手机传输的波特率,并于手机相连。

图片

按键状态采集程序是用于实现对音乐的切换,完成上一曲、下一曲及暂停功能。按键状态的采集程序较为简单,仅需要对按键状态采集电路中各个按键的状态作出判断,当按下不同按钮后,STM32单片机获取到不同的状态信息,从而通过判断语句实现音乐的切换功能。

4.算法的实现

傅里叶变换是时域与频域之间转换的重要工具。快速傅氏变换FFT是一种用于计算离散傅里叶变换(DFT)的一种快速算法,它是对离散傅里叶变换的一种改进,常用于通信领域。它是傅里叶变化的一大进步,对于计算机系统中的时频变换来说意义重大,根据奇、偶、虚、实等特性,它把原来复杂度为O(n ^2^ )的朴素多项式乘法转化为了O(nlogn)的算法。

DFT的复杂度较高,不利于计算机计算,其计算表达式为

FFT算法利用DFT的奇偶相关特性,使时频变换算法复杂度大大降低,具体的算法原理可见文件夹“DSP_Lib”中算法程序。

利用FFT实现交互的程序设计也可参见主函数main。首先要进行模数转换,将电子元件中通过电压传递的模拟信号采样为数字信号,设计程序对数字信号进行缓存,缓存到一定数据量后对该段信号进行FFT计算,得到其频谱数据;之后清楚数据,重复上述缓存及计算步骤。本设计需要采集的采样频率是10 kHz^[14]^。本设计对ADC缓存设计数量为256,即对256个时序信号点进行FFT算法运算,然后反馈至OLED显示。音频信号采集、FFT运算及OLED显示效果程序设计思路:程序系统每次进入ADC_DMA数据传输中断回滚函数后,就可以将ADC_DMA数据传输通道关闭,之后将 ADC转换的数据展开傅里叶(FFT)运算、计算各次谐波幅值,根据用户设定的特效模式,将各次谐波赋值代入到相应算法中,进行特效运算,最后OLED显示音乐频谱效果。FFT运算及OLED显示流程如图所示。

图片

5.主代码展示:

/* 变量定义 */
uint16_t adc_buff[NPT];                //ADC缓存变量
uint8_t AdcConvEnd;                    //DMA转换完成标志位
long InBufArray[NPT];                  //输入数组
long OutBufArray[NPT/2];              //输出数组
long MagBufArray[NPT/2];              //谐波数组
uint8_t flag;
uint8_t key_flag;                      //按键标志位


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */


void GetPowerMag()
{
  signed short lX,lY;
  float X,Y,Mag;
  unsigned short i;
  for(i=0; i< NPT/2; i++)
  {
    lX  = (OutBufArray[i] < < 16) > > 16;
    lY  = (OutBufArray[i] > > 16);

    //除以32768再乘65536是为了符合浮点数计算规律
    X = NPT * ((float)lX) / 32768;
    Y = NPT * ((float)lY) / 32768;
    Mag = sqrt(X * X + Y * Y) / NPT;
    if(i == 0)
      MagBufArray[i] = (unsigned long)(Mag * 32768);
    else
      MagBufArray[i] = (unsigned long)(Mag * 65536);   //MagBufArray[]为计算输出的幅值数组
  }
}


/* 显示柱子高度 */
void display(uint8_t x, uint8_t height)
{
  uint8_t i, j, data, k;
  for(i=0; i< 8; i++)//显示高度
  {
    OLED_Set_Pos(x*4, i);

    if(((i+1)*8) <= (64-height))
      data = 0x00;
    else{
      if((((i+1)*8)-(64-height)) < 8){
        data = 0;
        for(k=0; k< (((i+1)*8)-(64-height)); k++)
        {
          data > >= 1;
          data |= 0x80;
        }
      }
      else
        data = 0xff;
    }

    for(j=0; j< 3; j++)
    {
      OLED_WR_Byte(data, OLED_DATA);
    }
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620838
  • 显示器
    +关注

    关注

    21

    文章

    4737

    浏览量

    137865
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348744
  • lm386
    +关注

    关注

    8

    文章

    100

    浏览量

    53590
  • 音频放大电路

    关注

    7

    文章

    32

    浏览量

    26595
收藏 人收藏

    评论

    相关推荐

    手把手教你用51单片机DIY音乐频谱显示

    `手把手教你用51单片机DIY音乐频谱显示`
    发表于 08-15 23:13

    单片机制作音乐频谱显示器

    见他们好多人都用单片机作的音乐频谱显示器,不知道如何做到的,记得学习数字信号处理的时候须要用到好多FFT啊之类的算法,这里也会用到吗?如何编程实现的呢?求助
    发表于 08-25 22:09

    求基于单片机音乐频谱显示设计

    各位大神,跪求基于单片机音乐频谱显示设计,主要要求是:音乐不是外接的音乐,需要自己写
    发表于 04-11 22:52

    很炫的音乐频谱——五彩音乐频谱显示器

    ` 本帖最后由 chinayuyi 于 2013-5-27 17:00 编辑 很炫的音乐频谱——五彩音乐频谱显示器附出处:百度下“羽翼电
    发表于 05-27 16:57

    AS1216水晶城堡桌面音乐频谱显示器 闪亮登场

    所欠缺,这就对了,你缺的就是她-----AS1216音乐频谱显示器。当你拥有了她你才发现,世界上还有如此美好的听音享受。如果说乔布斯的iphone4是手机中的经典,那么AS1216将是频谱
    发表于 06-05 15:52

    基于SLH89F5162的单片机智能音乐频谱播放

    单片机为控制核心的音乐频谱播放,动感的音乐搭配错落有致的音乐
    发表于 10-31 14:29

    基于SLH89F5162的单片机智能音乐频谱播放

    IAP单片机为控制核心的音乐频谱播放,动感的音乐搭配错落有致的音乐
    发表于 11-15 22:59

    炫彩音乐显示器程序 思路

    51单片机炫彩音乐显示器程序应该怎么写
    发表于 03-24 16:40

    请问什么单片机驱动彩屏显示器好?

    如题:::什么单片机驱动彩屏显示器好,,STM32????还有什么彩屏的显示器资料最完好,,最好有中文资料 , 那个ILI9320感觉否看不懂,彩屏驱动芯片
    发表于 09-24 06:09

    基于RT-Thread+RA6M4的FFT音乐频谱显示器制作方案

    1、基于RT-Thread+RA6M4的FFT音乐频谱显示器制作本项目制作了一个FFT音乐频谱显示器
    发表于 07-25 12:46

    基于51单片机音乐喷泉设计频谱彩灯音乐盒播放源代码分享

    基于51单片机音乐喷泉设计频谱彩灯音乐盒播放源代码
    发表于 09-26 07:16

    用51单片机DIY音乐频谱显示

    该资源是手把手教你用51单片机DIY音乐频谱显示
    发表于 09-27 07:42

    音乐频谱-PCB及代码

    基于stc12c5a单片机音乐频谱显示屏幕的制作,可以根据音乐显示出不同的
    发表于 02-29 15:08 61次下载

    基于增强型8051单片机音乐频谱显示器的设计

    基于增强型8051单片机音乐频谱显示器的设计基于增强型8051单片机音乐
    发表于 05-20 16:50 23次下载

    stm32音乐频谱OLED屏显示

    基于STM32F103和FFT变换的音乐频谱显示
    发表于 06-17 14:52 49次下载