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实现图像几何变换
Jul 06 Python
Python下载指定页面上图片的方法
May 12 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
python万年历实现代码 含运行结果
May 20 Python
Python 元类实例解析
Apr 04 Python
python3.7 sys模块的具体使用
Jul 22 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
python实现计算器功能
Oct 31 Python
Python3开发环境搭建详细教程
Jun 18 Python
python文件读取失败怎么处理
Jun 23 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中$_SERVER的详细参数与说明
2008/07/29 PHP
解析php5配置使用pdo
2013/07/03 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
PyTorch基本数据类型(一)
2019/05/22 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
大学生就业推荐信范文
2013/11/29 职场文书
村官学习十八大感想
2014/01/15 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
销售代理协议书
2014/09/30 职场文书
怎样写离婚协议书
2015/01/26 职场文书
雷峰塔导游词
2015/02/09 职场文书
慰问信格式规范
2015/03/23 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android