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

别再死记硬背了!用Python+Matplotlib亲手画图,5分钟搞懂音频采样与量化

用Python可视化音频采样与量化从声波到数字的魔法之旅每次听音乐时你是否好奇那些优美的旋律是如何被计算机存储和处理的今天我们将用Python的Matplotlib库通过亲手绘制图形揭开音频数字化的神秘面纱。这不是一堂枯燥的理论课而是一次充满代码和可视化的实践探索。1. 准备工作搭建Python音频实验环境在开始之前确保你的Python环境已经安装了必要的库。打开终端或命令提示符执行以下命令pip install numpy matplotlib这些库将帮助我们生成模拟声波、进行采样和量化操作并可视化整个过程。对于音频处理我们主要依赖NumPy用于高效数值计算和数组操作Matplotlib用于数据可视化和图形绘制提示如果你使用Jupyter Notebook可以在代码单元格中直接运行这些Python命令实时看到图形输出效果。让我们先创建一个简单的正弦波作为我们的模拟声波。正弦波是最基本的声波形式理解它有助于我们掌握更复杂的音频信号。import numpy as np import matplotlib.pyplot as plt # 设置采样参数 duration 0.01 # 10毫秒的音频 sample_rate 44100 # 标准CD音质的采样率 t np.linspace(0, duration, int(sample_rate * duration), endpointFalse) frequency 440 # A4音符的频率 amplitude 0.8 # 音量大小 # 生成正弦波 sine_wave amplitude * np.sin(2 * np.pi * frequency * t) # 绘制原始模拟波形 plt.figure(figsize(12, 4)) plt.plot(t, sine_wave, b-, label模拟声波) plt.title(440Hz正弦波 - 模拟声波) plt.xlabel(时间 (秒)) plt.ylabel(振幅) plt.grid(True) plt.legend() plt.show()这段代码生成了一个440Hz的正弦波这是音乐中的标准A4音高。运行后你会看到一个平滑的波形图这就是我们模拟的完美声波。2. 采样将连续声波离散化采样是音频数字化的第一步它决定了我们能捕捉到声波的多少细节。让我们用不同的采样率来观察效果def plot_sampled_wave(original_wave, original_t, sample_rate, new_sample_rate): # 计算新的采样间隔 step int(sample_rate / new_sample_rate) sampled_wave original_wave[::step] sampled_t original_t[::step] # 绘制结果 plt.figure(figsize(12, 4)) plt.plot(original_t, original_wave, b-, alpha0.3, label原始模拟波) plt.stem(sampled_t, sampled_wave, r, markerfmtro, basefmt , label采样点) plt.title(f采样演示 - 采样率: {new_sample_rate}Hz) plt.xlabel(时间 (秒)) plt.ylabel(振幅) plt.grid(True) plt.legend() plt.show() # 使用不同采样率进行采样演示 plot_sampled_wave(sine_wave, t, sample_rate, 10000) # 10kHz采样率 plot_sampled_wave(sine_wave, t, sample_rate, 5000) # 5kHz采样率 plot_sampled_wave(sine_wave, t, sample_rate, 1000) # 1kHz采样率运行这段代码你会看到三张图展示了不同采样率下的采样效果。注意观察10kHz采样率采样点足够密集能够很好地还原原始波形5kHz采样率采样点开始变得稀疏但仍能辨认出波形1kHz采样率采样点太少几乎无法辨认原始波形重要发现根据奈奎斯特定理要准确重建一个信号采样频率必须至少是信号最高频率的两倍。对于最高20kHz的人耳听觉范围CD标准的44.1kHz采样率是足够的。3. 量化将连续振幅数字化采样解决了时间上的离散化问题而量化则解决振幅值的离散化。让我们看看不同量化位数对音频质量的影响def quantize_signal(signal, bits): 将信号量化为指定位数的离散值 max_val np.max(np.abs(signal)) quantized np.round(signal * (2**(bits-1)-1) / max_val) * max_val / (2**(bits-1)-1) return quantized # 生成一个更复杂的波形用于量化演示 complex_wave 0.5 * np.sin(2 * np.pi * 440 * t) 0.3 * np.sin(2 * np.pi * 880 * t) # 使用不同量化位数进行量化 quantized_16bit quantize_signal(complex_wave, 16) quantized_8bit quantize_signal(complex_wave, 8) quantized_4bit quantize_signal(complex_wave, 4) # 绘制量化结果对比 plt.figure(figsize(15, 10)) plt.subplot(3, 1, 1) plt.plot(t, complex_wave, b-, alpha0.3, label原始波形) plt.plot(t, quantized_16bit, r-, label16位量化) plt.title(16位量化 (动态范围: 96dB)) plt.grid(True) plt.legend() plt.subplot(3, 1, 2) plt.plot(t, complex_wave, b-, alpha0.3, label原始波形) plt.plot(t, quantized_8bit, g-, label8位量化) plt.title(8位量化 (动态范围: 48dB)) plt.grid(True) plt.legend() plt.subplot(3, 1, 3) plt.plot(t, complex_wave, b-, alpha0.3, label原始波形) plt.plot(t, quantized_4bit, m-, label4位量化) plt.title(4位量化 (动态范围: 24dB)) plt.grid(True) plt.legend() plt.tight_layout() plt.show()从图中可以明显看出16位量化几乎看不出与原始波形的区别这是CD音质标准8位量化开始出现明显的台阶这是早期计算机和电话音质4位量化波形严重失真只有基本的形状被保留量化位数决定了音频的动态范围计算公式为动态范围(dB) ≈ 6.02 × 位数 1.76。因此16位约96dB动态范围8位约48dB动态范围4位约24dB动态范围4. 混叠现象当采样率不足时让我们通过代码直观展示采样率不足导致的混叠现象def demonstrate_aliasing(): # 生成一个高频信号 high_freq 6000 # 6kHz t_short np.linspace(0, 0.005, 1000) high_freq_wave np.sin(2 * np.pi * high_freq * t_short) # 使用不足的采样率进行采样 low_sample_rate 8000 # 8kHz采样率 t_sampled np.arange(0, 0.005, 1/low_sample_rate) sampled_wave np.sin(2 * np.pi * high_freq * t_sampled) # 重建的信号会表现出低频特性 reconstructed_freq low_sample_rate - high_freq # 2kHz reconstructed_wave np.sin(2 * np.pi * reconstructed_freq * t_short) # 绘制结果 plt.figure(figsize(12, 6)) plt.subplot(2, 1, 1) plt.plot(t_short, high_freq_wave, b-, labelf原始6kHz信号) plt.stem(t_sampled, sampled_wave, r, markerfmtro, basefmt , labelf8kHz采样点) plt.title(高频信号与不足的采样率) plt.grid(True) plt.legend() plt.subplot(2, 1, 2) plt.plot(t_short, reconstructed_wave, g-, label重建的2kHz信号) plt.stem(t_sampled, sampled_wave, r, markerfmtro, basefmt , label采样点) plt.title(混叠现象高频信号被误认为低频) plt.grid(True) plt.legend() plt.tight_layout() plt.show() demonstrate_aliasing()这段代码展示了当采样率不足时会发生什么我们有一个6kHz的高频信号使用8kHz的采样率进行采样低于奈奎斯特频率12kHz采样后的信号看起来像是一个2kHz的低频信号8kHz - 6kHz 2kHz这就是为什么在录音时需要使用抗混叠滤波器先去除高于采样率一半的频率成分然后再进行采样。5. 实战应用分析不同音频格式的特性了解了采样和量化的基本原理后让我们看看这些参数如何影响常见的音频格式。以下是主要音频格式的比较格式压缩类型典型采样率典型位深特点适用场景WAV无损/无压缩44.1-192kHz16-24bit高质量文件大专业音频制作FLAC无损压缩44.1-192kHz16-24bit高质量文件较小音乐收藏高保真MP3有损压缩44.1-48kHz16bit良好音质文件小通用音乐格式AAC有损压缩44.1-96kHz16-24bit优于MP3的效率流媒体移动设备Ogg Vorbis有损压缩44.1-48kHz16bit开源无专利游戏开源项目让我们用Python模拟不同音频格式的压缩效果def simulate_compression(wave, compression_ratio): 模拟有损压缩的效果 # 使用FFT将信号转换到频域 fft_result np.fft.fft(wave) frequencies np.fft.fftfreq(len(wave), d1/sample_rate) # 根据压缩比例去除高频成分 threshold int(len(fft_result) * compression_ratio) fft_result[threshold:-threshold] 0 # 转换回时域 compressed_wave np.real(np.fft.ifft(fft_result)) return compressed_wave # 生成测试信号 test_wave 0.7 * np.sin(2 * np.pi * 440 * t) 0.5 * np.sin(2 * np.pi * 2000 * t) 0.3 * np.sin(2 * np.pi * 8000 * t) # 模拟不同压缩级别 no_compression test_wave # 无压缩 (如WAV) light_compression simulate_compression(test_wave, 0.9) # 轻度压缩 (如高质量MP3) heavy_compression simulate_compression(test_wave, 0.7) # 重度压缩 (如低比特率MP3) # 绘制结果 plt.figure(figsize(15, 9)) plt.subplot(3, 1, 1) plt.plot(t, no_compression, b-) plt.title(无压缩 (如WAV格式) - 保留所有频率成分) plt.grid(True) plt.subplot(3, 1, 2) plt.plot(t, light_compression, g-) plt.title(轻度压缩 (如高质量MP3) - 去除部分高频成分) plt.grid(True) plt.subplot(3, 1, 3) plt.plot(t, heavy_compression, r-) plt.title(重度压缩 (如低比特率MP3) - 去除大量高频成分) plt.grid(True) plt.tight_layout() plt.show()这个模拟展示了有损压缩音频的基本原理通过去除人耳不太敏感的高频成分来减小文件大小。虽然图形简化了实际压缩算法的复杂性但它直观展示了不同压缩级别对波形的影响。

相关文章:

别再死记硬背了!用Python+Matplotlib亲手画图,5分钟搞懂音频采样与量化

用Python可视化音频采样与量化:从声波到数字的魔法之旅 每次听音乐时,你是否好奇那些优美的旋律是如何被计算机存储和处理的?今天,我们将用Python的Matplotlib库,通过亲手绘制图形,揭开音频数字化的神秘面纱…...

服务容灾设计思考

服务容灾设计思考:构建高可用系统的核心策略 在数字化时代,服务的连续性和稳定性成为企业竞争力的关键。无论是金融、电商还是公共服务领域,系统宕机或数据丢失都可能造成不可估量的损失。服务容灾设计正是为了解决这一问题而生,…...

3分钟快速安装微软商店:Windows 11 LTSC系统完整指南

3分钟快速安装微软商店:Windows 11 LTSC系统完整指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否正在使用Windows 11 LTSC版本&…...

戴尔XPS 16评测:均衡大屏笔记本,但售价偏高

戴尔XPS 16(2026款)戴尔此次推出XPS 16,似乎有两个目标:一是重振XPS品牌——该品牌去年曾一度停售,直至今年1月在CES展上宣布回归;二是将其定位于高端内容创作笔记本(如华硕ProArt P16、联想Yog…...

php内核 内核网络请求底层限制与安全管控

PHP 内核层网络请求安全,最佳方式是“默认全拒绝,按白名单放行”,并且在 4 层一起做:内核/扩展拦截 PHP 配置 业务 SDK for shortcuts系统防火墙。────────────────────────────────────…...

php内核 内网离线编译私有PHP内核完整流程

一套能直接执行的:内网离线编译私有 PHP 内核完整流程,全大白话、偏生产可落地。先一句结论: for shortcuts最佳方式 “联…...

php内核 国产CPU(鲲鹏/海光/飞腾)编译指令集适配

“能落地”的版本:PHP 内核在国产 CPU(鲲鹏/海光/飞腾)上的编译与指令集适配最佳方式,全大白话。先一句结论: …...

php内核 内核后门防护、代码执行拦截底层加固

一个直接能落地的“防后门 拦截代码执行”方案。先说结论:最佳方式不是只改一个点,而是 4 层一起上:编译裁剪层 内核拦截层 运行时策略层 系统隔离层。 单点防护一定会漏。---一、先讲大白话:后门最…...

安全管理化技术威胁建模与风险评估

安全管理化技术威胁建模与风险评估是当今数字化时代保障信息系统安全的核心手段。随着网络攻击手段的日益复杂化,企业和组织亟需通过系统化的方法识别、分析和应对潜在威胁。本文将围绕这一主题,从威胁识别、风险量化、控制措施三个关键方面展开探讨&…...

基于安卓的社区团购团长管理系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一套面向社区团购团长的智能化管理系统,并通过安卓平台构建其移动端应用以提升运营效率与用户体验。随着社区团购模式在电子商务…...

基于安卓的汽车维修保养记录平台毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于安卓操作系统的汽车维修保养记录管理平台以解决传统汽车维修保养过程中存在的信息管理分散、数据更新滞后及维护效率低下等问题。随…...

基于安卓的服装尺寸智能推荐系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于安卓平台的服装尺寸智能推荐系统以解决传统服装尺寸推荐方法在精准度与个性化适配方面的不足。随着移动互联网技术的普及与消费者对个性化…...

普通BO解映射为何不暂停队列

AMDGPU KFD 驱动中 SVM (Shared Virtual Memory) 范围 或 BO (Buffer Object) 在需要被驱逐 (evict) 或失效 (invalidate) 时,为何以及如何触发 进程级别 (per-process) 的用户队列 (user queue) 暂停 (quiesce) 与恢复 。那么“为什么一个普通的 BO 在 unmap 的时候…...

Qwen3.5-2B模型版本管理实战:Git工作流与协作规范

Qwen3.5-2B模型版本管理实战:Git工作流与协作规范 1. 为什么需要版本管理 在团队协作开发Qwen3.5-2B模型时,我们经常会遇到这样的场景:张三修改了模型参数但忘记记录具体改动,李四的实验结果无法复现,王五不小心覆盖…...

如何从SQL备份中恢复单表数据_利用特定表导入与闪回技术

直接从全库mysqldump中恢复单表需文本过滤重放:用awk精准提取目标表的CREATE TABLE和INSERT语句块,再导入;不可用INTO OUTFILE反向恢复,因其输出非SQL格式;binlog闪回需解析RBR事件,且无法恢复DROP TABLE的…...

LCM实战:用C++和Python在ROS2与机器人项目中实现进程间高效数据交换

LCM实战:用C和Python在ROS2与机器人项目中实现进程间高效数据交换 在机器人系统和自动驾驶领域,实时数据传输的效率和可靠性直接影响着系统性能。当传感器数据流、控制指令和状态信息需要在多个模块间高速交换时,传统的通信方案往往面临延迟高…...

2026年爆款实测 | 哪些降重软件可以同时降低查重率和AIGC疑似率?高效论文降重方案:TOP10平台功能对比与选择建议(推荐一些可以用于论文降重的软件)

【CSDN博主摘要】 每年五月,CSDN的私信都要被即将毕业的硕博生们挤爆。大家都在问一个极其现实且焦虑的问题:“现在的机器检测太变态了,到底推荐一些可以用于论文降重的软件?到底哪些降重软件可以同时降低查重率和AIGC疑似率&…...

别再死记硬背公式了!手把手教你理解DBC文件里的factor和offset(附CAN信号收发实战代码)

从代码反推DBC参数:工程师视角下的factor与offset实战指南 每次看到DBC文件里那些神秘的factor和offset参数,你是不是也和我当年一样,先机械地抄下公式,然后在调试时对着报错抓耳挠腮?作为在汽车电子行业摸爬滚打多年的…...

增量式知识图谱持续构建系统应用【附代码】

(1)面向火电厂故障文档的实体关系联合抽取模型: 针对故障文本中实体特征稀疏和实体嵌套问题,提出了一种融合双向编码表示与跨层记忆网络的关系抽取模型。采用预训练语言模型作为底层编码器,获取上下文相关的字向量表示…...

DoIP协议栈开发必踩的7大陷阱:从CAN迁移以太网的C++工程师速看

更多请点击: https://intelliparadigm.com 第一章:DoIP协议栈开发必踩的7大陷阱:从CAN迁移以太网的C工程师速看 当汽车电子工程师将传统CAN诊断逻辑迁移到DoIP(Diagnostics over Internet Protocol)时,看似…...

Linux 进程间通信:共享内存与消息队列完全指南

引言在Linux系统编程中,进程间通信(IPC)是多进程协作的核心技术。前面我们学习了管道,今天我们将深入讲解另外三种重要的IPC机制:共享内存、信号量和消息队列。这三种机制各有特点:共享内存:最高…...

面试官直播拷打我:“是否了解Harness Engineering?”,我笑了:“LLM很强,但如果不能拴住、监测、约束,都白搭”。面试官一直在点头。

Harness Engineering 是什么?从哪冒出来的? 面试官一般这么问:"你听说过 Harness Engineering 吗?“或者"Agent Model Harness,你怎么理解这个等式?” 先搞清楚:Harness 是什么&am…...

【独家内测数据】Copilot Next 启动耗时从2.8s压至0.41s:3步完成工作流自动化重构(附可复用JSON Schema模板)

更多请点击: https://intelliparadigm.com 第一章:Copilot Next 自动化工作流性能调优全景概览 Copilot Next 并非传统代码补全工具的简单升级,而是基于实时上下文感知、多模态意图理解与动态工作流编排能力构建的智能协同引擎。其性能表现…...

从 System.out.println() 到内核深处:一次系统调用的“万里长征”

你随手写下一行 System.out.println("Hello World"),它优雅地打印在终端。 但在这行代码背后,JVM、glibc、内核、终端驱动之间发生了一场“万里长征”。 每一次用户态到内核态的切换,都是一次昂贵的上下文跳跃。 而你在日志里狂打几…...

你的K210模型精度低?可能是数据集和MaixHub训练参数没搞对(实战避坑分享)

你的K210模型精度低?可能是数据集和MaixHub训练参数没搞对(实战避坑分享) 当你在MaixHub上训练完一个目标分类模型,满心期待地部署到K210开发板上测试时,却发现识别结果不尽如人意——误识别率高、特定场景下完全失效&…...

NewTab Redirect! 终极指南:如何彻底掌控你的浏览器新标签页

NewTab Redirect! 终极指南:如何彻底掌控你的浏览器新标签页 【免费下载链接】NewTab-Redirect NewTab Redirect! is an extension for Google Chrome which allows the user to replace the page displayed when creating a new tab. 项目地址: https://gitcode.…...

3步轻松上手:哔哩下载姬DownKyi完整使用教程,免费获取B站高清视频

3步轻松上手:哔哩下载姬DownKyi完整使用教程,免费获取B站高清视频 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视…...

告别真机调试!手把手教你用Android模拟副屏调试Presentation双屏异显功能

告别真机调试!Android模拟副屏开发全指南 在移动应用开发领域,多屏交互正成为提升用户体验的新趋势。想象一下,你正在开发一款需要同时在主屏和副屏显示不同内容的应用——可能是餐厅的点餐系统、医疗诊断工具或是车载信息娱乐系统。但现实很…...

打破物理限制!Parsec VDD虚拟显示器:游戏直播与远程办公的终极解决方案

打破物理限制!Parsec VDD虚拟显示器:游戏直播与远程办公的终极解决方案 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 还在为显示器不够用而烦恼吗&#…...

RK3399开发板开机动画进阶:从bootanimation.zip制作到动态更新Logo分区全解析

RK3399开发板开机动画进阶:从bootanimation.zip制作到动态更新Logo分区全解析 当RK3399开发板启动时,用户首先看到的是开机Logo,紧接着是动态的开机动画。这两个元素不仅是设备启动过程中的视觉呈现,更是品牌展示和用户体验的重要…...