【正點原子K210連載】第七十六章 音頻FFT實驗 摘自【正點原子】DNK210使用指南-CanMV版指南

第七十六章 音頻FFT實驗

本章將介紹CanMV下FFT的應用,通過將時域采集到的音頻數據通過FFT為頻域。通過本章的學習,讀者將學習到CanMV下控制FFT加速器進行FFT的使用。
本章分為如下幾個小節:
32.1 maix.FFT模塊介紹
32.2 硬件設計
32.3 程序設計
32.4 運行驗證

32.1 maix.FFT模塊介紹
Kendryte K210片上擁有一個FFT Accelerator(快速傅里葉變換加速器)可以實現以硬件的方式對FFT的基2時分運算加速,Kendryte K210上的FFT Accelerator特點如下所示:

  1. 支持多種運算長度,即支持64點、128點、256點以及512點運算
  2. 支持兩種運算模式,即FFT以及IFFT運算
  3. 支持可配的輸入數據寬度,即支持32bit以及64bit輸入
  4. 支持可配的輸入數據排列方式,即支持虛部、實部交替,純實部以及實部、虛部分離三種數據排列方式
  5. 支持可配的數據搬運方式,即CPU搬運和DMA搬運
    在CanMV中可以使用CanMV提供的maix.FFT模塊操作Kendryte K210上的FFT Accelerator。maix.FFT模塊可以對輸入數據進行傅里葉變換并返回相應的頻率幅值,可以將時域信號轉換為頻域信號。
    maix.FFT模塊提供了run()函數,用于對輸入的時域數據進行FFT,run()函數如下所示:
    FFT.run(byte=None, points=64, shift=0, direction=1)
    run()函數用于對輸入的時域數據進行FFT,運算過程會自動調用硬件上的FFT Accelerator,并會同時占用DMAC Channel3和DMAC Channel4。
    byte指的是輸入的時域數據,需要為bytearray類型。
    points指的是FFT的運算長度,可以是64、128、256或512,默認為64。
    shift指的是偏移,默認為0。
    direction指的是運算模式,當為1時,為FFT,當為0時,是IFFT。
    run()函數會返回一個list對象,表示計算后的頻域數據,list有points個元組,每個元組都有2個元素,第一個元素為實部,第二個元素為虛部。
    run()函數的使用示例如下所示:
from maix import FFTdata = bytearray(64)
res = FFT.run(data, 64)

maix.FFT模塊提供了amplitude()函數,用于計算FFT后各個頻率點的幅值,amplitude()函數如下所示:
FFT.amplitude(res)
amplitude()函數用于計算FFT后各個頻率點的幅值,從而能夠直觀地看到頻域下數據的狀態。
res指的是FFT.run()函數運算后返回的頻域數據。
amplitude()函數的使用示例如下所示:

from maix import FFTdata = bytearray(64)
res = FFT.run(data, 64)
amp = FFT.amplitude(res)

32.2 硬件設計
32.2.1 例程功能

  1. 獲取板載數字麥克風的音頻數據作為時域數據輸入maix.FFT模塊進行FFT得到頻域數據后,計算頻域數據各個頻率點的幅值并在LCD上進行直觀的圖像顯示
    32.2.2 硬件資源
  2. 數字麥克風
    IIS_SDIN - IO30
    IIS_BCK - IO32
    IIS_LRCK - IO33
    32.2.3 原理圖
    本章實驗內容,需要獲取板載數字麥克風的音頻數據。
    DNK210開發板上的數字麥克風的連接原理圖,如下所示:
    在這里插入圖片描述

圖32.2.3.1 數字功放NS4168連接原理圖
關于該數字麥克風的使用方法,可參考MSM261S4030H0R的數據手冊——《MSM261S4030H0R.pdf》,讀者可在A盤硬件資料芯片資料下找到這份文檔。
32.3 程序設計
32.3.1 maix.FFT模塊介紹
有關maix.FFT模塊的介紹,請見第32.1小節《maix.FFT模塊介紹》。
32.3.2 程序流程圖
在這里插入圖片描述

圖32.3.2.1 音頻FFT實驗流程圖
32.3.3 main.py代碼
main.py中的腳本代碼如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
from maix import I2S
from maix import FFT
import lcd
import imagelcd.init()
img = image.Image(size=(lcd.width(), lcd.height()))SAMPLE_RATE = 38640
SAMPLE_POINTS = 1024
FFT_POINTS = 512
HIST_NUM = 50fm.register(board_info.SPK_CTRL, fm.fpioa.GPIO0)
fm.register(board_info.MIC_WS, fm.fpioa.I2S0_WS)
fm.register(board_info.MIC_SCLK, fm.fpioa.I2S0_SCLK)
fm.register(board_info.MIC_SDIN, fm.fpioa.I2S0_IN_D0)spk_ctl = GPIO(GPIO.GPIO0, GPIO.OUT)
spk_ctl.value(0)i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, align_mode=I2S.STANDARD_MODE)
i2s_dev.set_sample_rate(SAMPLE_RATE)hist_width = int(lcd.width() / HIST_NUM)while True:data = i2s_dev.record(SAMPLE_RATE)# 對時域數據進行FFTres = FFT.run(data.to_bytes(), FFT_POINTS)# 計算頻域數據各頻率點的幅值amp = FFT.amplitude(res)img.clear()for hist in range(HIST_NUM):if amp[hist] > lcd.height():hist_height = lcd.height()else:hist_height = amp[hist]img.draw_rectangle(hist * hist_width, lcd.height() - hist_height, hist_width, hist_height, lcd.WHITE, 1, True)lcd.display(img)del datadel resdel amp

可以看到一開始是先完成分配IO、初始化LCD、GPIO、I2S,為通過I2S獲取板載數字揚聲器的音頻數據做準備。
然后便是在一個循環中不斷地通過I2S獲取音頻數據,然后將音頻數據作為時域數據輸入進行FFT運算,得到頻域數據的計算結果后,再計算頻域數據各頻率點的幅值,最后將各頻率點的幅值通過直方圖的形式在LCD上進行顯示。
32.4 運行驗證
將DNK210開發板連接CanMV IDE,點擊CanMV IDE上的“開始(運行腳本)”按鈕后,便了看到LCD上顯示了板載數字麥克風采集到音頻數據的頻譜圖,如下圖所示:
在這里插入圖片描述

圖32.4.1 LCD顯示頻譜圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72805.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

火絨終端安全管理系統V2.0——行為管理(軟件禁用+違規外聯)

火絨終端安全管理系統V2.0:行為管理策略分為軟件禁用和違規外聯兩部分,能夠管理終端用戶軟件的使用,以及終端用戶違規連接外部網絡的問題。 l 軟件禁用 軟件禁用策略可以選擇軟件名單的屬性、添加軟件名單以及設置發現終端使用禁用軟件時的…

FastJson:JSON JSONObject JSONArray詳解以及SimplePropertyPreFilter 的介紹

FastJson:JSON JSONObject JSONArray詳解以及SimplePropertyPreFilter 的介紹 FastJson是阿里巴巴開發的一款專門用于Java開發的包,實現Json對象,JavaBean對,Json字符串之間的轉換。 文章目錄 FastJson:JSON JSONObje…

DEFI幣生態重構加速,XBIT去中心化交易所引領DEX安全新范式

2025年3月18日,全球加密市場在監管與技術共振下迎來結構性變革。去中心化金融(DeFi)代幣DEFI幣因跨鏈流動性協議升級引發社區熱議,而幣應XBIT去中心化交易所(以下簡稱XBIT)憑借其鏈上透明驗證機制、無需下載…

解析漏洞總結

首先說下為什么要寫著篇文章,之前學習倒是學過,學完就忘啊,tmd iis 5.x/6.0 這個版本有兩種解析姿勢  一.兩種解析漏洞 1.目錄解析 2./xxx.asp/xx.jpg 簡單說一下是什么意思,這里是先在他服務器跟目錄創建一個名為 xxx.…

前端小食堂 | Day18 - 身份認證の八卦陣

🔐 今日秘術:JWT/OAuth2 攻防奧義 1. JWT 安全の六合陣法 // 🚫 危險操作:未驗證簽名 const decodeUnsafe (token) > JSON.parse(atob(token.split(.)[1])); // ? 安全姿勢一:嚴格簽名驗證 import jwt fro…

將bin文件燒錄到STM32

將bin文件燒錄到STM32 CoFlash下載生成hex文件hex2bin使用下載bin到單片機 CoFlash下載 選擇需要安裝的目錄 在Config中可以選擇目標芯片的類型 我演示的是 stm32f103c8t6 最小系統板 Adapter:燒錄器類型 Max Clock:下載速度 Por:接口類型&am…

【Embedded World 2025:邊緣 AI、存儲革新與 1X nm 工藝重塑嵌入式未來】

Embedded World 2025于3月11-13日在德國紐倫堡舉辦,作為全球嵌入式系統領域頂級盛會,匯聚超千家展商與3萬專業觀眾,聚焦嵌入式智能、安全管理及行業解決方案。展會呈現邊緣AI、低功耗MCU、5G RedCap、新型存儲及車規級技術等前沿方向&#xf…

3.19刷題

P6443 [COCI 2010/2011 #1] TIMSKO - 洛谷 #include<bits/stdc.h> using namespace std; int main(){int n,m,k,maxp0;cin>>m>>n>>k;for(int i0;i<n;i){//男生參加人數if(k3*i<mn&&2*i<m) maxpi;}cout<<maxp;return 0; }P645…

Android NDK --- JNI從入門到基礎的全面掌握 (上)

引言 先問 jni是什么&#xff1f; jni和ndk 的關系&#xff1f; 答&#xff1a; java調用 C、C 的代碼。 兩者一個是調用&#xff0c;一個是用c 、c 寫 。 這兩個問題問出來似乎知道又好像不知道。 正文 jni 概述 定義&#xff1a;java Native Interface 即 java本地接口 …

爬蟲 crawler 入門爬取不設防網頁 并實現無限增生

基礎版本 爬取網頁后直接將前端html代碼不加處理的輸出 # pip3 install requests import requests# request the target URL def crawler():response requests.get("https://www.scrapingcourse.com/ecommerce/")response.raise_for_status()print(response.text)…

C++高頻(四)之c++11新特性

C++面試高頻(四)之c++11新特性 1.簡述C++11有什么新特性?? 自動類型推導(Type Inference):引入了 auto 關鍵字,允許編譯器根據初始化表達式的類型自動推導變量的類型。統一的初始化語法(Uniform Initialization Syntax):引入了用花括號 {} 進行初始化的統一語法,可…

HarmonyOs- UIAbility應用上下文

上下文為何物 上下文在計算機科學領域是一個廣泛存在的概念。是現代操作系統核心抽象概念之一。其本質是環境信息的結構化封裝。 有過開發經驗的都知道&#xff0c;當我們在一個系統上進行開發的時候&#xff0c;無論是Android&#xff0c;HarmonyOs&#xff0c;Linux 等等&a…

Redis解決緩存擊穿問題——兩種方法

目錄 引言 解決辦法 互斥鎖&#xff08;強一致&#xff0c;性能差&#xff09; 邏輯過期&#xff08;高可用&#xff0c;性能優&#xff09; 設計邏輯過期時間 引言 緩存擊穿&#xff1a;給某一個key設置了過期時間&#xff0c;當key過期的時候&#xff0c;恰好這個時間點對…

架構思維:軟件建模與架構設計的關鍵要點

文章目錄 1. 軟件建模的核心概念2. 七種常用UML圖及其應用場景類圖時序圖組件圖部署圖用例圖狀態圖活動圖 3. 軟件設計文檔的三階段結構4. 架構設計的關鍵實踐1. 用例圖&#xff1a;核心功能模塊2. 部署圖&#xff1a;架構演進階段3. 技術挑戰與解決方案4. 關鍵架構圖示例5. 架…

numpy學習筆記14:模擬隨機游走過程(一次實驗)

numpy學習筆記14&#xff1a;模擬隨機游走過程(一次實驗) 隨機游走是一個對象在離散時間步中的隨機移動&#xff0c;每次移動的方向和步長由概率決定。在用戶提供的代碼中&#xff0c;步長數組steps的每個元素是-1或1&#xff0c;代表向左或向右移動一步。np.random.choice的作…

FPGA-DE2115開發板實現流水燈

文章目錄 一、安裝VScode&#xff0c;在其中下載安裝Verilog-HDL/SystemVerilog插件&#xff1b;&#xff08;1&#xff09;安裝VScode&#xff08;2&#xff09;安裝插件&#xff08;3&#xff09;與Quartus關聯 二、不分模塊實現流水燈&#xff08;1&#xff09;新建工程&…

JS逆向案例-HIKVISION-視頻監控的前端密碼加密分析

免責聲明 本文僅為技術研究與滲透測試思路分享,旨在幫助安全從業人員更好地理解相關技術原理和防御措施。任何個人或組織不得利用本文內容從事非法活動或攻擊他人系統。 如果任何人因違反法律法規或不當使用本文內容而導致任何法律后果,本文作者概不負責。 請務必遵守法律…

Android 動態代理詳解

Android 動態代理方法的原理與關鍵分析 動態代理是一種在運行時動態生成代理對象并攔截方法調用的技術。它廣泛應用于 Android 開發中&#xff0c;例如 AOP&#xff08;面向切面編程&#xff09;、插件化開發、網絡請求框架&#xff08;如 Retrofit&#xff09;等場景。 以下…

碰一碰發視頻saas系統技術源頭一站式開發文檔

碰一碰發視頻系統技術源頭一站式開發文檔 一、引言 在數字化信息傳播高速發展的當下&#xff0c;如何讓視頻分享更便捷、高效&#xff0c;成為商家和開發者們關注的焦點。“碰一碰發視頻”系統以其獨特的交互方式和強大的功能優勢&#xff0c;為視頻分享領域帶來了革命性變革。…

VSCode + CMake

參考文獻&#xff1a; 如何用 GCC, CMake 和 Make 編譯C/C代碼Windows 上的 Linux 子系統&#xff1a;WSLWSL&#xff1a;桌面 UI 遠程連接 RDP 配置 VScode 文章目錄 CMake 配置VSCode 配置launch.jsontask.jsonc_cpp_properties.json CMake 配置 編寫如下的 CmakeLists.t…