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中for循环和while循环的基本使用方法
Aug 21 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Python基于time模块表示时间常用方法
Jun 18 Python
python定时截屏实现
Nov 02 Python
Django自定义YamlField实现过程解析
Nov 11 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
Python如何加载模型并查看网络
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错误日志 display_errors与log_errors的区别
2012/10/09 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
php获取淘宝分类id示例
2014/01/16 PHP
jquery 指南/入门基础
2007/11/30 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
python 一个figure上显示多个图像的实例
2019/07/08 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python实现微信打飞机游戏
2020/03/24 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
python如何实现递归转非递归
2021/02/25 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
网络技术专业求职信
2014/02/18 职场文书
售后求职信范文
2014/03/15 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python