加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • ※ 總??結(jié) ※
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

DSP庫中的FFT奇怪的現(xiàn)象

03/18 10:40
3471
閱讀需 6 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、前言

這是前兩天搭建的H7B0單片機(jī)信號(hào)采集與計(jì)算的模塊,利用它的16比特的ADC采集信號(hào),并進(jìn)行頻譜分析,結(jié)果顯示在OLED屏幕上。計(jì)算 2048點(diǎn)的FFT,耗時(shí)大約為 10個(gè)毫秒左右。下面測(cè)試一下,利用 Cortex中的 CMSIS中的 DSP算法庫中的FFT,看是否計(jì)算速度能夠得到提高,并對(duì)比計(jì)算的結(jié)果的精度,下面進(jìn)行測(cè)試。

二、添加DSP庫

首先點(diǎn)擊 Keil 編譯環(huán)境中的 Package 按鍵,打開軟件包管理單元。添加 CMSIS 中的 Core以及 DSP 軟件包。確定之后,便可以在工程文件后面看到對(duì)應(yīng)的 DSP軟件包了。

在工程選項(xiàng)中,C++設(shè)置頁面,增加 ARM_MATH_CM7 這個(gè)常量,表示使用對(duì)應(yīng)Cortext-M7 內(nèi)核的DSP算法庫。在應(yīng)用 C 文件中,增加相應(yīng)的頭文件,這里增加兩個(gè)頭文件。請(qǐng)注意,如果不增加前面 ARM_MATH_CM7常量的定義,在包含頭文件之后,就會(huì)出現(xiàn)編譯出錯(cuò)。下面就可以應(yīng)用相應(yīng)的DSP函數(shù)了。

三、計(jì)算結(jié)果

調(diào)用DSP中的實(shí)數(shù)浮點(diǎn)FFT函數(shù),對(duì) 長(zhǎng)度為 2048 的浮點(diǎn)數(shù)組進(jìn)行初始化,前面四個(gè)數(shù)字設(shè)置 1,其他都是0。初始化FFT實(shí)例參數(shù),進(jìn)行實(shí)數(shù)FFT變換,計(jì)算FFT結(jié)果的賦值。進(jìn)行結(jié)果顯示和圖像繪制。

這是進(jìn)行FFT數(shù)據(jù)的波形,在前面 4 個(gè)數(shù)據(jù),幅度為 1,其他都是0,變換結(jié)果中,前面一半是數(shù)據(jù)的幅度頻譜,對(duì)于實(shí)數(shù)來講,它的幅度譜關(guān)于中心店左右對(duì)稱,輸出結(jié)果中,只給出了前面一半的結(jié)果,后面一半不是計(jì)算的數(shù)據(jù)。這里需要說明的是,F(xiàn)FT計(jì)算是即位存儲(chǔ),也就是最終的結(jié)果存儲(chǔ)在輸入數(shù)據(jù)存儲(chǔ)區(qū)中。輸出結(jié)果只有實(shí)際頻譜的前半段,后半段與前半段呈現(xiàn)共軛對(duì)稱。

▲ 圖1.3.1 信號(hào)的波形▲ 圖1.3.2 變換后的幅度譜

對(duì)比單片機(jī)DSP庫計(jì)算得到的幅度譜與 Python 計(jì)算的幅度譜,它們是重合的,對(duì)應(yīng)的誤差應(yīng)該是反映了單精度浮點(diǎn)數(shù)與雙精度浮點(diǎn)數(shù)之間的差異性。

▲ 圖1.3.3 繪制DSP與Python 計(jì)算的結(jié)果▲ 圖1.3.4 DSP與Python 計(jì)算幅度品的誤差

但是,遇到了一個(gè)詭異的情況,那就是如果設(shè)置數(shù)據(jù)窗口長(zhǎng)度為5,DSP計(jì)算的結(jié)果的第一個(gè)數(shù)值就會(huì)出現(xiàn)較大的誤差。第一個(gè)數(shù)字反映了數(shù)據(jù)的直流分量。這是數(shù)據(jù)窗口長(zhǎng)度為 7 的時(shí)候,也是出現(xiàn)了較大的誤差。這就是了怪了,窗口長(zhǎng)度為偶數(shù)的時(shí)候是準(zhǔn)確的,是奇數(shù)的時(shí)候不準(zhǔn)確,這個(gè)問題困擾了我很長(zhǎng)時(shí)間,不知道誰能夠給出解答。

