代码中用到了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谱减法语音降噪实例相关推荐

  1. python音频 降噪_谱减法语音降噪的Python实现教程

    下面是谱减法语音降噪的Python实现 文件speech_enhanced.py #!/usr/bin/env python import numpy as np import wave import ...

  2. 谱减法语音降噪的Python实现

    转自:https://github.com/itaa/soja-box/tree/master/enhance_speach 谱减法语音降噪 #!/usr/bin/env python import ...

  3. [投稿]谱减法语音降噪原理

    本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.各位做视音频技术朋友如果好的原创技术文章并希望通过我的博客分享给大家,也欢迎投稿到我的邮箱:leixiaohua1020@1 ...

  4. python如何读取文件内容求和_使用python对文件中的数值进行累加的实例

    问题描述: 一个文件由若干条记录组成,记录的格式为:"num1 num2",有时候,需要统计文件中num1对应的num2的总值. 处理问题的思路 用传说中的python来处理,很方 ...

  5. Python音频信号处理 2.使用谱减法去除音频底噪

    使用谱减法去除音频底噪 上一篇文章我主要分享了短时傅立叶变换及其逆变换在python中的实现,有兴趣的可以阅读一下该篇文章,地址如下: Python音频信号处理 1.短时傅里叶变换及其逆变换 那么在本 ...

  6. python读取文件类型_python准确判断文件类型

    判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下 ...

  7. python获取文件后缀_Python使用filetype精确判断文件类型 (文件类型获取)

    filetype.py Small and dependency free Python package to infer file type and MIME type checking the m ...

  8. python跨文件全局变量_Python跨文件全局变量的实现方法示例

    前言 在C语言中,由于变量一定是先声明,后使用,所以我们可以清楚的知道,现在使用的变量是全局还是局部,比如: int a = 5; void test(void) { a = 1; // 没有先声明, ...

  9. python安装文件乱码_python输出到文件乱码如何解决

    python代码文件的编码 py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character.需要在代码 ...

最新文章

  1. oracle错误:ORA-12545
  2. MYSQL中TIMESTAMP类型的默认值
  3. 戏说 Windows GDI (2)
  4. Linux统治超级计算领域的九个理由
  5. 我可以编写一个CSS选择器来选择不具有某个类或属性的元素吗?
  6. Ubuntu中eclipse端口被占
  7. [转] Centos 6.4 python 2.6 升级到 2.7
  8. MySQL 磁盘满了,怎么办??
  9. mysql中的rman备份与恢复_使用RMAN备份与恢复数据库
  10. IBM Notes Domino V10.0.1第一组语言包发布!
  11. PPT投影仪演示设置
  12. 计算机网络16进制地址,计算机内存地址和为什么用16进制?
  13. 压缩文件不记得密码了怎么办?
  14. AFEPack 使用 Tutorial(二):解带系数二维泊松方程
  15. java连接redis存取数据(详细)
  16. 【离散数学】二元关系中的传递关系与非传递关系
  17. 敏捷型程序员_组织敏捷程序:第2部分,用于管理敏捷程序的网络
  18. Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别
  19. nexus代理阿里云仓库gradle仓库
  20. 显示购物车列表和修改商品数量

热门文章

  1. php7.2以上报错Swoole\Error: must be forked outside the coroutine的解决
  2. Linux环境下Elasticsearch6.4.3安装
  3. 基于PX4的地面无人车避障系统及路径规划研究
  4. C# 详解out输出参数
  5. 大鱼号发布文章的方法
  6. 调试stc8a8k64d4单片机485通信总结
  7. OFD专用电子发票及PDF普通电子发票-批量解析V1.5.2
  8. Elasticsearch8.x学习笔记
  9. 学术论文写作:谋篇构思
  10. SVN 常见4种 无法弹出登录窗