【正点原子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.rhkb.cn/news/36790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”:手把手玩转STM32的外部中断控制器(EXTI) 引言:为什么我们需要“中断”? (类比生活场景:用“快递按门铃”解释中断的意义) 想象一下:当你在…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

📌 下载JMeter 下载地址:https://jmeter.apache.org/download_jmeter.cgi 📌 无需安装 Apache官网下载 JMeter 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面,循环播放视频。思路是直接调用gr.HTML插件实现,简单有效!!! 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要:图论入门【数据结构基础】:什么是图?如何表示图? 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源(使用切面拦截,使用注解) 总结 资源权限控制 2.2. 需要有一个用户;(从数据库查询用户) 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束,通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中,但仍有差距存在,尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地,解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中,我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节,但是我们又不想通过建模实现,这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的,在基于Babylon.js的Shader入门之四:让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时,活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料,还是面临用户分流压力的线上客服,动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于,他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后,仍出现TLSv1.2协议的数据包,原因如下: 1. ‌协议层次关系‌ ‌TCP是传输层协议‌,而‌TLS属于应用层协议‌,后者直接运行于TCP之上‌28。因此,所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy(抽象策略类)​ Context(环境类 / 上下文类)​ ConcreteStrategy(具体策略类)​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展,服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读,探讨未来几年内该行业的…

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景:运行DeepSeek-R1-Distill-Qwen-14B模型,在2张300 P卡可以运行,单独一张启动报以上错误。 问题分析&…

STM32F429单片机FMC接口驱动TFT LCD和SDRAM

1、FMC接口介绍 FMC 接口(即可变存储控制器)是一种用于管理外部存储器的外设接口,支持多种类型的存储器,主要分为三大类:NOR/SRAM/PSRAM设备(TFTLCD相当于SRAM)、NOR FLASH/NAND FLASH/PC卡设备…

ollama不安装到c盘,安装到其他盘

ollama 安装包默认安装到c盘,安装程序并没有提供选择文件夹安装功能,本来c盘就快满了,下几个模型c盘都快爆了,如何将ollma安装到其他盘呢? ollama 默认安装位置 C:\Users\Admin\.ollama 是 Ollama 用来放大模型的文件夹…

java项目之基于ssm的少儿编程在线培训系统(源码+文档)

项目简介 少儿编程在线培训系统实现了以下功能: 用户信息管理: 用户信息新增 用户信息修改 教师信息管理: 教师信息添加 教师信息删除 教师信息修改 课程信息管理: 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…

Cinema4D安装及基本操作

一、简介 Cinema 4D(C4D)是德国 Maxon Computer 开发的 3D 软件,具备强大的建模、动画、材质、渲染功能,以易用高效著称,广泛应用于影视、游戏、设计等领域,是行业内主流 3D 创作工具。 二、安装 1.下载安…