前情提要:

【超详细】科普:别再只会用自相关!YIN 和 PYIN 如何破解音频隐藏密码?-CSDN博客

【微实验】妈妈我的MATLAB会识别声音的基频了!-CSDN博客

今天用MATLAB把算法封装成函数,然后调用对比结果。

一、算法简介
  • YIN 算法:一种经典的基频(F0)提取算法,通过计算信号的自相关函数及其累积均值归一化,来定位基频周期,适用于语音、乐器等信号的基频检测,具有较好的抗噪声性能。
  • PYIN 算法:基于 YIN 算法的改进版本,引入了概率模型,通过对基频候选值进行置信度评估,进一步提升了复杂环境下基频提取的准确性,尤其在处理清音 / 浊音过渡、低信噪比信号时表现更优。
二、MATLAB 实现步骤
1. 读取音频文件(voice.mp3)

MATLAB 中可使用audioread函数读取音频,注意 mp3 格式需确保 MATLAB 支持(可先转换为 wav 格式避免兼容问题):

% 读取音频文件
[audio, fs] = audioread('voice.mp3'); % audio为音频数据,fs为采样率
audio = audio(:, 1); % 取单声道
t = (0:length(audio)-1)/fs; % 时间轴
2. YIN 算法实现(基频提取核心)

核心思路:计算归一化累积均值差函数(CMND),寻找最小值对应的周期即为基频周期。

function f0_yin = yin_algorithm(audio, fs, frame_len, hop_len)% 初始化参数n_frames = floor((length(audio) - frame_len) / hop_len) + 1;f0_yin = zeros(n_frames, 1);min_freq = 50; % 最低基频(Hz)max_freq = 500; % 最高基频(Hz)min_period = fs / max_freq;max_period = fs / min_freq;for i = 1:n_frames% 取一帧数据frame = audio((i-1)*hop_len + 1 : (i-1)*hop_len + frame_len);frame = frame - mean(frame); % 去直流% 计算自相关函数r = xcorr(frame, frame);r = r(frame_len:end); % 取后半部分(正延迟)% 计算累积均值差函数(CMND)cmnd = zeros(length(r), 1);cmnd(1) = 1; % 避免除以0for tau = 2:length(r)sum_r = sum(r(1:tau-1));if sum_r == 0cmnd(tau) = 1;elsecmnd(tau) = r(tau) / (sum_r / (tau-1));endend% 寻找最小CMND对应的周期(在有效范围内)tau_range = round(min_period) : round(max_period);[~, min_idx] = min(cmnd(tau_range));tau = tau_range(min_idx);f0_yin(i) = fs / tau;end
end
3. PYIN 算法实现(引入概率模型)

在 YIN 算法基础上,增加基频候选值的置信度计算,筛选最可能的基频:

function [f0_pyin, conf] = pyin_algorithm(audio, fs, frame_len, hop_len)% 调用YIN算法获取初始基频候选f0_initial = yin_algorithm(audio, fs, frame_len, hop_len);n_frames = length(f0_initial);f0_pyin = zeros(n_frames, 1);conf = zeros(n_frames, 1); % 置信度(0-1)% 简化的概率评估(示例):基于基频连续性和CMND最小值for i = 2:n_frames-1% 计算当前帧与前后帧的基频偏差delta = abs(f0_initial(i) - (f0_initial(i-1) + f0_initial(i+1))/2);% 置信度与偏差成反比conf(i) = max(0, 1 - delta / 100); % 假设偏差<100Hz时置信度较高% 根据置信度筛选基频if conf(i) > 0.5f0_pyin(i) = f0_initial(i);elsef0_pyin(i) = NaN; % 低置信度时标记为无效endend
end
4. 可视化结果

将音频波形、YIN 与 PYIN 提取的基频曲线绘制在同一图中,直观对比效果:

% 参数设置
frame_len = 2048; % 帧长
hop_len = 512; % 帧移% 提取基频
f0_yin = yin_algorithm(audio, fs, frame_len, hop_len);
[f0_pyin, ~] = pyin_algorithm(audio, fs, frame_len, hop_len);% 生成基频时间轴
f0_t = (0:length(f0_yin)-1)*hop_len / fs;% 绘图
figure;
subplot(2,1,1);
plot(t, audio);
title('语音波形');
xlabel('时间(s)');
ylabel('振幅');subplot(2,1,2);
plot(f0_t, f0_yin, 'b', 'LineWidth', 1.2);
hold on;
plot(f0_t, f0_pyin, 'r--', 'LineWidth', 1.2);
title('基频提取结果');
xlabel('时间(s)');
ylabel('基频(Hz)');
legend('YIN算法', 'PYIN算法');
grid on;
hold off;

三、效果说明

emm这个音频太长了,密密麻麻看不太出来。

???

把帧移改小一点呢

  • 运行代码后,会显示语音波形图和基频曲线对比图,其中 PYIN 算法的结果(红色虚线)相比 YIN 算法(蓝色实线)更平滑,无效值(NaN)更少,尤其在语音停顿或噪声段表现更稳定。
  • 可通过调整frame_lenhop_lenmin_freqmax_freq等参数优化提取效果,适配不同类型的voice.mp3文件。

对比:

Adobe Audio的自带功能

这个效果只能说是一言难尽,两言也难,千言万语不想说。毕竟它也不是专门服务于语言学、人声音频的软件,所以就这样吧。

Praat的效果应该非常好才对——

Praat

看着不对劲……原来是参数没调好:

把窗长度改大一点——

这样看起来就基本上吻合了。

四、注意事项
  1. 复杂场景下(如多声部、强噪声),建议增加预处理步骤(如滤波、端点检测)。
  2. PYIN 算法的概率模型可进一步细化,优化置信度计算方法提升精度。
五、总结

这是一次失败的实验,下次继续。

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

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

相关文章

开发 npm 包【详细教程】(含发布 npm 包,版本号升级,修改包后重新发布等)

1. 给 npm 包取个【唯一】的名字&#xff01; npm 包命名规范 只能包含小写字母&#xff08;a-z&#xff09;、数字&#xff08;0-9&#xff09;、连字符&#xff08;-&#xff09; 和 下划线&#xff08;_&#xff09;&#xff0c;不能包含空格、大写字母、标点符号&#xff…

Secure 第三天作业

实验需求&#xff1a;1.参考以上拓扑所示&#xff0c;完成以下需求&#xff1a;1&#xff09; 配置各设备 IP 地址2&#xff09; 配置 ZBFW&#xff0c;Inside-1 和 nside-2 属于内部 Zone&#xff0c;Outside-1 属于外部 Zonezone security insidezone security outsidezone-p…

Linux应用层-5.计算机网络(菜鸟学习笔记)

计算机网络的核心是连接与通信&#xff0c;从底层的物理信号到上层的应用服务&#xff0c;各层协议协同工作---------------------------------------------------------------------------------------一.计算机网络分类&#xff08;按范围&#xff09;1•个人区域网&#xff…

[论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼

大型语言模型对决传统方法&#xff1a;多语言漏洞修复能力大比拼 论文阅读&#xff1a;On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

计算机网络2-3:传输方式

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工以及全双工通信 总结 串行传输和并行传输 并行传输的优点是速度为串行传输的n倍&#xff0c;但也存在一个严重的缺点即成本高 同步传输和异步传输 单工、半双工以及全双工通信 总结

文档生成PPT软件哪个好?深度测评8款word转ppt生成工具

在日常办公与教学场景中&#xff0c;如何高效地将Word文档内容转化为专业PPT&#xff0c;一直是职场人士、教育工作者及内容创作者的共同痛点。随着AI技术的普及&#xff0c;一键式转换工具应运而生&#xff0c;它们不仅能精准识别Word中的标题与段落结构&#xff0c;还能自动套…

Azimutt:一款免费开源的多功能数据库工具

Azimutt 是一款支持数据库设计、表结构探索与分析、数据查询以及数据库文档生成功能的全栈工具。 Azimutt 是一个免费开源的项目&#xff0c;源代码托管在 GitHub&#xff1a; https://github.com/azimuttapp/azimutt 功能特性 多数据库支持&#xff1a;包括主流数据库 MySQ…

智算赋能:移动云助力“世界一流数据强港”建设之路

2024年5月&#xff0c;某创新产业园区智算中心正式揭牌成立。台下响起的掌声不仅是对一个项目的祝贺&#xff0c;更是客户对未来的期许—— 推动产业结构优化升级&#xff0c;领跑数字经济转型发展。5家500强企业、8家上市企业、17家独角兽企业……该创新产业园区在成为“世界一…

达梦自定义存储过程实现获取表完整的ddl语句

--导出表的ddl CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) ASsql1 text;ret text : ;cmt text :;sql2 text :; BEGINFOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOPret: ret||WSX.DDL;END LOOP;ret : ret||chr(10…

【ARM】keil提示UVISION: Error: Encountered an improper argument

1、 文档目标 解决MDK退出debug模式后&#xff0c;提示UVISION: Error: Encountered an improper argument。 2、 问题场景 在退出Debug模式的时候&#xff0c;弹出提示窗口&#xff0c;提示&#xff1a;UVISION: Error: Encountered an improper argument。&#xff08;如图…

【2025最新版】PDF24 Creator,PDF编辑,合并分割,格式转换全能工具箱,本地离线版本,完全免费!

软件介绍&#xff08;文末获取&#xff09;这款软件于1999年开发&#xff0c;至今已经有26年了&#xff0c;这26年里它都完全免费&#xff01;简洁的操作界面&#xff0c;让用户轻松上手&#xff0c;高效完成 PDF 文件的处理&#xff0c;方便又实用。这次给大家带来的是一个本地…

如何使用VLLM进行openai/gpt-oss系列推理与支持工具调用

OpenAI时隔6年再次推出开源模型gpt-oss系列&#xff0c;本次gpt-oss系列包含两个模型gpt-oss-120b与gpt-oss-20b。由于模型原生支持一种新的量化技术MXFP4&#xff0c;所以模型的部署所需的显存也显著的降低。openai/gpt-oss-20b 只需要大概16GB的显存openai/gpt-oss-120b 需要…

SVN 查看历史信息

SVN 查看历史信息 引言 Subversion&#xff08;简称SVN&#xff09;是一个开源的版本控制系统&#xff0c;广泛应用于软件开发中。查看SVN的历史信息对于了解代码变更、追踪问题来源以及理解项目发展历程具有重要意义。本文将详细介绍如何在SVN中查看历史信息。 SVN历史信息概述…

vue+flask山西非遗文化遗产图谱可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号&#xff1a;F068 项目介绍&#xff1a; 本系统主要实现了以下功能&#xff1a; 非遗项目知识图谱可视化 非遗项目可视化关键词分析 …

Jetson NX Python环境搭建:使用APT轻松安装NumPy, scikit-learn, OpenCV

引言 在NVIDIA Jetson NX等ARM架构的嵌入式AI板子上搭建Python开发环境&#xff0c;特别是安装像NumPy、OpenCV这样包含C/C底层代码的科学计算库时&#xff0c;经常会遇到编译失败、耗时过长或依赖冲突等问题。这些问题尤其在通过pip从源代码编译安装时更为突出&#xff0c;例如…

Spring Boot项目中线程池的全面教程

一、线程池基础概念与重要性1.1 为什么需要线程池在Spring Boot应用中&#xff0c;线程池是一种至关重要的并发编程工具&#xff0c;它通过​​复用线程资源​​显著提升系统性能。主要优势包括&#xff1a;​​减少开销​​&#xff1a;避免频繁创建和销毁线程带来的性能损耗​…

机器学习第八课之K-means聚类算法

目录 简介 一、K-means 的核心思想 二、K-means 聚类的工作流程 1. 确定聚类数量 K 2.初始化 K 个簇中心 3.簇分配&#xff1a;将数据点分配到最近的簇 4.更新簇中心&#xff1a;重新计算每个簇的中心 5.判断是否收敛 6.输出聚类结果 三、聚类效果评价方式 四、k-…

【P21】OpenCV Python——RGB和BGR,HSV和HSL颜色空间,及VScode中报错问题解决

P21 1 RGB和BGR2 HSV和HSL&#xff0c;YUV2.1 HSV2.1. 色调H2.1.2 饱和度S2.1.3 明度V2.2 HSL2.3 YUV3 颜色空间转换实战4 VScode中报错问题5 Windows 下 VScode 路径格式&#xff08;VScode很强大&#xff0c;路径格式写法自由多样&#xff09;RGB/BGR人眼识别的颜色 &#xf…

.NET 应用程序 Linux下守护进程脚本编写

下面的脚本是生产可用&#xff0c;可靠的sh脚本&#xff0c;用于监控 .NET 应用程序并自动重启。假如你打包发布到Linux的程序名称为MyAspDemo&#xff1b;推荐打包模式为框架依赖&#xff1a;需要在Linux上安装对应的donet版本&#xff1b;1.在Linux下新建一个文件&#xff0c…

图论理论部分

旅游完回来继续学习。 先来看一下图论的理论部分&#xff0c;然后稍微做一下DFS的题目。 图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 图的种…