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函数式编程指南(二):从函数开始
Jun 24 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
python 垃圾收集机制的实例详解
Aug 20 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
python实现图书借阅系统
Feb 20 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
python 使用shutil复制图片的例子
Dec 13 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
python读取mat文件生成h5文件的实现
Jul 15 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堆排序(heapsort)练习
2013/11/13 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP学习笔记之session
2018/05/06 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
在Python中使用模块的教程
2015/04/27 Python
python入门教程之识别验证码
2017/03/04 Python
Python探索之pLSA实现代码
2017/10/25 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Pycharm调试程序技巧小结
2020/08/08 Python
详解Python高阶函数
2020/08/15 Python
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
PHP如何自定义函数
2016/09/16 面试题
如何写好优秀的创业计划书
2014/01/30 职场文书
五一劳动节活动记录
2014/03/23 职场文书
2014年度考核工作总结
2014/12/24 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
Django与数据库交互的实现
2021/06/03 Python