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之Python文档
Oct 10 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python中按值来获取指定的键
Mar 04 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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实现链式操作的核心思想
2015/06/23 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
Python 文件操作实现代码
2009/10/07 Python
python实现中文转换url编码的方法
2016/06/14 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
jupyter实现重新加载模块
2020/04/16 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
python字符串的index和find的区别详解
2020/06/20 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
中学生自我鉴定
2014/02/04 职场文书
解除租房协议书
2014/12/03 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
获奖感言一句话
2015/07/31 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang