谱减法 语音去噪

废话不多说 直接上代码,python版的

import numpy as np
import librosa
import scipy
from scipy import io


class SpecSub(object):

    def __init__(self, input_wav):

        self.data, self.fs = librosa.load(input_wav, sr=None, mono=True)
        self.noise_frame = 3  # 使用前三帧作为噪声估计
        self.frame_duration = 200/1000  # 200ms 帧长
        self.frame_length = np.int(self.fs * self.frame_duration)
        self.fft = 2048  # 2048点fft

    def main(self):
        noise_data = self.get_noise_data()

        oris = librosa.stft(self.data, n_fft=self.fft)  # Short-time Fourier transform,
        mag = np.abs(oris)  # get magnitude
        angle = np.angle(oris)  # get phase

        ns = librosa.stft(noise_data, n_fft=self.fft)
        mag_noise = np.abs(ns)
        mns = np.mean(mag_noise, axis=1)  # get mean

        sa = mag - mns.reshape((mns.shape[0], 1))  # reshape for broadcast to subtract
        sa0 = sa * np.exp(1.0j * angle)  # apply phase information
        y = librosa.istft(sa0)  # back to time domain signal

        scipy.io.wavfile.write('./output.wav', self.fs, (y * 32768).astype(np.int16))  # save signed 16-bit WAV format

    def get_noise_data(self):
        noise_data = self.data[0:self.frame_length]
        for i in range(1, self.noise_frame):
            noise_data = noise_data + self.data[i*self.frame_length:(i+1)*self.frame_length]
        noise_data = noise_data / self.noise_frame

        return noise_data


if __name__ == '__main__':

    ss = SpecSub('./1A001.wav')
    ss.main()

抄完记得点赞!!! 禁止转载

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
谱减法是一种常用的语音降噪方法,它通过对语音信号的频谱进行处理来减少噪声的影响。下面是一个使用C++实现谱减法语音去噪的示例代码: ```cpp #include <iostream> #include <cmath> // 谱减法语音去噪函数 void spectralSubtraction(double* noisySignal, double* noiseSignal, double* cleanSignal, int length, double alpha, double beta) { // 计算噪声信号的功率谱 double* noiseSpectrum = new double[length]; for (int i = 0; i < length; i++) { noiseSpectrum[i] = std::pow(noiseSignal[i], 2); } // 计算噪声信号的平均功率谱 double noisePower = 0; for (int i = 0; i < length; i++) { noisePower += noiseSpectrum[i]; } noisePower /= length; // 计算噪声信号的谱减系数 double* subtractionFactor = new double[length]; for (int i = 0; i < length; i++) { subtractionFactor[i] = std::max(1 - alpha * noisePower / noiseSpectrum[i], beta); } // 对噪声信号进行谱减 for (int i = 0; i < length; i++) { cleanSignal[i] = noisySignal[i] * subtractionFactor[i]; } delete[] noiseSpectrum; delete[] subtractionFactor; } int main() { // 假设有一个长度为length的噪声信号和一个长度为length的干净信号 int length = 100; double* noisySignal = new double[length]; double* noiseSignal = new double[length]; double* cleanSignal = new double[length]; // 假设将噪声信号和干净信号的数据填充到数组中 // 设置谱减法参数 double alpha = 2.0; double beta = 0.1; // 进行谱减法语音去噪 spectralSubtraction(noisySignal, noiseSignal, cleanSignal, length, alpha, beta); // 输出去噪后的干净信号 delete[] noisySignal; delete[] noiseSignal; delete[] cleanSignal; return 0; } ``` 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值