speex回声消除源码解读

2023-11-12

一、speex回声消除aec小析:

 频域自适应算法采用了分块处理的思想,以减少高阶自适应滤波器的计算复杂度,多延迟自适应滤波器(MDF)则更一般可以分M块来处理,其中块的长度比自适应滤波器的阶数更小。

        后置滤波器系数一直在更新,单讲时前置滤波器用后置滤波器系数更新,双讲时前置滤波器系数不更新。

        如果近端远端的数据线性比较好的话,用speex处理回声效果还不错。若是非线性严重效果就差了。另外memath认为相比其它的回声消除算法,speex对在滤波器更新时做了远端检测,回声估计比较好些。

以前写的文章,分享下,不当之处,请指正。


二、源码解读:

标记:N=2*frame_size  其中frame_size为帧长

      M= filter_length/frame_size,其中filter_length为回声消除拖尾

1、按照公式(1)把近端信号in[frame_size]直流去除掉,存入缓存input[frame_size]。

     

2、按照公式(2)对远端与近端信号分别进行预加重处理,远端信号存入x[frame_size],并对近端延迟的信号进行frame_size的交叠,以下均按预加重处理后信号处理。

         

3、频域X[M*frame_size]后面M-1个频域段的历史数据后移,然后对远端信号x使用FFT变换到频域X[M*frame_size]前面部分。

4、求远端信号x时域的能量Sxx和以及其功率谱Xf[frame_size+1]。   

5、前置滤波器foreground与远端信号x的输出再与近端信号相减得到误差信号存入e[N]前半部分,并求其能量方差Sff。

6、求取后置滤波器W各段的系数幅值并进行归一化处理

     

     

其中初始化max_sum=1。

更新系数w(i)=w(i)+PHI(i),PHI由远端信号频域X(i)与误差E(i)复数相乘并乘以power_1*prop(i)计算得到,其中power_1为自适应步长因子

7、为防止循环卷积,对于第1段以及当前帧数对M-1求余为j-1的j(j=0...M-1)段作处理。(把W[j*N]段做反傅里叶变换后的后一半部分全部置0,再做傅里叶变换回来)

8、计算远端信号与后置滤波器的输出并反傅里叶变换到时域y,前置、后置滤波器输出之间的误差与它们误差的方差Dbf;计算近端信号减去后置滤波器输出差值的方差See。

9、分别计算平均能量差别与平均方差差别Davg1= 0.6*Davg1 + 0.4*(Sff-See); Davg2 = 0.85*Davg2 + 0.15*(Sff-See);Dvar1 =0.36*Dvar1 + 0.16*Sff*Dbf;Dvar2 = 0.7225*Dvar2 + 0.0225*Sff*Dbf;以便判断是否要更新前置后置滤波器系数。

如果;其中在公式(3)d1=1d2=0.5d3=0.25任一个条件成立,就要更新前置滤波器系数。若是要更新,则把后置滤波器的系数复制给前置滤波器,并平滑前置滤波器的输出误差与后置滤波器的输出误差得到总的误差。Davg1Davg2Dvar1,Dvar2重置为0。

10、若在公式(4)中d1=4d2=4d3=4任一个条件成立,就要更新后置滤波器系数。则把前置滤波器的系数复制给后置滤波器,并把前置滤波器的输出误差复制给后置滤波器的输出误差,再更新后置滤波器输出前部分。把See=Sff,Davg1Davg2Dvar1,Dvar2重置为0。

11、自适应滤波器的输出out[frame_size]由近端信号减去前置滤波器的输出,并且去预加重处理公式(4);保存前置滤波器生成人造回声信号并去预加重处理公式(5)。

         

12、误差缓存区前部分拷贝给后部分,并置前部分为0。

13、计算前置滤波器输出与前置滤波器的输出的互相关Sey,后置滤波器输出的自相关Syy,近端信号的自相关Sdd;计算分别前置、后置滤波器输出误差的频域数据E与Y,及其功率谱RfYf

14、若!(Syy>=0 Sxx>=0 See >= 0)|| !(Sff < N*1e9 Syy < N*1e9 Sxx< N*1e9),screwed_up=screwed_up+50;否则Sff>Sdd+10000N时,screwed_up=screwed_up+1;否则screwed_up=0;当screwed_up>=50时,重置全部参数。

15、计算远端信号的能量Sxx及其功率谱Xf;平滑远端信号的功率

         

16、计算相关系数及标准差

Eht=Rf(i)-Eh(i);

Yht=Yf(i)-Yh(i);

Peyt=Peyt+Eht*Yht;

Pyyt=Pyyt+Yht*Yht;

更新:Eh(i)=(1- N/Fs)*Eh(i)+N/Fs*Rf(i)

Yh(i)=(1- N/Fs)*Yh(i)+N/Fs*Yf(i)

最后Pyyt=sqrt(Pyyt),  Peyt=Peyt/Pyyt;

17、计算相关系数更新率alpha=min(Syy*2*frame_size/Fs,See*0.5*frame_size/Fs)/See; alpha_1=1-alpha

18、更新相关系数Pey=alpha_1*Pey+ alpha*Peyt; Pyy=alpha_1*Pyy+ alpha*Pyyt;

19Pyy=max(Pyy,1);Pey=max(Pey,0.005*Pyy);Pey=min(Pey,Pyy)

20、泄漏估计leak_estimate=Pey/Pyy,leak_estimate>16383,则令leak_estimate=32767

21、计算错误比率RER = (0.0001*Sxx + 3*leak_estimate*Syy)/ See;RER作上下限限制。

RER=max(RER, Sey*Sey/(1+See*Syy);RER=min(RER,0.5);

22、若sum_adapt>M并且leak_estimate>0.03,则更新自适应滤波器步长因子:先求后置滤波器的回声消除功率         r=min(leak_estimate*Yf(i),0.5(Rf(i)+1))*0.7+RER*(Rf(i)+1)*0.3

最优步长为power_1=r/((Rf(i)+1)*(power(i)+10));否则,adapt_rate=0,Sxx>1000N时,

adapt_rate=min(Sxx, See)*0.25/See;更新power_1= adapt_rate/(power+10)

总自适应次数sum_adapt=sum_adapt+adapt_rate


三、speex回声消除流程图:



memath回声消除系列文章:

speex与webrtc回声消除小结

QQ、YY与webRTC回声消除效果对比分析与展望

webrtc aec3效果对比aec与aecm(webrtc M64 20180115版本)





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

speex回声消除源码解读 的相关文章

  • 服装行业多模态算法个性化产品定制方案

    一 项目背景 AI赋能服装设计师 设计好看 好穿 好卖的服装 传统服装行业痛点 设计师无法准确捕捉市场趋势 抓住中国潮流 上新周期长 高库存滞销风险大 基本款居多 难以满足消费者个性化需求 解决方案 GPT 数据洞察 快速反应市场时尚流行趋
  • pycharm安装2021最新详细教程小白入门

    一 官网下载安装包 Pycharm的官网 https www python org 这个链接进去直接是下载界面 https www jetbrains com pycharm download 1 专业版 Professional 是收费的
  • C++基本语法

    C 中构造函数的调用 class Type void main Type obj ok 编译器调用了默认的构造函数 Type obj1 Type ok 显示调用了默认的构造函数 Type obj3 error 其是声明了一个无参并返回Typ
  • 控制台get的两种提交方式

    本次学习需要打开Visual Studio 2015简称 VS 开发工具 其他的版本也可以使用 打开进入页面创建项目 创建的项目命名为控制台get提交的两种方式 之后我们在软件默认的位置 保存的位置可以进行更改 之后就到更改的位置中查找 中
  • axios 请求自动携带 cookie

    axios 请求自动携带 cookie axios默认是不让ajax请求头部携带cookie的 添加withCredentials设置 const instance axios create baseURL http 127 0 0 1 3
  • Java 实现暴力匹配算法(也称为朴素字符串匹配算法)

    摘要 暴力匹配算法 也称为朴素字符串匹配算法 是一种简单但有效的字符串匹配算法 它通过遍历主串和模式串的每一个字符 并在遇到不匹配的情况下逐个后移字符进行匹配 本文将使用Java语言实现暴力匹配算法 并对其性能进行简要分析 介绍 字符串匹配
  • C 简介

    原文链接 https www runoob com cprogramming c intro html C 语言是一种通用的高级语言 最初是由丹尼斯 里奇在贝尔实验室为开发 UNIX 操作系统而设计的 C 语言最开始是于 1972 年在 D

随机推荐

  • 每日一问—03如何拆分指定页码pdf

    一 各页码范围合成一个整体的pdf import PyPDF2 导入PyPDF2模块 def merge pdf pages input pdf page ranges output pdf reader PyPDF2 PdfFileRea
  • 越来越智能的云,如何助力实体经济?

    2023 年腾讯全球数字生态大会即将举行 每一年的大会 腾讯都会带来新的思考和实践 今年也不例外 今年 大会的主题是 智变加速 产业焕新 意即数字经济正发生的变化 以大语言模型为代表的人工智能 正在带来全新的科技变革 如何为实体经济创造新的
  • 西门子PLC通信全解析

    前言 最近西门子PLC价格大幅上调 在工控界引起了不小的风波 不仅涨价 甚至还缺货 导致很多人不得不更改方案 听说最近已经完成了芯片替换 希望不久能够恢复供货 并把价格回调 通过这件事 从侧面可以看出 西门子在工控领域的市场占有率很大 那么
  • Oracle date(时间)类型详解

    常用日期型数据类型 TIMESTAMP类型是DATE类型的一个扩展 DATE类型会存储年月日时分秒信息 TIMESTAMP类型精度更高 会存储到微秒 纳秒 1 DATE 展示格式既可以为 YYYY MM DD 也可以为YYYY MM DD
  • 数据分析课程笔记(二)绘制散点、条形、直方图 Numpy简介

    数据分析课程笔记 绘制散点图 绘制条形图 绘制横着的条形图 例子 绘制直方图 直方图更多场景 常见问题总结 matplotlib使用流程 matplotlib更多的图形样式 更多绘图工具 numpy numpy创建数组 矩阵 numpy中常
  • Adams——SolidWorks模型导入到Adams中

    1 SOLIDWORKS模型转入ADAMS的格式及导入步骤 首先将零件图或者装配图另存为 parasolid格式 其次将保存好的 parasolid格式文件的后缀改为 xmt txt 之所以这样做可以避免模型中多个实体的重复 注意保存路径不
  • 【经验分享】让iPad或者手机作为电脑扩展屏幕使用—Splashtop Wired XDisplay(亲测有效且免费)

    最近 由于疫情的影响只能进行居家隔离办公 平时习惯使用双屏幕 在家一台笔记本操作有点不适应 由此想到拿手里的ipad实现电脑扩展屏 网上看了有很多可以实现 iPad 如何实现电脑屏幕扩展 有 Duet Display TwomonUSB s
  • typedef和#define的用法与区别

    typedef和 define的用法与区别 一 typedef的用法 在C C 语言中 typedef常用来定义一个标识符及关键字的别名 它是语言编译过程的一部分 但它并不实际分配内存空间 实例像 typedef int INT typed
  • Markdown 让你专注于写作而不是排版(极品,你学习它只需5分钟)

    http jianshu io p q81RER 献给写作者的 Markdown 新手指南 http jianshu io p qqGjLN 为什么作家应该用 Markdown 保存自己的文稿 http jianshu io users y
  • 统计学--基于R(第3版)(基于R应用的统计学丛书)作者:贾俊平 习题答案 第七章

    7 1 7 1 检验各月份的销量是否符合均匀分布 0 05 H0 符各均匀分布 H1 不符合均匀分布 load C exercise ch7 exercise7 1 RData exercise7 1 chisq test exercise
  • Android是怎么启动的-[Android取经之路]

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • c++实现时钟(图形实现)

    由于该项目是win32项目 且在VS2019上实现的 故现在简单一下在VS2019上如何创建与为win32项目相同的windows桌面向导程序 1 首先打开vs2019创建新项目 2 然后选择Windows桌面向导程序 3 然后点击下一步创
  • springboot2+alibaba sentinel的整合小坑

    pom配置
  • 【深入了解pytorch】PyTorch循环神经网络(RNN)

    深入了解pytorch PyTorch循环神经网络 RNN PyTorch循环神经网络 RNN 概念 工作原理与常见变体 循环神经网络概念和工作原理 RNN的结构 RNN的工作原理 LSTM 长短期记忆网络 LSTM的结构 LSTM的工作原
  • Windows中Splinter的安装和使用

    核心内容 1 Splinter的简介 2 Splinter的安装 3 检验Splinter是否安装成功 4 Geckodriver驱动的安装 5 Splinter的操作示例 一 Splinter的简介 Splinter是一个使用Python
  • C++学习之旅 第二章 printf与cout

    目录 1 printf简介 2 printf的四种用法 2 1 printf 字符串 2 2 printf 输出控制符 输出参数 2 3 printf 输出控制符1 输出控制符2 输出参数1 输出参数2 2 4 printf 输出控制符 非
  • 百度又发布一个神器!网友直呼好家伙

    目标检测作为计算机视觉领域的顶梁柱 不仅可以独立完成车辆 商品 缺陷检测等任务 也是人脸识别 视频分析 以图搜图等复合技术的核心模块 在自动驾驶 工业视觉 安防交通等领域的商业价值有目共睹 正因如此 YOLOv5 YOLOX PP YOLO
  • 统计相关国际期刊汇总

    统计相关国际期刊汇总 ID 期刊名 编码 大类 小类 3年平均IF 2年总被引 1 Journal of the American Statistical Association JASA 0162 1459 数学2区 top STATIS
  • Hibernate之一对多双向关联查询

    在这里模拟一个业务场景记录hibernate中一对多双向关联的配置及使用 当我们在手机上购物付款之后 是会生成订单的 一个订单中会存在着多个订单项 订单与订单项之间就存在着一对多的关系 一个订单中可以有多个订单项 而多个订单项又组成为一个订
  • speex回声消除源码解读

    一 speex回声消除aec小析 频域自适应算法采用了分块处理的思想 以减少高阶自适应滤波器的计算复杂度 多延迟自适应滤波器 MDF 则更一般可以分M块来处理 其中块的长度比自适应滤波器的阶数更小 后置滤波器系数一直在更新 单讲时前置滤波器