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-基础-入门 简介
Aug 09 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Python元组常见操作示例
Feb 19 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
Python中turtle库的使用实例
Sep 09 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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无限遍历文件夹示例分享
2014/03/04 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
jQuery 动画基础教程
2008/12/25 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
python之mock模块基本使用方法详解
2019/06/27 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
美国五金商店:Ace Hardware
2018/03/27 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
团队精神演讲稿
2013/12/31 职场文书
干部培训自我鉴定
2014/01/22 职场文书
消防安全员岗位职责
2014/03/10 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
MySQL Server 层四个日志
2022/03/31 MySQL