浅析mel滤波的快速计算

  • 基本计算方法
  • 快速计算方法
    • 矩阵计算方法
    • 二维指针数组循环法

基本计算方法

基本计算方法可以参考Mel滤波器组的设计与实现(基于MATLAB和Python)这篇文章,从数学公式到实现程序都很完整。

快速计算方法

快速计算是因为一旦确定了截止频率和滤波器组数,滤波器的系数可以一次求出来,那么如何快速的实现计算呢?首先我们确定输入的是什么,滤波器的输入是经过fft变换之后的BIN,长度是 2 n − 1 + 1 2^{n-1}+1 2n−1+1,如果做256(n=8)的 fft,输入数组的长度就是129。
X ( n ) = F F T ( X ( t ) ) = [ X 1 , X 2 , . . . . . X 2 n − 1 + 1 ] X(n)=FFT(X(t))=[X_1,X_2,.....X_{2^{n-1}+1}] X(n)=FFT(X(t))=[X1​,X2​,.....X2n−1+1​]

矩阵计算方法

这种方法利用矩阵的乘法运算,假设 输入序列 长度为 N, 梅尔滤波器组数L,构造一个Mel滤波器的系数矩阵 M N ∗ L M_{N*L} MN∗L​,矩阵的每一列对应Frequency bin的权重值保留,其他位置填充0,如下面的数组 :

       /*000*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*001*/{0.70424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*002*/{0.61587056,0.38412944,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*003*/{0,0.95637744,0.04362256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*004*/{0,0.33359797,0.66640203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*005*/{0,0,0.72805736,0.27194264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*006*/{0,0,0.14240339,0.85759661,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*007*/{0,0,0,0.58317275,0.41682725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*008*/{0,0,0,0.03243114,0.96756886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*009*/{0,0,0,0,0.51258737,0.48741263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*010*/{0,0,0,0,0,0.99499423,0.00500577,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*011*/{0,0,0,0,0,0.50795775,0.49204225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*012*/{0,0,0,0,0,0.02092128,0.97907872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*013*/{0,0,0,0,0,0,0.56167114,0.43832886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*014*/{0,0,0,0,0,0,0.10366818,0.89633182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*015*/{0,0,0,0,0,0,0,0.66678804,0.33321196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*016*/{0,0,0,0,0,0,0,0.23608783,0.76391217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*017*/{0,0,0,0,0,0,0,0,0.81698896,0.18301104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*018*/{0,0,0,0,0,0,0,0,0.41196391,0.58803609,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*019*/{0,0,0,0,0,0,0,0,0.00693886,0.99306114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*020*/{0,0,0,0,0,0,0,0,0,0.62564476,0.37435524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},.......................................

用矩阵乘法
M E L 1 ∗ L = X 1 ∗ N ∗ M N ∗ L MEL_{1*L} =X_{1*N}*M_{N*L} MEL1∗L​=X1∗N​∗MN∗L​
遂得出MEL谱值。

二维指针数组循环法

上述计算方法在目标系统支持矩阵运算时非常方便,但还有些处理器不支持,另外此方法需要一个比较大内存来放置0,非常浪费,在嵌入式系统里可以用C语言指针数组的方法,高效的实现计算。这里除了将Mel滤波器的系数顺序存放在一段内存中,需要一个二级指针数组指向每段系数存放的首地址;另外需要一个频率映射上下边界指针数组,从FFT BIN的对应频率点取得对应的数值与权重点乘后累加。示意图如下,前两行示意相同颜色的方框
参与一个循环的运算。这里提到的一点是权重二级指针数组的寻址可以使用二维表格方式,代码将非常有趣。

浅析mel滤波的快速计算相关推荐

  1. matlab肌电信号平滑滤波_BCIduino 滤波和频谱计算操作

    本文介绍用 python 对航弈生物 BCIduino 放大器脑电/肌电数据进行滤波及频谱计算,介绍如何用 python mne 对 fif 格式保存的脑电数据进行读取和简单的滤波,并用numpy 对 ...

  2. ubuntu 使用FFTW快速计算离散傅里叶变换

    FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开 ...

  3. SQL优化(二) 快速计算Distinct Count

    2019独角兽企业重金招聘Python工程师标准>>> 原创文章,首发自个人站点 ,转载请务必注明出处 http://www.jasongj.com/2015/03/15/count ...

  4. 快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)

    从网络上下载文件,尤其是非常大的文件怎么确保文件准确无误呢? 通常网站提供文件时会同时提供该文件的校验值,如MD5,SHA1,SHA256等, 当文件下载完成后,计算它的校验值,如果和网站提供的一致, ...

  5. 快速计算整数的二进制表示法中1的个数

    快速计算整数的二进制表示法中1的个数 题目:给定一个无符号32位整数x,求x的二进制表示法中含1的个数? 第一种算法: int OneCount(unsigned int x) {   for(int ...

  6. python利用近似公式计算π_Excel函数公式大全之利用SUMSQ函数快速计算多个数据的平方和...

    各位Excel天天学的小伙伴们大家好,欢迎收看Excel天天学出品的excel2019函数公式大全课程.今天我们要学习的函数是数学函数中的SUMSQ函数,SUMSQ函数的功能是快速计算多个数据的平方和 ...

  7. 网络基础知识 快速计算子网掩码的2种方法

    网络基础知识 快速计算子网掩码的2种方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  8. Python一句话实现秦九韶算法快速计算多项式的值

    关于秦九韶算法快速计算多项式值的原理描述请参考之前推送的文章Python使用秦九韶算法求解多项式的值.本文重点演示Python函数reduce()和lambda表达式的用法.代码没加注释,如果不好理解 ...

  9. 妙用Python内置函数int()快速计算等比数列前n项和

    本文要点在于Python内置函数int()的用法,所以计算等比数列前n项和时没有使用数学上的公式Sn=a1*(1-q^n)/(1-q). 一般遇到这样的问题,很容易想到使用循环来实现,以计算1+2+4 ...

最新文章

  1. 那个计算机应用没有广告,为什么别人的电脑没有什么广告,而你的电脑一大堆呢?答案在这里...
  2. (59) 解决在列表视图复制导致打开详细内容
  3. 基于JAVA+SpringMVC+MYSQL的进销存ERP系统
  4. spring结合ehcache-spring-annotations配置缓存
  5. 赛门铁克调研发现越来越多的物联网设备被用于实施DDoS攻击
  6. 8.微服务设计 --- 监控
  7. 怎么让jsp中的按钮置灰不能使用_拆解按钮规范
  8. ai策略机器人研究a50_跟上AI研究的策略
  9. 【图文详解】入职必备——SVN使用教程
  10. 韦东山嵌入式学习心得
  11. 计算机如何重新进行硬盘分区,最简单办法,如何在不重装电脑系统的情况下对硬盘进行重新分区-电脑怎么分区...
  12. laravel-mix打包 js css
  13. WebGoat教程解析——Hijack a Session
  14. day23_1-re模块之转义字符、分组、方法
  15. 新浪微博技术架构分析-转载
  16. “马主任吗?去机场的车来了没有?
  17. FZU 1275和UVA11624
  18. CentOS安装配置tomcat
  19. 阿里和云之讯短信发送服务
  20. 2021年春季ACM训练赛第4场

热门文章

  1. 四年后最赚钱十大行业 网络编辑3G工程师入选
  2. @#####haohaohao#####推荐系统技术演进趋势:从召回到排序再到重排
  3. python打蛇_Python 实现类似PHP的strip_tags函数功能,并且可以自定义设置保留标签...
  4. 生成源代码,这是一个妥协
  5. 关于机械键盘,我入坑了?
  6. java Text 错误: 找不到或无法加载主类 Text
  7. 使用和调整电磁铁时应注意的事项
  8. JavaScipt30(第七个案例)(主要知识点:数组some,every,findIndex方法)
  9. Spring Boot poi 导出Excel表格、Txt到浏览器下载
  10. Linux和Windows稀疏文件拷贝移动