python实现Logmmse声音降噪算法

python实现Logmmse声音降噪算法

1.所需环境

pip install logmmse
pip install wave
pip install numpy

2.具体代码

import logmmse
import wave
import numpy as np

if __name__ == '__main__':
    # out = logmmse.logmmse_from_file('test.wav')
    # print(out)

    # 读取音频
    path = 'test.wav'
    f = wave.open(path, "r")
    params = f.getparams()
    nchannels, sampwidth, framerate, nframes = params[:4]
    print("nchannels:", nchannels, "sampwidth:", sampwidth, "framerate:", framerate, "nframes:", nframes)
    data = f.readframes(nframes)
    f.close()
    data = np.fromstring(data, dtype=np.short)

    # 降噪
    data = logmmse.logmmse(data=data, sampling_rate=framerate)


    # 保存音频
    file_save = 'process.wav'
    nframes = len(data)
    f = wave.open(file_save, 'w')
    f.setparams((1, 2, framerate, nframes, 'NONE', 'NONE'))  # 声道,字节数,采样频率,*,*
    # print(data)
    f.writeframes(data)  # outData
    f.close()

3.实现效果
降噪前
在这里插入图片描述
降噪后
在这里插入图片描述

4.相关资料
https://github.com/rajivpoddar/logmmse

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是logmmse算法Python实现: ```python import numpy as np from scipy.fftpack import fft, ifft def logmmse(x, noise_frames=6, noise_mu=0.98, len_fft=512, len_frame=256): """ Log MMSE Speech Enhancement. :param x: noisy speech signal :param noise_frames: number of frames to use in noise estimation :param noise_mu: noise updating factor :param len_fft: FFT size :param len_frame: frame length :return: enhanced speech signal """ frames = np.arange(len_frame, len(x), len_frame, dtype=np.int32) num_frames = len(frames) x_frames = np.zeros((num_frames, len_frame)) for i in range(num_frames): x_frames[i] = x[frames[i] - len_frame:frames[i]] noise_frames = min(noise_frames, num_frames) noise_frames = np.arange(noise_frames, dtype=np.int32) noise_frames = noise_frames[noise_frames < num_frames] noise = np.mean(np.abs(fft(x_frames[noise_frames])), axis=0) alpha = noise_mu gamma = 0.1 ksi_min = 10 ** (-25 / 10) x_final = np.zeros_like(x) phase_old = np.zeros(len_fft // 2 + 1) for idx in range(num_frames): x_frame = x_frames[idx] X = fft(x_frame, len_fft) X_mag = np.abs(X[: len_fft // 2 + 1]) X_phase = np.angle(X[: len_fft // 2 + 1]) gamma_k = pow(X_mag / noise, 2) gamma_k[gamma_k < gamma] = gamma ksi = alpha * ksi_min + (1 - alpha) * np.maximum(gamma_k - 1, 0) log_sigma_k = np.sqrt(ksi) - np.sqrt(ksi + X_mag) log_sigma_k[X_mag < ksi_min] = np.sqrt(ksi_min) Y = ksi / (ksi + X_mag) * X y = np.real(ifft(Y)) y[0] = y[0] * 2 phase = X_phase + np.random.randn(len(X_phase)) * np.sqrt(np.maximum(log_sigma_k, 0)) X_final = np.exp(1j * phase) * Y x_final_frame = np.real(ifft(X_final)) x_final[frames[idx] - len_frame:frames[idx]] += x_final_frame * 0.5 phase_old = phase return x_final ``` 该函数接受以下参数: - `x`: 带噪的语音信号 - `noise_frames`: 用于噪声估计的帧数 - `noise_mu`: 噪声更新因子 - `len_fft`: FFT大小 - `len_frame`: 帧长 输出是增强后的语音信号。 该函数首先将输入语音信号分帧,然后使用前几帧估计噪声。使用这些噪声估计值和给定的噪声更新因子,计算每个帧的噪声功率谱估计值。然后使用Log MMSE算法增强每个帧,并将增强的帧合并回完整的语音信号中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值