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中的Null模式与桥接模式编程
Feb 02 Python
python制作小说爬虫实录
Aug 14 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
python简易远程控制单线程版
Jun 20 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
python处理excel绘制雷达图
Oct 18 Python
编写python代码实现简单抽奖器
Oct 20 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
python 遍历磁盘目录的三种方法
Apr 02 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实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
php 猴子摘桃的算法
2017/06/20 PHP
php中yii框架实例用法
2020/12/22 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
javascript 自动转到命名锚记
2009/01/10 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
用Python创建声明性迷你语言的教程
2015/04/13 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
创建青年文明号材料
2014/05/09 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
停电调休通知
2015/04/16 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书