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 01 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Python Logging 日志记录入门学习
Jun 02 Python
python实现搜索文本文件内容脚本
Jun 22 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
python实现简单银行管理系统
Oct 25 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
Python通过文本和图片生成词云图
May 21 Python
用python-webdriver实现自动填表的示例代码
Jan 13 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php目录操作实例代码
2014/02/21 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
python实现超市商品销售管理系统
2019/10/25 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
党员先锋岗事迹材料
2014/05/08 职场文书
教育见习报告范文
2014/11/03 职场文书
见习报告格式范文
2014/11/08 职场文书
英语辞职信怎么写
2015/02/28 职场文书
消夏晚会主持词
2015/06/30 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS