语音处理:音频信号采样点白化方法初探

  • 公式
  • 效果说明
  • 功能实现C代码
  • 效果实现Python代码
  • 效果改进
  • 遗留问题
  • 参考资料

附:C代码在线调试工具

公式


滑动平均滤波器(Moving Average Filter, MA):


公式说明如下:

  • Xi表示信号幅值,带尖的Xi表示白化后的值
  • Envi指一个滑窗内能量大小和
  • a通常取3
  • log转换是为了降低计算复杂度,变sqrt为log和幂运算

效果说明


  • 效果类似滑动平均法,整体会将能量缩小些
  • 将使能量曲线变平坦,拉平异常信号尖峰
  • 注意事项,使用该公式Xi绝对值必须大于1才有效。论证见效果实现中的右图。

大家可以思考下,该如何改进,可以让该公式或者方法对(-1, 1)范围内的值也能起到白化效果?个人思考见效果改进一节,供参考。

功能实现C代码


MA滑窗的C代码实现,还可以优化,去掉里面一个for循环,有兴趣的读者可以试试。利用以下代码实现对应公式,将处理后的数据导入Python进行折线绘制,观察效果。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>void SignalWhitening(float *mdct, int start, int stop)
{int i, j, n;float div, envi;int a = 3; // 滑窗左边宽3, [i-3, i+3]div = 0;for (i = start; i <= stop - a; i++) {envi = 1e-3f;for (j = i - a; j < i + a + 1; j++) { // 滑窗envi += mdct[j] * mdct[j];}envi /= (float)(a * 2 + 1);// n   = max(0.f, (int)(log(envi) * INV_LOG_2));         /* INV_LOG_2 = 1 / (float)log(2.0f)) */// n >>= 1;                                              /* sqrt() */// div = (float)(pow(2.0f, (float)-n));                  // -0.5log2(Envi)envi = sqrt(envi);div = 1 / envi;mdct[i] *= div;                                       /* same as shift */}for (; i <= stop; i++) {envi = 1e-3f;for (j = i - a; j < stop; j++) {envi += mdct[j] * mdct[j];}envi /= (float)(stop - (i - a));// n = max(0.f,(int)(log(envi) * INV_LOG_2));            /* INV_LOG_2 = 1 / (float)log(2.0f)) */// n >>= 1;                                              /* sqrt() */// div = (float)(pow(2.0f, (float)(-n)));envi = sqrt(envi);div = 1 / envi;mdct[i] *= div;                                       /* same as shift */}return;
}int main(void)
{float f1[10] = {1.2, 3.7, 4, 1, 3, 5.7, 10, 4.5, 5.3, 3.1};float f2[10] = {0.2, 0.7, 0.3, 0.1, 0.5, 0.0008, 0.7, 0.7, 0.4, 0.6};SignalWhitening(f1, 0, 10);int i;for (i = 0; i < 10; i++) {printf("%f, ", f1[i]);}printf("\n");SignalWhitening(f2, 0, 10);for (i = 0; i < 10; i++) {printf("%f, ", f2[i]);}return 0;
}

效果实现Python代码


容易从下图方框中看到,异常的尖峰被平滑了,能量调整得更均匀,曲线平整许多,但曲线形状和趋势不会改变。效果如下:

注:上面右图标注无误,黄线确为 f2 after,蓝线为 f2 before。可以看出,当Xi的值都在(-1,1)范围时,会起反效果,变得更尖,故要注意应用的场景。

实现代码如下:

import numpy as np
import matplotlib.pyplot as pltif __name__ == '__main__':
##  处理前的数据  x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ## x坐标表示各时刻f1 = [1.2, 3.7, 4, 1, 3, 5.7, 10, 4.5, 5.3, 3.1] ## 信号幅值f2 = [0.2, 0.7, 0.3, 0.1, 0.5, 0.0008, 0.7, 0.7, 0.4, 0.6]
##    白化处理后的数据f1_1 = [0.556992,1.547797,1.352833,0.218198,0.616024,1.114535,2.094136,1.488723,1.756067,1.411408]f2_1 = [0.666138,1.633952,0.426430,0.131527,0.653326,0.001592,1.327920,1.035118,0.488252,0.647540]##   legend设置l1 = plt.plot(x,f1,'r-',label='f1 before')l2 = plt.plot(x,f1_1,'g-',label='f1 after')
##   画折线plt.plot(x, f1,'ro-', x, f1_1,'g+-')plt.legend()##    新起一张图表plt.show()  l3 = plt.plot(x,f2,'b-',label='f2 before')l4 = plt.plot(x,f2_1,'y-',label='f2 after')plt.plot(x, f2,'b^-', x, f2_1, 'y+-')plt.legend()

效果改进


Xi(-1,1)范围时,仅需要将Xi / sqrt(Envi)变为Xi * sqrt(Envi)即可,因为第一个结果被归一化,绝对值在1范围附近,第二个已经在1范围内了,只要调节下系数即可。

代码修改,仅需将C代码中22行和37行代码

        div =  1 / envi;

改为

        if (abs(envi) < 1) {div =  envi;} else {div =  1 / envi;}

即可实现对任意情况的Xi调节。针对(-1, 1)范围时的值,调整效果如下:

原来有问题的右图,变成如今正确的右图。

