Python绘图动态可视化:实时音频流

在数据可视化中,动画是一种非常有效的方式,可以帮助我们更好地理解数据的变化和动态过程。Python 的 matplotlib.animation 模块提供了强大的功能来创建动画。本文将介绍如何使用 matplotlib.animation 创建简单的动画,并展示一个更复杂的实时音频信号绘制示例。

一、FuncAnimation介绍

FuncAnimationMatplotlib 中用于创建动画的主要工具。它通过不断调用一个更新函数来动态更新图形,从而实现动画效果。FuncAnimation 可以用于各种类型的动画,包括实时数据可视化、动态图形展示等。

1.1 主要功能

  • 动态更新:通过定期调用更新函数,动态改变图形的内容。这使得用户能够看到数据随时间变化的过程,增强了数据的可理解性。

  • 高效绘制:使用 blit 参数可以提高绘制效率,仅更新需要变化的部分。通过只重绘变化的部分,blit 可以显著提高动画的性能,尤其是在处理复杂图形时。

  • 灵活性:可以与其他 Matplotlib 功能结合使用,创建复杂的动画效果。您可以在动画中添加文本、图形、图例等元素,使得动画更加丰富和信息量更大。

1.2 参数

FuncAnimation 的构造函数接受多个参数,以下是一些常用参数:

  • fig:要更新的图形对象。通常是通过 plt.subplots() 创建的图形。

  • func:更新函数,每次动画帧更新时调用。该函数应接受一个参数(当前帧的编号),并返回要更新的图形对象。

  • frames:动画的帧数,可以是整数、可迭代对象或生成器。指定动画的总帧数或提供帧数据。

  • blit:布尔值,指示是否使用 blitting 来优化绘制。如果设置为 True,则只更新需要变化的部分,通常可以提高性能。

  • interval:每帧之间的时间间隔(毫秒)。可以控制动画的播放速度。

  • repeat:布尔值,指示动画是否循环播放。默认为 True,即动画结束后会重新开始。

1.3 简单示例

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation# 设置参数
x = np.linspace(0, 2 * np.pi, 100)  # x 轴数据
y = np.sin(x)  # y 轴数据# 创建图形
fig, ax = plt.subplots()
line, = ax.plot(x, y)  # 初始化绘图线
ax.set_ylim(-1.5, 1.5)  # 设置 y 轴范围
ax.set_title('Sine Wave Animation')
ax.set_xlabel('x')
ax.set_ylabel('sin(x)')# 定义更新函数
def update(frame):line.set_ydata(np.sin(x + frame / 10))  # 更新 y 数据return line,# 创建动画
ani = FuncAnimation(fig, update, frames=100, blit=True)# 保存动画为 GIF,使用 Pillow
ani.save('sine_wave_animation.gif', writer='pillow', fps=30)# 显示动画
plt.show()

在这里插入图片描述

代码详细说明

  1. 创建图形:使用 plt.subplots() 创建图形和坐标轴,并初始化绘图线。line, = ax.plot(x, y) 创建一条初始的正弦波线。

  2. 定义更新函数:在每一帧中更新 y 数据,以实现动态效果。line.set_ydata(np.sin(x + frame / 10)) 根据当前帧的编号调整正弦波的相位。

  3. 创建动画:使用 FuncAnimation 创建动画,并指定更新函数和帧数。frames=100 表示动画将有 100 帧。

二、实时音频信号绘制

接下来,我们将展示一个更复杂的示例,使用 PyAudio 录制实时音频并绘制其时域信号。以下是完整的代码:

import numpy as np
import matplotlib.pyplot as plt
import pyaudio
import wave
from matplotlib.animation import FuncAnimation
import threading# 设置参数
FORMAT = pyaudio.paInt16  # 音频格式
CHANNELS = 1  # 单声道
RATE = 44100  # 采样率
CHUNK = 1024  # 每次读取的音频块大小
N = 30  # 显示的块数
WINDOW_SIZE = CHUNK * N  # 滑动窗口大小# 创建 PyAudio 对象
p = pyaudio.PyAudio()# 创建音频流
stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)# 创建 WAV 文件
output_filename = "output.wav"
wf = wave.open(output_filename, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)# 创建一个空的图形
fig, ax = plt.subplots()
x = np.arange(0, WINDOW_SIZE)  # x 轴数据
line, = ax.plot(x, np.zeros(WINDOW_SIZE), color='blue')  # 初始化绘图线
ax.set_ylim(-32768, 32767)  # 设置 y 轴范围
ax.set_xlim(0, WINDOW_SIZE)  # 设置 x 轴范围
ax.set_title('Real-time Audio Signal')
ax.set_xlabel('Samples')
ax.set_ylabel('Amplitude')# 初始化音频数据缓冲区
audio_buffer = np.zeros(WINDOW_SIZE, dtype=np.int16)# 定义音频录制函数
def record_audio():global audio_bufferprint("Recording...")try:while True:data = stream.read(CHUNK, exception_on_overflow=False)  # 读取音频数据audio_data = np.frombuffer(data, dtype=np.int16)  # 转换为 numpy 数组# 更新音频缓冲区audio_buffer = np.roll(audio_buffer, -CHUNK)  # 滚动缓冲区audio_buffer[-CHUNK:] = audio_data  # 添加新数据到缓冲区末尾# 写入 WAV 文件wf.writeframes(data)  # 将音频数据写入文件except Exception as e:print(f"Recording stopped: {e}")# 定义更新函数
def update(frame):line.set_ydata(audio_buffer)  # 更新 y 数据return line,# 创建音频录制线程
audio_thread = threading.Thread(target=record_audio)
audio_thread.daemon = True  # 设置为守护线程
audio_thread.start()# 创建动画
ani = FuncAnimation(fig, update, blit=True, cache_frame_data=False)# 显示动画
plt.show()# 停止音频流
stream.stop_stream()
stream.close()
p.terminate()# 关闭 WAV 文件
wf.close()
print(f"Audio saved to {output_filename}")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97776.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97776.shtml

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

相关文章

【Vue2 ✨】Vue2 入门之旅(七):事件处理

在前几篇文章中&#xff0c;我们学习了指令与过滤器。本篇将介绍 事件处理&#xff0c;重点包括 v-on、事件修饰符以及键盘事件。 目录 事件绑定 v-on事件修饰符键盘事件小结 事件绑定 v-on Vue 使用 v-on&#xff08;缩写 &#xff09;来监听事件。 <div id"app&qu…

高效数据传输的秘密武器:Protobuf

当涉及到网络通信和数据存储时&#xff0c;数据序列化一直都是一个重要的话题&#xff1b;特别是现在很多公司都在推行微服务&#xff0c;数据序列化更是重中之重&#xff0c;通常会选择使用 JSON 作为数据交换格式&#xff0c;且 JSON 已经成为业界的主流。但是 Google 这么大…

腾讯混元翻译大模型Hunyuan-MT-7B:重塑跨语言沟通的技术革命

腾讯混元翻译大模型Hunyuan-MT-7B&#xff1a;重塑跨语言沟通的技术革命 腾讯混元Hunyuan-MT-7B大模型的发布标志着机器翻译领域进入全新时代&#xff0c;本文将深入解析这一突破性技术如何实现30种语言翻译冠军的卓越表现 一、Hunyuan-MT-7B核心架构解析 1.1 基于Transformer的…

End-To-End 之于推荐-kuaishou OneRec2 笔记

End_To_End 之于推荐onerec里&#xff0c;快手利用大模型做了推荐架构的革命&#xff0c;几个月后&#xff0c;v2之于v1是一些技术细节进行了进一步迭代&#xff0c;主要是以下两个方面&#xff1a; 1. 架构层面的突破&#xff1a;Lazy Decoder-Only 背景问题&#xff1a;V1 的…

【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)

3670. 没有公共位的整数最大乘积 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; SOSDP 本题我们显然不能枚举每一个数对&#xff0c;n 的复杂度显然超时&#xff0c;所以考虑优化 我们考虑一个二进制数 mask&#xff0c;因为我们必须要选没有任…

Sping Web MVC入门

1.什么是Sping Web MVC1.1MVC定义2.什么是Spring MVC

LLM面试50问:NLP/RAG/部署/对齐/安全/多模态全覆盖

太好了!下面按你点名的 6 大主题(NLP、检索/RAG、部署、对齐、 安全、多模态)给出深度版答案 + 关键公式/推导 + 最小可跑示例代码 + 常见坑。都尽量精炼到“拿来即用/面试可白板推导”的粒度。 NLP(架构、位置编码、指令跟随) 1) RoPE 长上下文与缩放 要点:RoPE 将位置…

计算机网络技术(四)完结

七&#xff0c;虚拟局域网VLAN1&#xff0c;VLAN概述通过设置虚拟局域网来实现&#xff0c;pc之间实现快速安全通信。对比说明&#xff1a;之前交换机的广播来实现通信&#xff0c;但同意也带来了几个问题&#xff0c;过大的广播域&#xff0c;造成了带宽的浪费&#xff0c;过大…

VibeVoice 部署全指南:Windows 下的挑战与完整解决方案

VibeVoice 部署全指南&#xff1a;Windows 下的挑战与完整解决方案 目标读者&#xff1a;希望在本地部署 VibeVoice 进行文字转语音&#xff08;TTS&#xff09;的开发者、研究人员或爱好者 关键词&#xff1a;VibeVoice、FlashAttention-2、Windows 部署、CUDA 加速、FFmpeg、…

一次别开生面的Java面试

场景描述&#xff1a; 在一家知名互联网大厂的面试室中&#xff0c;谢飞机&#xff0c;一个自信满满的程序员&#xff0c;正在经历一场别开生面的Java面试。面试官以严肃的态度开始了这场技术问答。第一轮&#xff1a;基础知识问答 面试官&#xff1a;"我们先从简单的开始…

web自动化测试(selenium)

目录 测试前的准备 驱动 安装驱动管理 selenium库 使用selenium编写代码 自动化测试常用函数 元素的定位 cssSelector xpath 查找元素 点击/提交对象 模拟按键输入 清除文本内容 获取文本信息 获取当前页面标题和URL 窗口 切换窗口 窗口设置大小 屏幕截图 …

民间药方偏方网站整站源码 带数据PHP版

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 民间药方偏方网站整站源码 带数据PHP版 这是一个聚焦中国民间药方的平台。平台设有搜索功能&#xff0c;方便用户查找药方&#xff0c;还对药方进行了内科、外科、肿瘤等多类分类&#x…

C++ 条件变量,互斥锁

C 中多线程编程的两个核心同步原语&#xff1a;互斥锁 (Mutex) 和 条件变量 (Condition Variable)。它们是实现线程间安全通信和协调的关键。1. 互斥锁 (Mutex)核心概念互斥锁用于保护共享数据&#xff0c;确保同一时间只有一个线程可以访问该数据&#xff0c;从而避免数据竞争…

MySQL 8.0 窗口函数详解:让数据分析更简单高效

在日常的数据分析工作中&#xff0c;我们经常需要对数据进行分组排序、计算移动平均值、统计累计求和等操作。在MySQL 8.0之前&#xff0c;这类需求通常需要编写复杂的子查询或连接查询才能实现。而MySQL 8.0引入的窗口函数&#xff08;Window Functions&#xff09;极大地简化…

【论文阅读】DeepSeek-LV2:用于高级多模态理解的专家混合视觉语言模型

【论文阅读】DeepSeek-LV2&#xff1a;用于高级多模态理解的专家混合视觉语言模型 文章目录【论文阅读】DeepSeek-LV2&#xff1a;用于高级多模态理解的专家混合视觉语言模型一、介绍二、模型结构三、数据建设**3.1 对齐****3.2 视觉语言预训练数据****3.3 监督微调数据**四、训…

一款为开发者而生的开源全栈LLMOps平台

&#x1f680; 超越ChatGPT&#xff01;一款为开发者而生的全栈LLMOps平台&#xff1a;LMForge完全指南 作为一名AI应用开发者&#xff0c;你是否也曾遇到过这些令人头疼的问题&#xff1f; 成本失控&#xff1a;GPT-4的API账单像雪片一样飞来&#xff0c;却不知道钱具体花在…

DeepL Translate在线工具测评:精准翻译技术文档与学术论文,支持多格式文档上传保留原格式

之前跟你们聊过帮着梳理代码协作的 GitLens&#xff0c;今天换个偏向文档翻译的方向 —— 给你们安利一个在线 AI 翻译工具「DeepL Translate」&#xff0c;官网地址是DeepL Translate: The worlds most accurate translator&#xff0c;它跟普通翻译工具不一样&#xff0c;翻技…

系统配置不是“乐高积木”:制造企业如何通过科学变更管理保障稳定运行

在制造业的数字化进程中&#xff0c;系统配置的稳定性常被忽视。作为一家制造企业的行政经理&#xff0c;我曾亲历这样的场景&#xff1a;为应对生产波动&#xff0c;各部门频繁要求调整ERP系统参数&#xff0c;结果导致库存数据失真、订单处理延迟&#xff0c;甚至引发客户投诉…

vscode炒股插件-韭菜盒子AI版

基于vscode插件&#xff0c;原韭菜盒子3.15.0版本开发&#xff0c;新增选股宝快讯功能、AI投资助手、指定股票AI分析功能&#xff08;目前只针对A股&#xff09;&#xff0c;内置AI大模型助手功能&#xff0c;支持ai分析最新资讯、ai分析当日资讯&#xff08;让ai随时给你分析股…

Spring Cloud Config 核心原理

Spring Cloud Config 是 Spring Cloud 提供的一个用于集中化管理应用程序各个环境下的配置属性的解决方案。它支持统一管理配置&#xff0c;并且可以在不重启应用的情况下动态地更新配置信息&#xff0c;提高开发和运维效率。 主要特点 • 集中管理配置&#xff1a;可以将不同环…