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之总结参数的传递
Oct 10 Python
遍历python字典几种方法总结(推荐)
Sep 11 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
pycharm中显示CSS提示的知识点总结
Jul 29 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
python 实现dict转json并保存文件
Dec 05 Python
基于python调用psutil模块过程解析
Dec 20 Python
基于python 取余问题(%)详解
Jun 03 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
Python利用capstone实现反汇编
Apr 06 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实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
JavaScript实现多栏目切换效果
2016/12/12 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python实现截屏的函数
2015/07/25 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
荷兰家电销售网站:Welhof
2020/12/08 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
经济系大学生求职信
2013/10/01 职场文书
工地资料员岗位职责
2013/12/31 职场文书
个人评价范文分享
2014/01/11 职场文书
银行授权委托书样本
2014/10/13 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
防止web项目中的SQL注入
2021/12/06 MySQL
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android