▲ 圖1.3.5 當(dāng)數(shù)據(jù)窗口寬度為5的時(shí)候,計(jì)算結(jié)果的第一位,也就是直流分量結(jié)果出現(xiàn)了較大的誤差

繪制出數(shù)據(jù)窗口的寬度從0 到 2048 過程中,DSP算法庫得到的結(jié)果第一個(gè)數(shù)據(jù)對(duì)應(yīng)的誤差。隨著數(shù)據(jù)的長(zhǎng)度增加,誤差減小。誤差與數(shù)據(jù)的長(zhǎng)度成反比。對(duì)應(yīng)的窗口為偶數(shù)的時(shí)候,誤差為0,奇數(shù)的時(shí)候出現(xiàn)了差異。這實(shí)在令人感到奇怪了。

▲ 圖1.3.6 不同窗口計(jì)算出的直流分量的誤差分布

四、計(jì)算的速度

為了測(cè)量DSP中的FFT計(jì)算速度,在FFT函數(shù)調(diào)用前后增加對(duì)單片機(jī)端口 的操作,有單片機(jī)端口的高低電平來表示FFT的計(jì)算時(shí)間,?通過示波器,測(cè)量該端口的波形,可以確定 DSP 庫中的FFT的計(jì)算速度。單片機(jī)時(shí)鐘頻率設(shè)為 280MHz,對(duì)于長(zhǎng)度為 2048 的 FFT,單片機(jī)計(jì)算時(shí)間長(zhǎng)度為 1.22ms。前兩天自行編寫了 FFT C語言算法,同樣長(zhǎng)度,需要大約 10ms的時(shí)間。課件 DSP庫中的算法效率還是非常高的。

▲ 圖1.4.1 計(jì)算速度

※ 總??結(jié) ※

本文對(duì)于STM32H7B0單片機(jī)使用DSP算法庫進(jìn)行 FFT計(jì)算進(jìn)行測(cè)測(cè)試。速度非常快,對(duì)于2048個(gè)數(shù)據(jù)進(jìn)行單精度浮點(diǎn)計(jì)算時(shí),耗時(shí)大約為 1.2ms,這是內(nèi)核時(shí)鐘頻率為 280MHz 的情況下測(cè)量的。但也出現(xiàn)了一個(gè)令人不解的情況,那就是計(jì)算直流量在某些情況下會(huì)出現(xiàn)誤差。具體原因現(xiàn)在還不清楚呢。

參考資料

[1]STM32 DSP庫的使用方法: https://blog.csdn.net/u010058695/article/details/112665306

[2]模擬信號(hào)的采集并顯示頻譜:STM32H7B0: https://zhuoqing.blog.csdn.net/article/details/136419754

[3]STM32H7B0模塊的電路圖: https://zhuoqing.blog.csdn.net/article/details/136285749

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
TJA1055T/1J 1 NXP Semiconductors TJA1055 - Enhanced fault-tolerant CAN transceiver SOIC 14-Pin
$1.72 查看
R38-32.768-12.5 1 Raltron Electronics Corporation Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, HALOGEN FREE, ROHS AND REACH COMPLIANT PACKAGE-2
$0.06 查看
SN74LV244APWG4 1 Texas Instruments Eight-channel 2-V to 5.5-V buffers with tri-state outputs 20-TSSOP -40 to 125

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào)TsinghuaJoking主筆。清華大學(xué)自動(dòng)化系教師,研究興趣范圍包括自動(dòng)控制、智能信息處理、嵌入式電子系統(tǒng)等。全國(guó)大學(xué)生智能汽車競(jìng)賽秘書處主任,技術(shù)組組長(zhǎng),網(wǎng)稱“卓大大”。