STM32F4使用FPU+DSP庫進行FFT運算的測試過程二

来源:https://www.cnblogs.com/NickQ/archive/2018/03/10/8541156.html
-Advertisement-
Play Games

原文地址:http://www.cnblogs.com/NickQ/p/8541156.html 測試環境:單片機:STM32F407ZGT6 IDE:Keil5.20.0.0 固件庫版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第二部分:本教程使用DSP——lib庫的 ...


原文地址:http://www.cnblogs.com/NickQ/p/8541156.html

測試環境:單片機:STM32F407ZGT6 IDE:Keil5.20.0.0 固件庫版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0

第二部分:本教程使用DSP——lib庫的方式,進行FFT運算。

上一篇教程STM32F4使用FPU+DSP庫進行FFT運算的測試過程一 ,進行FFT運算的是void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc)函數。

偶然發現,這個函數在STM32F4xx_DSP_StdPeriph_Lib_V1.4.0庫說明中,描述為--不要使用該功能,已經被arm_cfft_f32()替代。

這一類不推薦使用的函數還有很多,例如arm_cfft_radix2_f32,arm_cfft_radix2_init_f32等等,在此不再展開,詳細可在\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\index.html中查看。這是ST提供的,以網頁的形式描述的說明文檔。。

 

通過使用arm_cfft_f32()替代arm_cfft_radix4_f32後發現,arm_cfft_f32()函數確實更簡單易用。因此此教程中我們使用arm_cfft_f32(),而不再使用arm_cfft_radix4_f32。

我們知道,arm_cfft_radix4_f32是基於4的FFT,也就是說每次運算的長度必須是22n等,而arm_cfft_f32()可以運算長度為2n的FFT,另外,在arm_cfft_f32()函數不需要使用諸如arm_cfft_radix4_init_f32的初始化配置函數。取而代之的是包含"arm_const_structs.h"頭文件,並使用它說提供的配置變數即可。下圖是arm_const_structs.h提供的配置變數。

 

準備空工程,配置Keil環境.請參考 STM32F4使用FPU+DSP庫進行FFT運算的測試過程一 的配置,使能STM32的FPU等,在此不做贅述。

添加文件到工程,我們需要DSP的lib庫,路徑為STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Lib\ARM

該文件夾下有如下lib庫,
    arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
    arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
    arm_cortexM4l_math.lib (Little endian on Cortex-M4)
    arm_cortexM4b_math.lib (Big endian on Cortex-M4)
    arm_cortexM3l_math.lib (Little endian on Cortex-M3)
    arm_cortexM3b_math.lib (Big endian on Cortex-M3)
    arm_cortexM0l_math.lib (Little endian on Cortex-M0)
    arm_cortexM0b_math.lib (Big endian on Cortex-M3)

因為測試環境所使用的是STM32F407xx,屬於Cortex-M4內核,小端模式,支持浮點運算單元。因此選擇第一個 lib庫,arm_cortexM4lf_math.lib

將其添加到工程中,並包含STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Include下的頭文件即可。

編寫測試用main()函數

 1 #include "stm32f4xx_conf.h"
 2 
 3 #include "sys.h"
 4 #include "delay.h"
 5 #include "usart.h"
 6 //LCD顯示屏功能
 7 #include "Nick_lcd.h"
 8 #include "Nick_keys.h"
 9 
