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

【python】计算mel频率可能比你想象的要复杂一点

Mel计算公式

计算mel频率可以直接套用公式,

公式如下,

m = 2595 l o g 10 ( 1 + f 700 ) m = 2595 log_{10}(1+ \frac{f} {700}) m=2595log10(1+700f)

所以实现上如下

import numpy as np
import librosa

def mel_calculate(freq):
    return 2595 * np.log10(1+freq/700)

for f in np.linspace(10,1000,num=10):
    my_mel = mel_calculate(f)
    mel = librosa.hz_to_mel(f)
    print(f"freq {f}, cal:{my_mel}, librosa:{mel}")

为了做结果上的验证,我使用了librosa来核对计算结果。
在这里插入图片描述
但是发现结果居然跟librosa的不一样,这是为什么呢?

查看librosa的官方文档,有关hz_to_mel的使用,其实是有一个参数

在这里插入图片描述
查寻源码发现,只有在htk=True的时候,才使用开头的公式。

下图是hz_to_mel源码部分中htk的判断
hz_to_mel源码部分

那么这个htk是什么含义呢?

什么是htk

在另外一个函数librosa.mel_frequencies的api介绍中,有关于htk的说明

By default, librosa replicates the behavior of the well-established MATLAB Auditory Toolbox of Slaney.
librosa默认使用slaney实现,这是在MATLAB Auditory Toolbox中的实现。
According to this default implementation, the conversion from Hertz to mel is linear below 1 kHz and logarithmic above 1 kHz.
在这种实现下,转换在1千赫以下是线性的,在1千赫以上是对数的
Another available implementation replicates the Hidden Markov Toolkit (HTK) :
另外一种实现来源Hidden Markov Toolkit ,即HTK

然后针对slaney和HTK,这里信号给了两个参考引用连接

Slaney, M. Auditory Toolbox: A MATLAB Toolbox for Auditory Modeling Work. Technical Report, version 2, Interval Research Corporation, 1998.
Young, S., Evermann, G., Gales, M., Hain, T., Kershaw, D., Liu, X., Moore, G., Odell, J., Ollason, D., Povey, D., Valtchev, V., & Woodland, P. The HTK book, version 3.4. Cambridge University, March 2009.

基本都是20年前的东西了。 但是相比而言,slaney是比HTK稍微新一些的了。

翻阅了一些材料,HTK是针对隐马尔可夫框架做的一个工具包,它有一个在线的htkbook 大部分的介绍也是基于ASR的。

还有一个是Auditory Toolbox,它里面应该就对应着Slaney的实现吧。(没有具体研究)

所以回到开头,如果要匹配到公式实现,所以在参数中需要指定htk=True。即mel = librosa.hz_to_mel(f,htk=True)

相关文章:

  • springboot+vue+elementui校园博客管理系统
  • 从QQ秀到VR穿搭,为什么服装搭配对虚拟化身如此重要
  • LeetCode每日一题——946. 验证栈序列
  • Mybatis的注解实现复杂映射开发
  • 【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码
  • 全球最强智算来了:12000000000000000000(别数了18个0)FLOPS!
  • 轻量级神经网络算法系列文章-ShuffleNet v2
  • 4-20mA 电压控制电流输出电路浅析
  • java+python+vue高校竞赛报名系统
  • 7 张图解 CrashLoopBackOff,如何发现问题并解决它?
  • 面试前“啃完”这份Java架构全栈知识点,金九银十过五关斩六将!
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第12章 Vue3.X新特性解析 12.1 Vue3.0 新特性
  • 深入Spring Boot :打包解决方案
  • SE38 SE10 程序/事务码修改日志报表/TR日志/请求号日志
  • CC2642打开例程
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Bytom交易说明(账户管理模式)
  • cookie和session
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java IO学习笔记一
  • JavaScript设计模式系列一:工厂模式
  • leetcode-27. Remove Element
  • Netty源码解析1-Buffer
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • WePY 在小程序性能调优上做出的探究
  • 编写高质量JavaScript代码之并发
  • 测试开发系类之接口自动化测试
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 前端
  • 一个项目push到多个远程Git仓库
  • 用Canvas画一棵二叉树
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 《天龙八部3D》Unity技术方案揭秘
  • Semaphore
  • 带你开发类似Pokemon Go的AR游戏
  • ​TypeScript都不会用,也敢说会前端?
  • ​水经微图Web1.5.0版即将上线
  • #define用法
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragma预处理命令
  • (1)常见O(n^2)排序算法解析
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (js)循环条件满足时终止循环
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)丶RabbitMQ的六大核心
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四) Graphivz 颜色选择
  • (转)Scala的“=”符号简介
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置