找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8271|回复: 14
收起左侧

基于STM32战舰版的音乐频谱源码

  [复制链接]
ID:104828 发表于 2017-12-29 21:10 | 显示全部楼层 |阅读模式
基于stm32F1音乐频谱
单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "adc.h"
  8. #include "stm32_dsp.h"
  9. #include <math.h>

  10. /* Private typedef -----------------------------------------------------------*/
  11. /* Private define ------------------------------------------------------------*/
  12. #define DOUBLE_COLOR                1        //是否为双色屏,若为双色屏则改为1
  13. #define NPT                                        64        //FFT采样点数
  14. #define GREEN_STOP_TIME                15        //绿色点顶端停顿时间,值越大时间越长
  15. #define GREEN_SUB_SPEED                100        //绿色点下移速度,值越大速度越慢
  16. #define RED_SUB_SPEED                 50        //红色频柱向下缩短速度,值越大速度越慢


  17. uint32_t ADC_DataNum=0;                        //ADC采样点数
  18. uint32_t RedTime=0;                                //红色点下移时间变量
  19. #if DOUBLE_COLOR
  20. uint32_t GreenTime=0;                        //绿色点下移时间变量
  21. uint32_t GreenStopTime[32]={0};        //绿色点顶端停顿时间数据
  22. #endif

  23. volatile uint8_t ADC_TimeOutFlag=1;                        //ADC定时采样时间到标志       

  24. extern __IO uint16_t ADCConvertedValue;                //ADC采样值
  25. extern int LCD_COLOR;
  26. long lBUFMAG[NPT+NPT/2];                                        //存储求模后的数据
  27. long lBUFOUT[NPT];//FFT输出序列
  28. long lBUFIN[NPT];//FFT输入系列

  29. uint8_t fftHightRedBuf[NPT/2]={0};                        //红色频柱高度数组
  30. uint8_t DisplayRedDataBuf[32*8]={0};                //红色显示缓冲区
  31. #if DOUBLE_COLOR
  32. uint8_t fftHightGreenBuf[NPT/2]={0};                //绿色频点高度数组
  33. uint8_t DisplayGreenDataBuf[32*8]={0};                //绿色显示缓冲区
  34. #endif

  35. u16 color_tab[16]={DARKBLUE,BLUE,LIGHTBLUE,GREEN,LIGHTGREEN,RED,BRED,BRRED,BLACK,YELLOW,CYAN,MAGENTA,GRAYBLUE,LGRAYBLUE,BROWN,LGRAY};


  36. void music_fft_main(uint8_t *RedNewHeight,uint8_t *GreenNewHeight)
  37. {
  38.   int BarWidth = 8;
  39.   int i=0;
  40.         int j=0;
  41.   static uint8_t RedOldHeight[32] = {0};
  42.   static uint8_t GreenOldHeight[32] = {0};
  43.         for(i=0;i<32;i++)
  44. {
  45.                 //清除之前的绿色方块
  46.                 //LCD_COLOR = LCD_COLOR_BLACK;
  47.           
  48.                 LCD_Fill(GreenOldHeight[i],(BarWidth+2)*i,GreenOldHeight[i]+3,(BarWidth+2)*i+BarWidth,WHITE);
  49.                 //显示当前的绿色方块
  50.                 LCD_Fill(GreenNewHeight[i],(BarWidth+2)*i,GreenNewHeight[i]+3,(BarWidth+2)*i+BarWidth,color_tab[16-j]);
  51.                 //显示红色柱
  52.                 if(RedNewHeight[i]>RedOldHeight[i]){//如果当前的绿色柱子高度比之前的大则补齐绿色柱子
  53.                         LCD_Fill(RedOldHeight[i],(BarWidth+2)*i,RedNewHeight[i],(BarWidth+2)*i+BarWidth,color_tab[j]);
  54.                 }else{//如果当前显示的绿色柱子高度小于之前的柱子则需要将多余的绿色柱子用背景色填充
  55.                         LCD_Fill(RedNewHeight[i],(BarWidth+2)*i,RedOldHeight[i],(BarWidth+2)*i+BarWidth,WHITE);
  56.                 }
  57.                 //将新数据保存
  58.                 RedOldHeight[i] = RedNewHeight[i];
  59.                 GreenOldHeight[i] = GreenNewHeight[i];       
  60.                 if(j>=15)
  61.                         j=0;
  62.                 j++;
  63.         }
  64. }

  65. void powerMag(long nfill)
  66. {         int32_t lX,lY;
  67.                 uint32_t i;
  68.                 for (i=0; i < nfill; i++)
  69.                 {
  70.                         lX= (lBUFOUT[i]<<16)>>16; /* sine_cosine --> cos */
  71.                         lY= (lBUFOUT[i] >> 16);   /* sine_cosine --> sin */     
  72.                         {
  73.                                         float X=  64*((float)lX)/32768;
  74.                                         float Y = 64*((float)lY)/32768;
  75.                                         float Mag = sqrt(X*X+ Y*Y)/nfill;  // 先平方和,再开方
  76.                                 lBUFMAG[i] = (long)(Mag*65536);
  77.     }     
  78.   }


  79. }
  80. int main(void)
  81. {uint32_t i=0;
  82.         delay_init();                     //延时函数初始化          
  83.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  84.         uart_init(9600);                 //串口初始化为9600
  85.         LED_Init();                             //LED端口初始化
  86.                  TIM2_Configuration();
  87.         TIM2_NVIC_Configuration();
  88.         FFT_RCC_Configuration();
  89.         FFT_GPIO_Configuration();
  90.         FFT_DMA_Init();
  91.         FFT_ADC_Init();
  92.         LCD_Init();       
  93. //         BACK_COLOR=BLACK;
  94.         TIM_Cmd(TIM2, ENABLE);
  95.         ADC_SoftwareStartConvCmd(ADC1, DISABLE);
  96.          
  97.         while(1)
  98.         {
  99.                 if(ADC_TimeOutFlag){
  100.                         #if DOUBLE_COLOR
  101.                         GreenTime++;
  102.                         #endif
  103.                         RedTime++;
  104.                         ADC_TimeOutFlag=0;
  105.                         if(ADC_DataNum<NPT){//采样点没有达到所要求的点
  106. //                                 ADC1->CR2 |= 0x00500000;//
  107.                                 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  108.                                 while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  109.                                 /* Clear channel1 transfer complete flag */
  110.                                  DMA_ClearFlag(DMA1_FLAG_TC1);
  111. //                                 ADC1->CR2 &= 0xFFAFFFFF;//
  112.                                 ADC_SoftwareStartConvCmd(ADC1, DISABLE);
  113.                                 lBUFIN[ADC_DataNum]=ADCConvertedValue<<16;
  114.                                 ADC_DataNum++;
  115.                         }else{
  116.                                 TIM_Cmd(TIM2, DISABLE);
  117.                                 ADC_DataNum=0;
  118.                                 cr4_fft_64_stm32(lBUFOUT,lBUFIN,NPT);//调用STM32的DSP库作FFT变换
  119.                                 powerMag(NPT);//计算频点幅值
  120.                                 //更新红色点的高度
  121.                                 for(i=0;i<NPT/2;i++){
  122.                                         if((uint8_t)(lBUFMAG[i])>fftHightRedBuf[i]){
  123.                                                 fftHightRedBuf[i]=(lBUFMAG[i]);
  124.                                         }
  125.                                         #if DOUBLE_COLOR
  126.                                         //刷新绿色点高度
  127.                                         if(fftHightRedBuf[i]>=fftHightGreenBuf[i]){
  128.                                                 fftHightGreenBuf[i]=fftHightRedBuf[i];
  129.                                                 GreenStopTime[i]=GREEN_STOP_TIME;//绿点停顿时间
  130.                                                 if(fftHightRedBuf[i]>=235){
  131.                                                         fftHightGreenBuf[i]=235;
  132.                                                         fftHightRedBuf[i]=235;
  133.                                                 }
  134.                                         }
  135.                                         #else
  136.                                         if(fftHightRedBuf[i]>=239){
  137.                                                 fftHightRedBuf[i]=239;
  138.                                         }
  139.                                         #endif

  140.                                 }
  141.                                 //显示红色柱子
  142.                                 music_fft_main(fftHightRedBuf,fftHightGreenBuf);
  143.                                 //显示绿色点
  144.                                 #if DOUBLE_COLOR
  145.                                 //绿色点下移
  146.                                 if((GreenTime>GREEN_SUB_SPEED)){        //绿色点下降间隔时间
  147.                                         GreenTime=0;
  148.                                         for(i=0;i<NPT/2;i++){
  149.                                                 if((fftHightGreenBuf[i]!=0)&&(GreenStopTime[i]==0)){
  150.                                                         fftHightGreenBuf[i]--;
  151.                                                 }
  152.                                         }
  153.                                 }
  154.                                 #endif
  155.                                 //红色下移
  156.                                 if(RedTime>RED_SUB_SPEED){
  157.                                         RedTime=0;
  158.                                         for(i=0;i<NPT/2;i++){
  159.                                                 if((fftHightRedBuf[i]!=0)){
  160.                                                         fftHightRedBuf[i]--;
  161.                                                 }
  162.                                         }
  163.                                 }
  164.                                 //绿色点停顿时间减一
  165.                                 #if DOUBLE_COLOR
  166.                                 for(i=0;i<NPT/2;i++){
  167.                                         if(GreenStopTime[i]!=0){
  168.                                                 GreenStopTime[i]--;       
  169.                                         }
  170.                                 }
  171.                                 #endif
  172.                         TIM_Cmd(TIM2, ENABLE);
  173.                         }
  174.                 }
  175.         }
  176. }


  177. void TIM2_IRQHandler(void)
  178. {
  179.            if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){
  180. //            TIM2->SR = (uint16_t)~TIM_FLAG_Update;
  181.                         TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);        //清中断
  182.            ADC_TimeOutFlag=1;
  183.         }
  184. }

复制代码

所有资料51hei提供下载:
基于STM32战舰版的音乐频谱.zip (3.64 MB, 下载次数: 255)
回复

使用道具 举报

ID:97068 发表于 2018-1-21 18:05 | 显示全部楼层
厉害,学学
回复

使用道具 举报

ID:283848 发表于 2018-2-12 15:55 | 显示全部楼层

正好需要,先留个爪
回复

使用道具 举报

ID:285719 发表于 2018-2-26 17:36 | 显示全部楼层
正好需要,给朋友做个用心的礼物
回复

使用道具 举报

ID:316478 发表于 2018-4-25 20:58 | 显示全部楼层
需不需要外接其他的设备?
回复

使用道具 举报

ID:316811 发表于 2018-4-26 10:39 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:319163 发表于 2018-8-6 09:06 | 显示全部楼层
厉害,学习学习

回复

使用道具 举报

ID:128101 发表于 2018-10-9 21:43 | 显示全部楼层
感谢分享 学习学习
回复

使用道具 举报

ID:423385 发表于 2018-11-16 08:31 | 显示全部楼层
很好,很强大
回复

使用道具 举报

ID:504392 发表于 2019-4-3 20:18 | 显示全部楼层
厉害了,巨佬
回复

使用道具 举报

ID:504392 发表于 2019-4-11 21:46 | 显示全部楼层
楼主用的是STM32F103ZE麽
回复

使用道具 举报

ID:654407 发表于 2019-12-2 17:54 | 显示全部楼层
感谢分享,学习
回复

使用道具 举报

ID:115798 发表于 2020-5-5 23:10 | 显示全部楼层
感谢分享,学习
回复

使用道具 举报

ID:698783 发表于 2020-12-25 14:13 | 显示全部楼层
非常好的资料  文件里怎么没有原理图啊
回复

使用道具 举报

ID:422885 发表于 2021-4-28 23:04 | 显示全部楼层
拿走研究一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表