Python谱减法语音降噪实例


Posted in Python onDecember 18, 2019

代码中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次幂。

#!/usr/bin/env python
import numpy as np
import wave
import nextpow2
import math
 
 
# 打开WAV文档
f = wave.open("filename.wav")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
fs = framerate
# 读取波形数据
str_data = f.readframes(nframes)
f.close()
# 将波形数据转换为数组
x = np.fromstring(str_data, dtype=np.short)
# 计算参数
len_ = 20 * fs // 1000
PERC = 50
len1 = len_ * PERC // 100
len2 = len_ - len1
# 设置默认参数
Thres = 3
Expnt = 2.0
beta = 0.002
G = 0.9
# 初始化汉明窗
win = np.hamming(len_)
# normalization gain for overlap+add with 50% overlap
winGain = len2 / sum(win)
 
 
# Noise magnitude calculations - assuming that the first 5 frames is noise/silence
nFFT = 2 * 2 ** (nextpow2.nextpow2(len_))
noise_mean = np.zeros(nFFT)
 
 
j = 0
for k in range(1, 6):
  noise_mean = noise_mean + abs(np.fft.fft(win * x[j:j + len_], nFFT))
  j = j + len_
noise_mu = noise_mean / 5
 
 
# --- allocate memory and initialize various variables
k = 1
img = 1j
x_old = np.zeros(len1)
Nframes = len(x) // len2 - 1
xfinal = np.zeros(Nframes * len2)
 
 
# =========================  Start Processing  ===============================
for n in range(0, Nframes):
  # Windowing
  insign = win * x[k-1:k + len_ - 1]
  # compute fourier transform of a frame
  spec = np.fft.fft(insign, nFFT)
  # compute the magnitude
  sig = abs(spec)
 
 
  # save the noisy phase information
  theta = np.angle(spec)
  SNRseg = 10 * np.log10(np.linalg.norm(sig, 2) ** 2 / np.linalg.norm(noise_mu, 2) ** 2)
 
 
 
 
  def berouti(SNR):
    if -5.0 <= SNR <= 20.0:
      a = 4 - SNR * 3 / 20
    else:
      if SNR < -5.0:
        a = 5
      if SNR > 20:
        a = 1
    return a
 
 
 
 
  def berouti1(SNR):
    if -5.0 <= SNR <= 20.0:
      a = 3 - SNR * 2 / 20
    else:
      if SNR < -5.0:
        a = 4
      if SNR > 20:
        a = 1
    return a
 
 
  if Expnt == 1.0: # 幅度谱
    alpha = berouti1(SNRseg)
  else: # 功率谱
    alpha = berouti(SNRseg)
  #############
  sub_speech = sig ** Expnt - alpha * noise_mu ** Expnt;
  # 当纯净信号小于噪声信号的功率时
  diffw = sub_speech - beta * noise_mu ** Expnt
  # beta negative components
 
 
  def find_index(x_list):
    index_list = []
    for i in range(len(x_list)):
      if x_list[i] < 0:
        index_list.append(i)
    return index_list
 
 
  z = find_index(diffw)
  if len(z) > 0:
    # 用估计出来的噪声信号表示下限值
    sub_speech[z] = beta * noise_mu[z] ** Expnt
    # --- implement a simple VAD detector --------------
    if SNRseg < Thres: # Update noise spectrum
      noise_temp = G * noise_mu ** Expnt + (1 - G) * sig ** Expnt # 平滑处理噪声功率谱
      noise_mu = noise_temp ** (1 / Expnt) # 新的噪声幅度谱
    # flipud函数实现矩阵的上下翻转,是以矩阵的“水平中线”为对称轴
    # 交换上下对称元素
    sub_speech[nFFT // 2 + 1:nFFT] = np.flipud(sub_speech[1:nFFT // 2])
    x_phase = (sub_speech ** (1 / Expnt)) * (np.array([math.cos(x) for x in theta]) + img * (np.array([math.sin(x) for x in theta])))
    # take the IFFT
 
 
    xi = np.fft.ifft(x_phase).real
    # --- Overlap and add ---------------
    xfinal[k-1:k + len2 - 1] = x_old + xi[0:len1]
    x_old = xi[0 + len1:len_]
    k = k + len2
# 保存文件
wf = wave.open('outfile.wav', 'wb')
# 设置参数
wf.setparams(params)
# 设置波形文件 .tostring()将array转换为data
wave_data = (winGain * xfinal).astype(np.short)
wf.writeframes(wave_data.tostring())
wf.close()

以上这篇Python谱减法语音降噪实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中max函数用法实例分析
Jul 17 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
Python变量类型知识点总结
Feb 18 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python 字典操作提取key,value的方法
Jun 26 Python
Python 音频生成器的实现示例
Dec 24 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
Python进行统计建模
Aug 10 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
Python运算符+与+=的方法实例
Feb 18 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 #Python
使用python 对验证码图片进行降噪处理
Dec 18 #Python
如何使用Python多线程测试并发漏洞
Dec 18 #Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 #Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 #Python
Django中使用MySQL5.5的教程
Dec 18 #Python
Python hashlib加密模块常用方法解析
Dec 18 #Python
You might like
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
如何使用php实现评委评分器
2015/07/31 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
单链表反转python实现代码示例
2018/02/08 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python调用C语言的实现
2019/07/26 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python3跳出一个循环的实例操作
2020/08/18 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
称象教学反思
2014/02/03 职场文书
文案策划求职信
2014/04/14 职场文书
小学二年级评语
2014/04/21 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
zabbix配置nginx监控的实现
2022/05/25 Servers