久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8766|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合视频| 国产成人一区二区三区久久久 | 亚洲国产精品久久久久秋霞不卡 | 草草影院ccyy| 国产精品国产三级国产播12软件 | 久久99国产精品 | 色呦呦网站 | 日韩在线免费视频 | 国产a区 | 国产高清精品一区二区三区 | 久久久久亚洲精品中文字幕 | 亚洲视频在线观看 | 国产亚洲精品精品国产亚洲综合 | 欧美福利在线 | 欧美一级免费 | 日韩av成人在线 | 91婷婷韩国欧美一区二区 | av超碰| 久久精品免费一区二区三 | 国产一区二区在线播放视频 | 一级做a爰片性色毛片视频停止 | 午夜免费网站 | 午夜爱爱毛片xxxx视频免费看 | 午夜视频在线 | 亚洲欧美精品在线观看 | 久久久久久久久99 | 国产精品99999| 国产精品久久久久无码av | 欧美一区不卡 | 免费亚洲一区二区 | 中文字幕不卡 | 欧美啪啪网站 | 成人 在线 | 久久精品久久综合 | 高清成人免费视频 | 亚洲成人中文字幕 | 夜夜骑首页 | 欧美精品在线一区 | 日韩免费三级 | 欧美视频二区 | 999热视频|