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的Django框架中simple-todo工具的简单使用
May 30 Python
python 捕获shell脚本的输出结果实例
Jan 04 Python
利用python写个下载teahour音频的小脚本
May 08 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
Pandas读取并修改excel的示例代码
Feb 17 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
python实现猜数字游戏
Mar 25 Python
Python的几种主动结束程序方式
Nov 22 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
基于jquery的动态创建表格的插件
2011/04/05 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
Vue组件tree实现树形菜单
2017/04/13 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
python图像处理之反色实现方法
2015/05/30 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python清理子进程机制剖析
2017/11/23 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python中自带的三个装饰器的实现
2019/11/08 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
药学专业大专生的自我评价
2013/12/12 职场文书
给女朋友的道歉信
2014/01/10 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
走群众路线剖析材料
2014/10/09 职场文书
暑期社会实践证明书
2014/11/17 职场文书
后备干部推荐材料
2014/12/24 职场文书
公司年夜饭通知
2015/04/25 职场文书
小学生家长意见
2015/06/03 职场文书
出生证明范本
2015/06/15 职场文书
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript