前言

DTLN是一种能够实时处理的语音降噪算法,其开源代码在这里,论文在这里

DTLN的结构如上图,其结构分为两个部分。第一部分(上图左边)是在stft得到的频谱上进行降噪处理,属于频域处理。第二部分(上图右边)是在1D卷积得到的特征上进行进一步降噪处理,也属于频域处理。

其网络结构部分的源码如下。两个1D卷积已用红框标出。

可以注意到,两个1D卷积的参数如下:

  • 第一个1D卷积,输入维度为11512(32ms),卷积核的大小为1*1、个数为encoder_size=256,步长为1,无bias。

  • 第二个1D卷积,输入维度为11256,卷积核的大小为1*1、个数为blocklen=512,步长为1,无bias。

怎么理解DTLN的第二部分呢

  1. 第一部分进行降噪处理后,将处理过后的频谱进行傅里叶反变换,得到了长度为512(32ms)的时域信息。

  2. 第二部分的第一个1D卷积对长度为512(32ms)的时域信息进行卷积,又得到了256维的频域信息。该操作与stft类似,都是512/2(但是没+1),不同的是stft的到的频点是平均分布的,而1D卷积得到的频点分布是网络学习出来的(可能有的地方频点分布疏,有的地方频点分布密)。网络学习得到的频点分布 (应该) 更能适应不同的任务。

  3. 对1D卷积得到的频域信息进行归一化以后过一遍LTSM+FC+Sigmoid,得到相对于1D卷积学习到的频点分布的mask(频带增益)。

  4. 将学习得到的mask与之前1D卷积得到的频域信息相乘,得到降噪处理之后的频域信息。

  5. 对降噪处理之后的频域信息进行第二次1D卷积,将256维的频域信息转换回长度为512(32ms)的时域信息,相当于ifft。

  6. 对转换回来的长度为512(32ms)的时域信息与前一帧的信息进行overlap-add,最后得到降噪后的声音。

对1D卷积的具体理解

encoded_frames = Conv1D(self.encoder_size,1,strides=1,use_bias=False)(estimated_frames_1)

拿第一个1D卷积举例。卷积核的数量是encoder_size=256,卷积核大小是11,步长是1。其输入是11512的时域信息,输出是11*256的频域信息。

与二维卷积的计算方法相同,其参数量为

(kernel_width * kernel_height * input_channels + bias_num) * output_channels

将时域信息的512个采样点理解为通道数,则卷积的参数量为(11512+0)*256。矩阵乘法如下图。

其中Xn为时域信息的第n个采样点,Wn,c为第c个卷积核(也就是频点)在第n个采样点上的权重。矩阵相乘时,X行向量与W矩阵的第c列进行相乘相加,得到的就是在第c个频点上的能量值。因此W矩阵的c个列就代表c个采样点,刚好与512个采样点的一半所对应。

1D卷积相较于STFT的优缺点

优点

相较于STFT的平均分布频点,1D卷积可以通过网络学习到更合适的频点分布。

缺点(不太确定)

1D卷积的计算量比STFT高。

1D卷积的计算量为:

kernel_width * kernel_height * input_channels * output_width * output_height * output_channels

在本案例中即为:1151211*256 = 131072

参考这篇博客,在窗宽度为512上进行fft的计算量为:(np.log2(512)512/2+np.log2(512)512)*9 = 62208

可以看到stft的计算量比1D卷积小。

参考文献

语音分离技术博客

TASNET

Conv-TasNet

【KAWAKO】DTLN-1Dconv的原理的更多相关文章

  1. 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  4. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  5. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  6. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  7. python自动化测试(2)-自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1   概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...

  8. CRC、反码求和校验 原理分析

    3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...

  9. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  10. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

随机推荐

  1. X活手环的表盘自定义修改

    文章用到的所有工具及软件成品 前言 前几天我在某宝买了一个智能手环,无奈软件中的表盘太少,所有我想着修改一下app中的资源文件. 反编译APK 这里反编译APK用apktool工具就可以. apkto ...

  2. uni 结合vuex 编写动态全局配置变量 this.baseurl

    在日常开发过程,相信大家有遇到过各种需求,而我,在这段事件便遇到了一个,需要通过用户界面配置动态接口,同时,因为是app小程序开发,所以接口中涉及到了http以及websocket两个类型的接口. 同 ...

  3. 【每日一题】【DFS&每个点都调用一次前后左右】由1连接的岛屿数量-211031/220216

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网格的四条边 ...

  4. feDisplacementMap滤镜实现水波纹效果,计算动态值。

    参考资料 https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/ 该文章已经讲的特别 ...

  5. Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架(2)

    Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架 注:本文更多地是带着如何去思考答案,而不是纯粹的放一个答案上来,如果你需要直接看到完整的答案,请直接看实例和最后的 ...

  6. HMS Core 3D流体仿真技术,打造移动端PC级流体动效

    移动设备硬件的高速发展,让游戏行业发生翻天覆地的变化,许多酷炫的游戏效果不再局限于电脑端,玩家在移动端就能享受到场景更逼真.画质更清晰.体验更流畅的游戏服务.但由于移动设备算力不足,为了实现真实感的水 ...

  7. 【进阶篇】Redis实战之Jedis使用技巧详解

    一.摘要 在上一篇文章中,我们详细的介绍了 redis 的安装和常见的操作命令,以及可视化工具的介绍. 刚知道服务端的操作知识,还是远远不够的,如果想要真正在项目中得到应用,我们还需要一个 redis ...

  8. [OpenCV实战]27 在OpenCV下使用forEach进行并行像素访问

    目录 1 Mat像素访问 1.1 使用at方法直接进行像素访问 1.2 使用指针进行像素访问 1.3 使用forEach方法进行像素访问 1.4 将forEach与C ++ 11 Lambda一起使用 ...

  9. Java学习笔记:2021年12月31日下午-2022年1月1日上午

    Java学习笔记:2021年12月31日下午-2022年1月1日上午 摘要:主要记录了计算机的电气构成,学习Linux系统的原因以及关于Linux以及相关操作的基础知识. 目录 Java学习笔记:20 ...

  10. SEO关键词布局方法

    关键词在<title>标签. description属性. keywords属性中是如何布局的. 1.<title>标签中布局关键词 <title>标签是用来定义网 ...