10 #include "arm_math.h"
11 #include "arm_const_structs.h"
12 
13 #define FFT_LENGTH        1024         //FFT長度,預設是1024點FFT
14 
15 float fft_inputbuf[FFT_LENGTH*2];    //FFT輸入數組
16 float fft_outputbuf[FFT_LENGTH];    //FFT輸出數組
17 
18 int main(void)
19 { 
20     
21     delay_init(168);
22     lcd_init(0);    //初始化LCD
23     key_init();
24     uart_init(115200);        //初始化串口波特率為115200
25     
26     while(1)
27     {
28         u32 keyval = (u32)keys_scan(0);
29         if(keyval==1)
30         {
31                 for(int i=0;i<FFT_LENGTH;i++)//生成信號序列
32                 {
33                      fft_inputbuf[2*i]=10+4.5*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+\
34                                           7.5*arm_sin_f32(2*PI*i*350/FFT_LENGTH);
35                     
36                      fft_inputbuf[2*i+1]=0;//虛部全部為0
37                 }
38                //arm_cfft_sR_f32_len1024,該變數即為"arm_const_structs.h"提供的配置變數,包含頭文件後,直接調用即可。
39                arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1);
40                arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);    //把運算結果複數求模得幅值 
41                 
42                 printf("FFT Result:\r\n");
43                 for(int i=0;i<FFT_LENGTH;i++)
44                 {
45                     printf("%f\r\n",fft_outputbuf[i]);
46                 }
47         }
48         delay_ms(60);
49     }
50 }

編譯下載運行。

結果分析:

如圖,我們產生的信號是基波幅度為10,200Hz幅度為4.5,350Hz幅度為7.5

基波:10240/1024 = 10

200Hz: 2304*2/1024 = 4.5

350Hz:3840*2/1024 = 7.5

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發中經常經常碰到標誌多選的情況,如將listbox的選擇結果保存到資料庫,最好的方式就是將每個選項用一個二進位標誌,實現每個標誌為1,則只需要將每個選擇的選項結果累加就可以保存到資料庫。 可封裝如下 ...
  • 在C 語言中,要使類型對象可以排序,可以基於介面實現,主要的介面有IComparable\、IComparer\,當然我們還可以通過強大的LINQ進行排序。 IComparable\介面 ================= IComparable\定義由值類型或類實現的通用比較方法,以為排序實例創建 ...
  • 這次學習ng-selected語法,這個是為DropDownList下拉列表顯示預設選項。 演示從下麵步驟開始 1,新建一個model: 上面#14行代碼的property,數據類型為bool。即是存儲選項是否為選中與否,true或false。 public class Car { public i ...
  • 目錄: ASP.NET Core 2.0: 二. 開發環境 ASP.NET Core 2.0 : 三. 項目結構 ASP.NET Core 2.0 : 四. _Layout與_ViewStart ASP.NET Core 2.0 : 五.服務是如何載入並運行的, Kestrel、配置與環境 ASP. ...
  • 很多 ASP.NET MVC 開發者都會寫出高性能的代碼,很好地交付軟體,等等。但是卻並沒有安全性方面的計劃。 有一種攻擊是攻擊者截獲最終用戶提交的表單數據,將其改變再將修改後的數據發送到伺服器。 對於這種情況,開發者需要進行適當的驗證,不過驗證顯示的大量錯誤信息中可能會泄漏伺服器信息。 如常見的4 ...
  • 新手C# 開發 主要做過 mvc開發的 公司 內部使用一個類似,客戶 下單記錄 到 審核 流程 再到放款 的 系統。別的系統功能類似。 簡單三層,單例模式。 單例開始(簡單) private static ActivitiesDetailMgr _instance; public static Ac ...
  • 正所謂天下大勢,不跟風不行。你不跨平臺,很low嘛。java說:你們能跨嘛,跨給我看看。C#說:不要強人所難嘛。java說:能部署在雲上嗎?docker?微服務?C#說:不要強人所難嘛。java說:你能幹啥?C#說:能幹啥有必要和你說嘛,我只自己玩。Php說:就服你兩裝B的樣子。哈哈! 噢java改... ...
  • 今天簡單的敲幾個代碼,介紹一下我又一次看書理解的命令: RPM 全名Red Package Manager,與1997年首次運用於紅帽操作系統上, 1.rpm安裝與卸載rpm軟體包 rpm -q xx(包名) 查找某個包是否安裝,如果安裝了則顯示包名,如果未安裝則顯示 package xx is n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...