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实现人机对话
Nov 14 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
python八皇后问题的解决方法
Sep 27 Python
python 字符串只保留汉字的方法
Nov 16 Python
举例讲解Python常用模块
Mar 08 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
关于python中模块和重载的问题
Nov 02 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php学习之 认清变量的作用范围
2010/01/26 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
JS常用算法实现代码
2016/11/14 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
银行学习十八大感想
2014/01/11 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python