遗留问题


  • 公式里envi开根号前应该是要除以2a + 1的,代码里已调整
  • Xi / sqrt(envi),sqrt(envi)本质就是平均化后的一个Xi,感觉结果被归一化了,单位量纲为1,要注意

参考资料


  • 代码:3GPP,EVS Code,Noise Filling模块
  • 文献:Intelligent Gap Filling in Perceptual Transform Coding of Audio_AES2016
  • 博客:【Python】Matplotlib画图(四)——折线图
  • 博客:一文看懂用python绘制折线图

语音处理:音频信号采样点白化方法初探相关推荐

  1. 特征图注意力_从数据结构到算法:图网络方法初探

    作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...

  2. 基于遗传算法的大规模工程优化设计方法初探

    第七章 基于遗传算法的大规模工程优化设计方法初探 §7.1 概述 前面的章节对单目标遗传算法作了较深入的研究,并作了一些改进,提出了摄动单目标遗传算法,并做了将一般的传统的优化算法(包括改进的MDOD ...

  3. 快速提取过火区域,卫星影像评估西昌山火方法初探

    快速提取过火区域,卫星影像评估西昌山火方法初探 转自易智瑞中国 2020年3月30日15时,四川凉山州西昌市突发森林火灾,火势迅速蔓延,危及西昌市区.截至3月31日16时,火灾过火面积1000余公顷, ...

  4. 公开学术报告笔记 | 上海雷达同心学术论坛之雷达图像解译技术研讨会-合成孔径雷达学习成像方法初探

    笔记原文链接:https://mp.weixin.qq.com/s/Cp5NhUhPZ91CmoeK-WytmQ ↑ \uparrow ↑ 打开上述链接即可阅读全文 讲座信息: 报告人:武俊杰教授, ...

  5. GIS遥感科技论文写作技巧与方法初探-张杰-专题视频课程

    GIS遥感科技论文写作技巧与方法初探-90人已学习 课程介绍         课程分层次讲述了GIS遥感科技论文写作中涵盖的各个方面,从期刊介绍.论文结构.文献管理到附图绘制和空间分析方法及夜间灯光数 ...

  6. 山体计算机科学与技术,三维山体建模方法初探

    论文导读:随着信息技术的逐步发展和社会要求的逐步提高,虚拟现实的研究领域开始转向山体.水域等不规则形态的实体.本文以山体为例就不规则形体的可视化过程进行研究,探讨一种不需要实体数据,计算机可视化技术与 ...

  7. 【笔记本显卡改BIOS硬超频方法初探及简明步骤】

    一.引言(一堆废话) 好久不折腾自己的本本了.前几天华硕的SLIC2.1释出后,才开始研究BIOS,想把SLIC2.1加到BIOS里,体验体验OEM版WIN7的感觉.没想到这万恶的破A6太老了,BIO ...

  8. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  9. 从数据结构到算法:图网络方法初探

    如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入.图表示学习.网络嵌入等别名呈现出来,其实所有的这些方法本质上都是作用在图上的机器学 ...

  10. pagerank数据集_从数据结构到算法:图网络方法初探

    机器之心原创 作者:朱梓豪编辑:Qing Lin 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入.图表示学习.网络嵌入等别名呈现出 ...

最新文章

  1. UVA 10041 Vito's Family
  2. python repl_asyncio REPL(Python 3.8)
  3. 用InstallShield 打包工具 打 Win32 程序 (depends.exe 用看程序都依赖了哪些dll)
  4. linux中复制字符串出错,C语言实现字符串的复制的两种方法
  5. 【阿里妈妈营销科学系列】开篇:C.M.O——“人群.渠道.机会”营销分析导论
  6. MongoDB分组查询,聚合查询,以及复杂查询
  7. 脉位调制解调 matlab,通信原理与matlab仿真v2 第五章 DBPSK调制解调器(1)
  8. POJ 3627 Bookshelf 贪心 水~
  9. Docker工作笔记001---Docker的简介
  10. [导入]C#中的“装箱”与“拆箱”
  11. 7.运输层---UDP
  12. 拓端tecdat|R、Python、Open Refine采集pdf数据,清理数据和格式化数据
  13. 擎标|CMMI 5认证对软件企业有什么好处?
  14. 异名一文带你读懂Chrome小恐龙跑酷!
  15. 0/1背包问题 - 如何理解 解空间
  16. D - 魔咒词典 HDU—1880(双Hash值和map||Hash+二分)
  17. Stashed changes conflicted with hook auto-fixes...
  18. 摩托车新手驾驶教程[2]
  19. HDU 3397 Sequence operation(线段树区间合并)
  20. FT232RL-REEL全隔离原理图,带I/O保护,防电流倒灌等

热门文章

  1. 电子计算机为什么123安不出来,右边键盘数字键打不出来怎么解锁
  2. java对接企业微信
  3. 计算机加域后桌面文件去哪里找,登录域桌面文件丢失
  4. javaScript一元四次、三次方程求根算法
  5. CUDA学习笔记(四)GPU架构
  6. 华为防火墙双线路故障自动切换
  7. react 首页加载loading
  8. SAP SM36如何设置后台作业 每月最后一天运行
  9. 网页制作中PS图像处理的应用
  10. 图像智能处理黑科技,让图像处理信手拈来