0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32單片機(jī)的音樂(lè)頻譜顯示器設(shè)計(jì)

CHANBAEK ? 來(lái)源:電子甲 ? 作者:電子甲 ? 2023-08-22 15:47 ? 次閱讀
  1. 系統(tǒng)設(shè)計(jì)主要涉及的有作為核心進(jìn)行計(jì)算的STM32單片機(jī)的主控電路設(shè)計(jì)、實(shí)現(xiàn)藍(lán)牙電磁數(shù)據(jù)傳輸?shù)腗H-M18藍(lán)牙音頻采集電路的設(shè)計(jì)、負(fù)責(zé)提供音樂(lè)切換控制信號(hào)的按鍵狀態(tài)采集電路、對(duì)FFT變換計(jì)算所得頻譜進(jìn)行展示的OLED顯示電路以及作為物理功放的LM386音頻放大電路設(shè)計(jì)。
  2. 原理圖:
    圖片

3.程序框圖

圖片

主程序首先進(jìn)行初始化,對(duì)系統(tǒng)的ADC、定時(shí)器、OLED等等進(jìn)行初始參數(shù)配置,其后是對(duì)設(shè)計(jì)目標(biāo)的計(jì)算工作。本設(shè)計(jì)主要分為三個(gè)大的模塊,一是藍(lán)牙的數(shù)據(jù)接收,二是音樂(lè)的傳輸播放,三是時(shí)域信號(hào)傅里葉變換后的頻域展示,其中最主要的是時(shí)域信號(hào)傅里葉變換后的頻域展示。主程序main中主要對(duì)頻譜在OLED上的顯示規(guī)則、FFT計(jì)算的相關(guān)需求進(jìn)行了設(shè)計(jì)。

圖片

主程序的總體設(shè)計(jì)思路是系統(tǒng)開(kāi)機(jī)后首先對(duì)STM32單片機(jī)內(nèi)部進(jìn)行復(fù)位,之后是對(duì)各項(xiàng)設(shè)置進(jìn)行一個(gè)初始化操作,包括定時(shí)器、模數(shù)轉(zhuǎn)換器、通信協(xié)議等方面,然后程序開(kāi)始正式運(yùn)行,執(zhí)行功放和FFT任務(wù),進(jìn)入循環(huán)和等待控制信號(hào)。

圖片

藍(lán)牙傳輸模塊的作用是接收源設(shè)備所發(fā)射的藍(lán)牙音頻信號(hào),并提供給音頻放大電路進(jìn)行放大及播放。藍(lán)牙傳輸子程序,首先需要判斷藍(lán)牙狀態(tài),確認(rèn)藍(lán)牙開(kāi)啟后進(jìn)行參數(shù)掃描,掃描后選擇目標(biāo)設(shè)備來(lái)進(jìn)行連接,連接成功之后即可根據(jù)指令進(jìn)行音頻信號(hào)接收。本設(shè)計(jì)的藍(lán)牙音樂(lè)源為手機(jī),因此需設(shè)置適用于手機(jī)傳輸?shù)牟ㄌ芈剩⒂谑謾C(jī)相連。

圖片

按鍵狀態(tài)采集程序是用于實(shí)現(xiàn)對(duì)音樂(lè)的切換,完成上一曲、下一曲及暫停功能。按鍵狀態(tài)的采集程序較為簡(jiǎn)單,僅需要對(duì)按鍵狀態(tài)采集電路中各個(gè)按鍵的狀態(tài)作出判斷,當(dāng)按下不同按鈕后,STM32單片機(jī)獲取到不同的狀態(tài)信息,從而通過(guò)判斷語(yǔ)句實(shí)現(xiàn)音樂(lè)的切換功能。

4.算法的實(shí)現(xiàn)

傅里葉變換是時(shí)域與頻域之間轉(zhuǎn)換的重要工具。快速傅氏變換FFT是一種用于計(jì)算離散傅里葉變換(DFT)的一種快速算法,它是對(duì)離散傅里葉變換的一種改進(jìn),常用于通信領(lǐng)域。它是傅里葉變化的一大進(jìn)步,對(duì)于計(jì)算機(jī)系統(tǒng)中的時(shí)頻變換來(lái)說(shuō)意義重大,根據(jù)奇、偶、虛、實(shí)等特性,它把原來(lái)復(fù)雜度為O(n ^2^ )的樸素多項(xiàng)式乘法轉(zhuǎn)化為了O(nlogn)的算法。

DFT的復(fù)雜度較高,不利于計(jì)算機(jī)計(jì)算,其計(jì)算表達(dá)式為

FFT算法利用DFT的奇偶相關(guān)特性,使時(shí)頻變換算法復(fù)雜度大大降低,具體的算法原理可見(jiàn)文件夾“DSP_Lib”中算法程序。

利用FFT實(shí)現(xiàn)交互的程序設(shè)計(jì)也可參見(jiàn)主函數(shù)main。首先要進(jìn)行模數(shù)轉(zhuǎn)換,將電子元件中通過(guò)電壓傳遞的模擬信號(hào)采樣為數(shù)字信號(hào),設(shè)計(jì)程序?qū)?shù)字信號(hào)進(jìn)行緩存,緩存到一定數(shù)據(jù)量后對(duì)該段信號(hào)進(jìn)行FFT計(jì)算,得到其頻譜數(shù)據(jù);之后清楚數(shù)據(jù),重復(fù)上述緩存及計(jì)算步驟。本設(shè)計(jì)需要采集的采樣頻率是10 kHz^[14]^。本設(shè)計(jì)對(duì)ADC緩存設(shè)計(jì)數(shù)量為256,即對(duì)256個(gè)時(shí)序信號(hào)點(diǎn)進(jìn)行FFT算法運(yùn)算,然后反饋至OLED顯示。音頻信號(hào)采集、FFT運(yùn)算及OLED顯示效果程序設(shè)計(jì)思路:程序系統(tǒng)每次進(jìn)入ADC_DMA數(shù)據(jù)傳輸中斷回滾函數(shù)后,就可以將ADC_DMA數(shù)據(jù)傳輸通道關(guān)閉,之后將 ADC轉(zhuǎn)換的數(shù)據(jù)展開(kāi)傅里葉(FFT)運(yùn)算、計(jì)算各次諧波幅值,根據(jù)用戶設(shè)定的特效模式,將各次諧波賦值代入到相應(yīng)算法中,進(jìn)行特效運(yùn)算,最后OLED顯示音樂(lè)頻譜效果。FFT運(yùn)算及OLED顯示流程如圖所示。

圖片

5.主代碼展示:

/* 變量定義 */
uint16_t adc_buff[NPT];                //ADC緩存變量
uint8_t AdcConvEnd;                    //DMA轉(zhuǎn)換完成標(biāo)志位
long InBufArray[NPT];                  //輸入數(shù)組
long OutBufArray[NPT/2];              //輸出數(shù)組
long MagBufArray[NPT/2];              //諧波數(shù)組
uint8_t flag;
uint8_t key_flag;                      //按鍵標(biāo)志位


/* 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是為了符合浮點(diǎn)數(shù)計(jì)算規(guī)律
    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[]為計(jì)算輸出的幅值數(shù)組
  }
}


/* 顯示柱子高度 */
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);
    }
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628405
  • 顯示器
    +關(guān)注

    關(guān)注

    21

    文章

    4862

    瀏覽量

    139354
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352493
  • lm386
    +關(guān)注

    關(guān)注

    9

    文章

    101

    瀏覽量

    53933
  • 音頻放大電路
    +關(guān)注

    關(guān)注

    7

    文章

    34

    瀏覽量

    26680
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    手把手教你用51單片機(jī)DIY音樂(lè)頻譜顯示

    `手把手教你用51單片機(jī)DIY音樂(lè)頻譜顯示`
    發(fā)表于 08-15 23:13

    單片機(jī)制作音樂(lè)頻譜顯示器

    見(jiàn)他們好多人都用單片機(jī)作的音樂(lè)頻譜顯示器,不知道如何做到的,記得學(xué)習(xí)數(shù)字信號(hào)處理的時(shí)候須要用到好多FFT啊之類(lèi)的算法,這里也會(huì)用到嗎?如何編程實(shí)現(xiàn)的呢?求助
    發(fā)表于 08-25 22:09

    求基于單片機(jī)音樂(lè)頻譜顯示設(shè)計(jì)

    各位大神,跪求基于單片機(jī)音樂(lè)頻譜顯示設(shè)計(jì),主要要求是:音樂(lè)不是外接的音樂(lè),需要自己寫(xiě)
    發(fā)表于 04-11 22:52

    很炫的音樂(lè)頻譜——五彩音樂(lè)頻譜顯示器

    ` 本帖最后由 chinayuyi 于 2013-5-27 17:00 編輯 很炫的音樂(lè)頻譜——五彩音樂(lè)頻譜顯示器附出處:百度下“羽翼電
    發(fā)表于 05-27 16:57

    炫彩音樂(lè)顯示器程序 思路

    51單片機(jī)炫彩音樂(lè)顯示器程序應(yīng)該怎么寫(xiě)
    發(fā)表于 03-24 16:40

    基于RT-Thread+RA6M4的FFT音樂(lè)頻譜顯示器制作方案

    1、基于RT-Thread+RA6M4的FFT音樂(lè)頻譜顯示器制作本項(xiàng)目制作了一個(gè)FFT音樂(lè)頻譜顯示器
    發(fā)表于 07-25 12:46

    基于51單片機(jī)音樂(lè)噴泉設(shè)計(jì)頻譜彩燈音樂(lè)盒播放源代碼分享

    基于51單片機(jī)音樂(lè)噴泉設(shè)計(jì)頻譜彩燈音樂(lè)盒播放源代碼
    發(fā)表于 09-26 07:16

    用51單片機(jī)DIY音樂(lè)頻譜顯示

    該資源是手把手教你用51單片機(jī)DIY音樂(lè)頻譜顯示
    發(fā)表于 09-27 07:42

    音樂(lè)頻譜-PCB及代碼

    基于stc12c5a單片機(jī)音樂(lè)頻譜顯示屏幕的制作,可以根據(jù)音樂(lè)顯示出不同的
    發(fā)表于 02-29 15:08 ?64次下載

    單片機(jī)控制LED點(diǎn)陣顯示器

    單片機(jī)控制LED點(diǎn)陣顯示器,有興趣的同學(xué)可以下載學(xué)習(xí)
    發(fā)表于 04-28 17:05 ?40次下載

    單片機(jī)控制LED點(diǎn)陣顯示器

    單片機(jī)控制LED點(diǎn)陣顯示器,很好的設(shè)計(jì)資料,快來(lái)下載學(xué)習(xí)吧。
    發(fā)表于 05-09 17:35 ?27次下載

    基于增強(qiáng)型8051單片機(jī)音樂(lè)頻譜顯示器的設(shè)計(jì)

    基于增強(qiáng)型8051單片機(jī)音樂(lè)頻譜顯示器的設(shè)計(jì)基于增強(qiáng)型8051單片機(jī)音樂(lè)
    發(fā)表于 05-20 16:50 ?26次下載

    DIY音樂(lè)頻譜顯示源代碼(源碼)

    51單片機(jī)DIY音樂(lè)頻譜顯示教程+源代碼,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-22 11:15 ?99次下載

    使用51單片機(jī)實(shí)現(xiàn)音樂(lè)噴泉頻譜彩燈音樂(lè)盒播放的源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)實(shí)現(xiàn)音樂(lè)噴泉頻譜彩燈音樂(lè)盒播放的源代碼免費(fèi)下載。
    發(fā)表于 05-28 14:55 ?108次下載
    使用51<b class='flag-5'>單片機(jī)</b>實(shí)現(xiàn)<b class='flag-5'>音樂(lè)</b>噴泉<b class='flag-5'>頻譜</b>彩燈<b class='flag-5'>音樂(lè)</b>盒播放<b class='flag-5'>器</b>的源代碼免費(fèi)下載

    stm32音樂(lè)頻譜OLED屏顯示

    基于STM32F103和FFT變換的音樂(lè)頻譜顯示
    發(fā)表于 06-17 14:52 ?52次下載