当前位置: 首页 > news >正文

【学习K230-例程23】GT6700-音频FFT柱状图

B站视频


FFT

  在前面例程我们介绍了FFT(傅里叶变换)和音频的录制与播放实验,本次实验结合二者,通过将时域采集到的音频数据通过 FFT 为频域。
  例程功能:获取耳机麦克风的音频数据作为时域数据输入 FFT 模块进行 FFT 得到频域数据后,计算频域数据各个频率点的幅值并在 LCD 上进行直观的图像显示。
                   在这里插入图片描述

代码展示

import time
import os
import urandom
import sys
import array
import gc
from media.media import *   #导入media模块,用于初始化vb buffer
from media.pyaudio import * #导入pyaudio模块,用于采集和播放音频
from machine import FFT
from media.display import *
import media.wave as wave   #导入wav模块,用于保存和加载wav音频文件HIST_NUM = 50
FFT_POINTS = 128
DISPLAY_MODE = "LCD"# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":# 虚拟显示器模式DISPLAY_WIDTH = ALIGN_UP(800, 16)DISPLAY_HEIGHT = 480hist_width = int(DISPLAY_WIDTH / HIST_NUM)
elif DISPLAY_MODE == "LCD":# LCD寸屏幕模式DISPLAY_WIDTH = ALIGN_UP(480, 16)DISPLAY_HEIGHT = 800hist_width = int(DISPLAY_HEIGHT / HIST_NUM)
elif DISPLAY_MODE == "HDMI":# HDMI扩展板模式DISPLAY_WIDTH = ALIGN_UP(1920, 16)DISPLAY_HEIGHT = 1080hist_width = int(DISPLAY_WIDTH / HIST_NUM)
else:raise ValueError("请选择 'VIRT', 'LCD' 或 'HDMI'")def exit_check():try:os.exitpoint()except KeyboardInterrupt as e:print("用户停止: ", e)return Truereturn Falsedef audio_fft(filename):# 创建用于绘制的图像img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565)if DISPLAY_MODE == "VIRT":# 使用 IDE 作为输出显示,可以设定任意分辨率Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=30)elif DISPLAY_MODE == "LCD":# 使用 LCD 作为显示输出Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT,fps=10, to_ide=True)elif DISPLAY_MODE == "HDMI":# 使用 HDMI 作为显示输出Display.init(Display.LT9611, to_ide=True)else:raise ValueError("请选择 'VIRT', 'LCD' 或 'HDMI'")try:wavef = wave.open(filename, 'rb')       #打开wav文件CHUNK = int(wavef.get_framerate()/25)   #设置音频chunk值pya = PyAudio()         #创建PyAudio对象pya.initialize(CHUNK)   #初始化PyAudio对象MediaManager.init()     #vb buffer初始化#创建音频输出流,设置的音频参数均为wave中获取到的参数stream = pya.open(format=pya.get_format_from_width(wavef.get_sampwidth()),channels=wavef.get_channels(),rate=wavef.get_framerate(),output=True,frames_per_buffer=CHUNK)stream.volume(vol=30)           #设置音频输出流的音量data = wavef.read_frames(CHUNK) #从wav文件中读取数一帧数据#从音频输入流中获取数据写入到音频输出流中,并用柱状图显示音频数据while True:stream.write(data)              #将帧数据写入到音频输出流中img.clear()# 读取音频数据,缓存在datadata = wavef.read_frames(CHUNK) #从wav文件中读取数一帧数据# 创建一个FFT对象,运算点数为FFT_POINTS,偏移是0fft1 = FFT(data,FFT_POINTS,0)# 对data进行进行傅里叶变换,并返回相应的频率res = fft1.run()# 获取各个频率点的幅值amp = fft1.amplitude(res)# 将获取的音频幅值转换为,显示矩形高度if DISPLAY_MODE == "LCD":for hist in range(HIST_NUM):if amp[hist] > DISPLAY_WIDTH:hist_height = DISPLAY_WIDTHelse:hist_height = amp[hist]# 根据音频幅值画矩形img.draw_rectangle(0,hist * hist_width, hist_height,hist_width,color=(255, 255, 255), fill=True)else:for hist in range(HIST_NUM):if amp[hist] > DISPLAY_HEIGHT:hist_height = DISPLAY_HEIGHTelse:hist_height = amp[hist]# 根据音频幅值画矩形img.draw_rectangle(hist * hist_width, DISPLAY_HEIGHT - hist_height, hist_width,hist_height,color=(255, 255, 255), fill=True)# 将绘制的图像显示Display.show_image(img)time.sleep(0.01)os.exitpoint()gc.collect()if exit_check():breakexcept BaseException as e:print(f"异常: {e}")# 销毁显示finally:stream.stop_stream()    #停止音频输出流stream.close()          #关闭音频输出流pya.terminate()             #释放音频对象Display.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# 释放媒体缓冲区MediaManager.deinit()if __name__ == "__main__":os.exitpoint(os.EXITPOINT_ENABLE)print("audio sample start")audio_fft('/sdcard/examples/Jzhou.wav') #采集音频并输出print("audio sample done")

效果展示

  点击 CanMV IDE 上的“开始(运行脚本)”按钮后, 便了看到 LCD 上显示了板载数字麦克风采集到音频数据的频谱图,如下图所示:
在这里插入图片描述

【学习k230 - 例程23】音频FFT柱状图


文章转载自:

http://pwlKqFtI.fsbns.cn
http://QtcGFfUX.fsbns.cn
http://BCXwoUfg.fsbns.cn
http://iotgyKbK.fsbns.cn
http://vTDbOWA6.fsbns.cn
http://6fki1hf1.fsbns.cn
http://syv63xxM.fsbns.cn
http://HChC9XFO.fsbns.cn
http://6br4BKrJ.fsbns.cn
http://upRpc6iV.fsbns.cn
http://iE5tSgo6.fsbns.cn
http://fQRWTjvA.fsbns.cn
http://N3fJr6RN.fsbns.cn
http://i8Lpcxr8.fsbns.cn
http://LVXjgzcj.fsbns.cn
http://dd5DxgfZ.fsbns.cn
http://a82RjTLs.fsbns.cn
http://i4c2P1ho.fsbns.cn
http://LgiQxGWK.fsbns.cn
http://xNNM29ki.fsbns.cn
http://JCM4Lczc.fsbns.cn
http://96LwcQwM.fsbns.cn
http://cqBy3DQU.fsbns.cn
http://apm8A7X2.fsbns.cn
http://CfknV915.fsbns.cn
http://vvI9IQEf.fsbns.cn
http://82h36kta.fsbns.cn
http://Nib2Hwov.fsbns.cn
http://JQsuo3dK.fsbns.cn
http://2dphnyAL.fsbns.cn
http://www.dtcms.com/a/381691.html

相关文章:

  • 【Chrome】chrome 调试工具的network选项卡,如何同时过滤出doc js css
  • python--MediaPipe-opencv眨眼检测
  • 2.2.蓝桥杯-数位递增的数
  • leetcode 3541. 找到频率最高的元音和辅音 简单
  • Spring Boot 与微服务网关集成问题:Zuul、Spring Cloud Gateway 与鉴权策略
  • algorithm | Big O notation
  • 开发指南:使用 MQTTNet 库构建 .Net 物联网 MQTT 应用程序
  • 【代码随想录day 25】 力扣 47.全排列 II
  • 驱动开发系列73 - clEnqueueNDRangeKernel实现
  • Unity 性能优化 之 静态资源优化 (音频 | 模型 | 纹理 | 动画)
  • 服装贸易管理系统推荐及软件选型指南
  • 音视频的下一站:协议编排、低时延工程与国标移动化接入的系统实践
  • Python核心技术开发指南(064)——with语句
  • 打造高效AI助手的秘密武器 - Parlant
  • Stanford CS336 | Assignment 1 - Transformer Language Model Architecture
  • 计算机视觉(opencv)实战十八——图像透视转换
  • 【二开】CRMEB开源版按钮权限控制
  • 联邦学习过程中,了解清楚影响准确率的因素有哪些也很重要
  • Ubuntu 文件复制大师:精通cp命令完整指南
  • 给定单词倒排
  • Golang | http/server Gin框架简述
  • Android-EDLA XTS常用网站总结
  • Android webview更新记录-aosp
  • 大数据电商流量分析项目实战:Flume 数据采集及ETL入仓(五)
  • 用 PyTorch 打造 AIOps 小体系:日志异常、指标预测与训练失败根因分析
  • 涂鸦智能携手亚马逊云科技,以全球基础设施与生成式AI加速万物智联时代到来
  • 【完整源码+数据集+部署教程】交通工具图像分割系统: yolov8-seg-C2f-RFCAConv
  • uniapp 混合mixins和继承extends详解
  • 【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程
  • 004 Rust控制台打印输出