Python环境下基于自适应滤波器的音频信号(wav格式)降噪方法

news2024/11/28 20:55:50

Python的集成环境我一般使用的是WinpythonWinpytho脱胎于pythonxy,面向科学计算兼顾数据分析与挖掘;Anaconda主要面向数据分析与挖掘方面,在大数据处理方面有自己特色的一些包;Winpytho强调便携性,被做成绿色软件,不写入注册表,安装其实就是解压到某个文件夹,移动文件夹甚至放到U盘里在其他电脑上也能用。抛开软件包的差异,我个人也推荐初学者用winpython,正因为其简单,问题也少点,由于便携性的特点系统坏了,重装后也能直接用。

请直接安装、使用winPython:
https://sourceforge.net/projects/winpython/因为很多模块以及集成的模块

IDE我用的spyder(类MATLAB界面)

所用模块如下:

import numpy as np
import librosa
import soundfile as sf
import pyroomacoustics as pra

需要按照librosa和pyroomacoustics模块

pip install librosa
pip install pyroomacoustics

主要方法如下:

时域自适应滤波器Time Domain Adaptive Filters

- Least Mean Squares Filter (LMS)

- Block Least Mean Squares Filter (BLMS)

- Normalized Least Mean Squares Filter (NLMS)

- Block Normalized Least Mean Squares Filter (BNLMS)

- Recursive Least Squares Filter (RLS)

- Affine Projection Algorithm (APA)

- Kalman Filter (KALMAN)

非线性自适应滤波器Nonlinear Adaptive Filters

- Second Order Volterra Filter (SVF)

- Trigonometric Functional Link Adaptive Filter (FLAF)

- Adaptive Exponential Functional Link Adaptive Filter (AEFLAF)

- Split Funcional Link Adaptive Filter (SFLAF)

- Collaborative Functional Link Adaptive Filter (CFLAF)

频域自适应滤波器Frequency Domain Adaptive Filters

- Frequency Domain Adaptive Filter (FDAF)

- Partitioned-Block-Based Frequency Domain Adaptive Filter (PFDAF)

- Frequency Domain Kalman Filter (FDKF)

- Partitioned-Block-Based Frequency Domain Kalman Filter (PFDKF)

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

程序部分代码如下:

import numpy as np
import librosa
#pip install librosa
#pip install pyroomacoustics
import soundfile as sf
import pyroomacoustics as pra

from time_domain_adaptive_filters.lms import lms
from time_domain_adaptive_filters.nlms import nlms
from time_domain_adaptive_filters.blms import blms
from time_domain_adaptive_filters.bnlms import bnlms
from time_domain_adaptive_filters.rls import rls
from time_domain_adaptive_filters.apa import apa
from time_domain_adaptive_filters.kalman import kalman
from frequency_domain_adaptive_filters.pfdaf import pfdaf
from frequency_domain_adaptive_filters.fdaf import fdaf
from frequency_domain_adaptive_filters.fdkf import fdkf
from frequency_domain_adaptive_filters.pfdkf import pfdkf
from nonlinear_adaptive_filters.volterra import svf
from nonlinear_adaptive_filters.flaf import flaf
from nonlinear_adaptive_filters.aeflaf import aeflaf
from nonlinear_adaptive_filters.sflaf import sflaf
from nonlinear_adaptive_filters.cflaf import cflaf


def main():
  x, sr  = librosa.load('samples/female.wav',sr=8000)
  d, sr  = librosa.load('samples/male.wav',sr=8000)

  rt60_tgt = 0.08
  room_dim = [2, 2, 2]

  e_absorption, max_order = pra.inverse_sabine(rt60_tgt, room_dim)
  room = pra.ShoeBox(room_dim, fs=sr, materials=pra.Material(e_absorption), max_order=max_order)
  room.add_source([1.5, 1.5, 1.5])
  room.add_microphone([0.1, 0.5, 0.1])
  room.compute_rir()
  rir = room.rir[0][0]
  rir = rir[np.argmax(rir):]

  y = np.convolve(x,rir)
  scale = np.sqrt(np.mean(x**2)) /  np.sqrt(np.mean(y**2))
  y = y*scale

  L = max(len(y),len(d))
  y = np.pad(y,[0,L-len(y)])
  d = np.pad(d,[L-len(d),0])
  x = np.pad(x,[0,L-len(x)])
  d = d + y

  sf.write('samples/x.wav', x, sr, subtype='PCM_16')
  sf.write('samples/d.wav', d, sr, subtype='PCM_16')

  print("processing time domain adaptive filters.")

  e = lms(x, d, N=256, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/lms.wav', e, sr, subtype='PCM_16')

  e = blms(x, d, N=256, L=4, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/blms.wav', e, sr, subtype='PCM_16')
  
  e = nlms(x, d, N=256, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/nlms.wav', e, sr, subtype='PCM_16')

  e = bnlms(x, d, N=256, L=4, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/bnlms.wav', e, sr, subtype='PCM_16')

  e = rls(x, d, N=256)
  e = np.clip(e,-1,1)
  sf.write('samples/rls.wav', e, sr, subtype='PCM_16')

  e = apa(x, d, N=256, P=5, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/apa.wav', e, sr, subtype='PCM_16')

  e = kalman(x, d, N=256)
  e = np.clip(e,-1,1)
  sf.write('samples/kalman.wav', e, sr, subtype='PCM_16')

  print("processing nonlinear adaptive filters.")

  e = svf(x, d, M=256, mu1=0.1, mu2=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/volterra.wav', e, sr, subtype='PCM_16')
  
  e = flaf(x, d, M=256, P=5, mu=0.2)
  e = np.clip(e,-1,1)
  sf.write('samples/flaf.wav', e, sr, subtype='PCM_16')

  e = aeflaf(x, d, M=256, P=5, mu=0.05, mu_a=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/aeflaf.wav', e, sr, subtype='PCM_16')
  
  e = sflaf(x, d, M=256, P=5, mu_L=0.2, mu_FL=0.5)
  e = np.clip(e,-1,1)
  sf.write('samples/sflaf.wav', e, sr, subtype='PCM_16')

  e = cflaf(x, d, M=256, P=5, mu_L=0.2, mu_FL=0.5, mu_a=0.5)
  e = np.clip(e,-1,1)
  sf.write('samples/cflaf.wav', e, sr, subtype='PCM_16')

  print("processing frequency domain adaptive filters.")

  e = fdaf(x, d, M=256, mu=0.1)
  e = np.clip(e,-1,1)
  sf.write('samples/fdaf.wav', e, sr, subtype='PCM_16')

  e = fdkf(x, d, M=256)
  e = np.clip(e,-1,1)
  sf.write('samples/fdkf.wav', e, sr, subtype='PCM_16')

  e = pfdaf(x, d, N=8, M=64, mu=0.1, partial_constrain=True)
  e = np.clip(e,-1,1)
  sf.write('samples/pfdaf.wav', e, sr, subtype='PCM_16')

  e = pfdkf(x, d, N=8, M=64, partial_constrain=True)
  e = np.clip(e,-1,1)
  sf.write('samples/pfdkf.wav', e, sr, subtype='PCM_16')


if __name__ == '__main__':
  main()
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Tkinter Grid布局管理器用法

很多时候 Tkinter 界面编程都会优先考虑使用 Pack 布局,但实际上 Tkinter 后来引入的 Grid 布局不仅简单易用,而且管理组件也非常方便。 Grid 把组件空间分解成一个网格进行维护,即按照行、列的方式排列组件,组件位置由其所在的行…

MySQL、Oracle 生成随机ID、随机数、随机字符串

目录 1 MySQL 生成随机ID1.1 生成 唯一的随机ID:UUID()1.2 生成随机数:RAND()1.2.1 RAND():返回一个介于0和1之间的随机浮点数1.2.2 FLOOR(RAND() * 100):返回一个介于0和99之间的随机整数1.2.3 LPAD(FLOOR(RAND() * 99999999), 8…

行为型设计模式——中介者模式

中介者模式 中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛,博主也只写出两道题(前两道, hhh菜鸡勿喷),第三道涉及位运算 ,数位dp,第四道涉及KMP。 下…

c语言[]优先级大于*优先级

本博文源于笔者正在学习的c语言[]优先级大于*优先级.在定义二维数组时&#xff0c;a1与[]号结合后&#xff0c;谁的优先级更高&#xff0c;是本博文探讨的话题 博文来源 想要看看*与[]谁的优先级更高 博文代码 #include<stdio.h> #include<stdlib.h> int main(…

OAuth 2.0 - 微信登录

一、概述 1、什么是OAuth 2.0 OAuth (Open Authorization) 是一个关于授权 (athorization) 的开放网络标准。 允许用户授权第三应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方。OAuth在全世界得到广泛应用&#xff0c;目前的版本…

R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_orig_ext (data, rank, temporal_extent…

核对表:基本数据类型CHECKLIST:Fundmental Data

核对表&#xff1a;基本数据类型CHECKLIST:Fundmental Data 数值概论 代码中避免使用神秘数值吗&#xff1f; 代码考虑了除零错误吗&#xff1f; 类型转换很明显吗&#xff1f; 如果在一条语句中存在两个不同类型的变量&#xff0c;那么这条语句会像你期望的那样求值吗&#x…

JMeter 相关的面试题

1、什么是 JMeter&#xff1f; 它是一个开源的负载和性能测试工具&#xff0c;用于对软件、Web应用程序、API、数据库等进行压力测试。 2、JMeter 的优势是什么&#xff1f; JMeter具有以下优势&#xff1a; 开源免费&#xff1a;JMeter是开源工具&#xff0c;无需付费使用。…

使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索

2023 年是检索增强生成 (RAG) 的一年&#xff0c;人们探索了许多用例&#xff0c;并使用该技术开发了数百种产品。 从 Q/A 聊天机器人到基于上下文的代理&#xff0c;RAG 的使用一直是 LLM 申请快速增长的主要因素。 支持不断发展的社区以及 Langchain 和 LlamaIndex 等强大框架…

vue-cli解决跨域

在vue.config.js中 找到devServer 在devServer中创建proxy代理 proxy:{ path&#xff08;路径中包含这个path就会导航到target的目标接口&#xff09;&#xff1a;{ target:"目标接口" } } 例&#xff1a; 1 同源策略只针对于浏览器&#xff0c;代理服务器到后端接…

如何选择适合的乔拓云小程序付费服务

在数字化时代&#xff0c;微信小程序已经成为商家与客户互动的重要平台。乔拓云小程序作为一款便捷的微信小程序&#xff0c;不仅提供免费的基本功能&#xff0c;还为商家提供了多种付费增值服务和广告投放选择&#xff0c;以满足不同需求。本文将为您揭秘乔拓云小程序的费用明…

SpringBoot多环境配置与添加logback日志

1、多环境配置 一个项目会有多个运行环境 所以SpringBoot提供了可以适应多个环境的配置文件 每个文件对应一个端口号 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-prod.yml 生产环境 端口8092 在application中选择使用哪个…

中国社会科学院与新加坡社科院大学联合培养博士——如何就读在职博士

说到了在职博士&#xff0c;可能会大家就会觉得这不就是字面意思嘛&#xff1f;还用什么懂不懂的&#xff0c;在职博士的意思不就是&#xff0c;在职就是上班&#xff0c;博士就是博士&#xff0c;意思就是上班读的博士&#xff0c;当然是对的啊&#xff0c;但是知道字面意思之…

如何成为一个有趣的程序员

要成为一个有趣的程序员&#xff0c;你可以从以下几个方面着手&#xff1a; 专业技能与独特视角&#xff1a; 深入掌握至少一种编程语言&#xff0c;并了解其背后的原理和应用场景。不断学习新的编程技术、框架或工具&#xff0c;并尝试将其应用于实际项目中&#xff0c;展示你…

【基础数据结构】二叉树的基本性质

例题1 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&#xf…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

计算机组成原理-程序中断方式完整流程

文章目录 程序中断方式完整流程例题小结 程序中断方式完整流程 首先CPU通过执行IO指令来启动外部设备&#xff0c;此时外部设备可以开始做准备工作了&#xff08;准备CPU想要的数据或者信息&#xff09;&#xff0c;在外部设备准备过程中&#xff0c;CPU可以继续执行原程序的内…

C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

入门知识已经梳理完毕了&#xff0c;接下来就进入到面型对象的部分学习了 文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的结构3.2类的两种定义方式3.2.1声明和定义全部放在类体中3.2.2声明和定义分开 3.3成员变量命名规则的建议 4.类的访问限定符及封装4.1…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…