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 02 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
EM算法的python实现的方法步骤
Jan 02 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
浅谈Python项目的服务器部署
Apr 25 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
python中tkinter复选框使用操作
Nov 11 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获取网站域名和地址的代码
2008/08/17 PHP
php缓冲输出实例分析
2015/01/05 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python模块搜索路径代码详解
2018/01/29 Python
pandas string转dataframe的方法
2018/04/11 Python
Python中return self的用法详解
2018/07/27 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
爱心捐款倡议书
2014/04/14 职场文书
求职信名称怎么写
2014/05/26 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
生产实习心得体会范文
2016/01/22 职场文书
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
mysql序号rownum行号实现方式
2022/12/24 MySQL