找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8823|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

基于STM32戰(zhàn)艦版的音樂(lè)頻譜源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104828 發(fā)表于 2017-12-29 21:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于stm32F1音樂(lè)頻譜
單片機(jī)源程序如下:
  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采樣點(diǎn)數(shù)
  14. #define GREEN_STOP_TIME                15        //綠色點(diǎn)頂端停頓時(shí)間,值越大時(shí)間越長(zhǎng)
  15. #define GREEN_SUB_SPEED                100        //綠色點(diǎn)下移速度,值越大速度越慢
  16. #define RED_SUB_SPEED                 50        //紅色頻柱向下縮短速度,值越大速度越慢


  17. uint32_t ADC_DataNum=0;                        //ADC采樣點(diǎn)數(shù)
  18. uint32_t RedTime=0;                                //紅色點(diǎn)下移時(shí)間變量
  19. #if DOUBLE_COLOR
  20. uint32_t GreenTime=0;                        //綠色點(diǎn)下移時(shí)間變量
  21. uint32_t GreenStopTime[32]={0};        //綠色點(diǎn)頂端停頓時(shí)間數(shù)據(jù)
  22. #endif

  23. volatile uint8_t ADC_TimeOutFlag=1;                        //ADC定時(shí)采樣時(shí)間到標(biāo)志       

  24. extern __IO uint16_t ADCConvertedValue;                //ADC采樣值
  25. extern int LCD_COLOR;
  26. long lBUFMAG[NPT+NPT/2];                                        //存儲(chǔ)求模后的數(shù)據(jù)
  27. long lBUFOUT[NPT];//FFT輸出序列
  28. long lBUFIN[NPT];//FFT輸入系列

  29. uint8_t fftHightRedBuf[NPT/2]={0};                        //紅色頻柱高度數(shù)組
  30. uint8_t DisplayRedDataBuf[32*8]={0};                //紅色顯示緩沖區(qū)
  31. #if DOUBLE_COLOR
  32. uint8_t fftHightGreenBuf[NPT/2]={0};                //綠色頻點(diǎn)高度數(shù)組
  33. uint8_t DisplayGreenDataBuf[32*8]={0};                //綠色顯示緩沖區(qū)
  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.                 //顯示當(dāng)前的綠色方塊
  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]){//如果當(dāng)前的綠色柱子高度比之前的大則補(bǔ)齊綠色柱子
  53.                         LCD_Fill(RedOldHeight[i],(BarWidth+2)*i,RedNewHeight[i],(BarWidth+2)*i+BarWidth,color_tab[j]);
  54.                 }else{//如果當(dāng)前顯示的綠色柱子高度小于之前的柱子則需要將多余的綠色柱子用背景色填充
  55.                         LCD_Fill(RedNewHeight[i],(BarWidth+2)*i,RedOldHeight[i],(BarWidth+2)*i+BarWidth,WHITE);
  56.                 }
  57.                 //將新數(shù)據(jù)保存
  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;  // 先平方和,再開(kāi)方
  76.                                 lBUFMAG[i] = (long)(Mag*65536);
  77.     }     
  78.   }


  79. }
  80. int main(void)
  81. {uint32_t i=0;
  82.         delay_init();                     //延時(shí)函數(shù)初始化          
  83.         NVIC_Configuration();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  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){//采樣點(diǎn)沒(méi)有達(dá)到所要求的點(diǎn)
  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);//調(diào)用STM32的DSP庫(kù)作FFT變換
  119.                                 powerMag(NPT);//計(jì)算頻點(diǎn)幅值
  120.                                 //更新紅色點(diǎn)的高度
  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.                                         //刷新綠色點(diǎn)高度
  127.                                         if(fftHightRedBuf[i]>=fftHightGreenBuf[i]){
  128.                                                 fftHightGreenBuf[i]=fftHightRedBuf[i];
  129.                                                 GreenStopTime[i]=GREEN_STOP_TIME;//綠點(diǎn)停頓時(shí)間
  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.                                 //顯示綠色點(diǎn)
  144.                                 #if DOUBLE_COLOR
  145.                                 //綠色點(diǎn)下移
  146.                                 if((GreenTime>GREEN_SUB_SPEED)){        //綠色點(diǎn)下降間隔時(shí)間
  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.                                 //綠色點(diǎn)停頓時(shí)間減一
  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. }

復(fù)制代碼

所有資料51hei提供下載:
基于STM32戰(zhàn)艦版的音樂(lè)頻譜.zip (3.64 MB, 下載次數(shù): 255)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:97068 發(fā)表于 2018-1-21 18:05 | 只看該作者
厲害,學(xué)學(xué)
回復(fù)

使用道具 舉報(bào)

板凳
ID:283848 發(fā)表于 2018-2-12 15:55 | 只看該作者
zhaowenmin 發(fā)表于 2018-1-21 18:05
厲害,學(xué)學(xué)

正好需要,先留個(gè)爪
回復(fù)

使用道具 舉報(bào)

地板
ID:285719 發(fā)表于 2018-2-26 17:36 | 只看該作者
正好需要,給朋友做個(gè)用心的禮物
回復(fù)

使用道具 舉報(bào)

5#
ID:316478 發(fā)表于 2018-4-25 20:58 | 只看該作者
需不需要外接其他的設(shè)備?
回復(fù)

使用道具 舉報(bào)

6#
ID:316811 發(fā)表于 2018-4-26 10:39 | 只看該作者
厲害了
回復(fù)

使用道具 舉報(bào)

7#
ID:319163 發(fā)表于 2018-8-6 09:06 | 只看該作者
厲害,學(xué)習(xí)學(xué)習(xí)

回復(fù)

使用道具 舉報(bào)

8#
ID:128101 發(fā)表于 2018-10-9 21:43 | 只看該作者
感謝分享 學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

9#
ID:423385 發(fā)表于 2018-11-16 08:31 | 只看該作者
很好,很強(qiáng)大
回復(fù)

使用道具 舉報(bào)

10#
ID:504392 發(fā)表于 2019-4-3 20:18 | 只看該作者
厲害了,巨佬
回復(fù)

使用道具 舉報(bào)

11#
ID:504392 發(fā)表于 2019-4-11 21:46 | 只看該作者
樓主用的是STM32F103ZE麼
回復(fù)

使用道具 舉報(bào)

12#
ID:654407 發(fā)表于 2019-12-2 17:54 | 只看該作者
感謝分享,學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

13#
ID:115798 發(fā)表于 2020-5-5 23:10 | 只看該作者
感謝分享,學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

14#
ID:698783 發(fā)表于 2020-12-25 14:13 | 只看該作者
非常好的資料  文件里怎么沒(méi)有原理圖啊
回復(fù)

使用道具 舉報(bào)

15#
ID:422885 發(fā)表于 2021-4-28 23:04 | 只看該作者
拿走研究一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表