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连接oracle数据库实例
Oct 17 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
python和shell获取文本内容的方法
Jun 05 Python
详解python中的time和datetime的常用方法
Jul 08 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
vue常用指令代码实例总结
Mar 16 Python
Python openpyxl 插入折线图实例
Apr 17 Python
利用python汇总统计多张Excel
Sep 22 Python
python实现商品进销存管理系统
May 30 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP实现打包zip并下载功能
2018/06/12 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
js的2种继承方式详解
2014/03/04 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
js获取页面description的方法
2015/05/21 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
python删除过期log文件操作实例解析
2018/01/31 Python
pyshp创建shp点文件的方法
2018/12/31 Python
用Python解决x的n次方问题
2019/02/08 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
配件采购员岗位职责
2013/12/03 职场文书
三年级语文教学反思
2014/02/01 职场文书
热门专业求职信
2014/05/24 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
信用卡催款律师函
2015/05/27 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js