matlab - 我想给嘈杂的音频添加更多的噪声,为什么我对信噪比的计算测试不正确

标签 matlab audio signals signal-processing noise

从本质上讲,我只想录音,想降低信噪比。为简单起见,我提取了要测量信噪比的音频的特定部分,称为audio。我还从没有信号的区域中提取了一些背景噪声,称为backgroundnoise 我的数据在这里:
http://expirebox.com/download/bb9997de2dc5bae12fc7184dd2a0eb0f.html

由于这里提供了很多帮助:
Proper way to add noise to signal

我有 :

originalSNR=snr(audio-backgroundnoise,backgroundnoise) %initial calculation is 6.4762
desiredSNRindB = 5:-1:1;    %what I want to lower the snr down to
for desired_snr_db=desiredSNRindB
    est_signal= audio- backgroundnoise;

    %the original matlab equation for SNR is:
    %signalPow = rssq(x(:)).^2;
    %noisePow = rssq(y(:)).^2;
    %r = 10 * log10(signalPow / noisePow);
    %solving for noisePow we get
    rms_new = rssq(est_signal(:)).^2 / 10^(desired_snr_db / 10);

    %assuming rssq(new_noise).^2 = scale_factor * rssq(old).^2
    scale_factor = rms_new / rssq(backgroundnoise(:)).^2;

    new_noise = scale_factor * backgroundnoise;

    %add noise to our estimated signal
    new_signal = est_signal + new_noise; %you may need to do stretching
    %trimming to get the right sizes

    snr(new_signal-backgroundnoise,backgroundnoise)

end 

但问题是
  • 我的测试序列末尾与desired_snr_db
  • 不同
  • 如果desired_snr_db低,则snr升高。

  • 有人可以帮忙吗?

    最佳答案

    明显的问题是:

    scale_factor = rms_new / rssq(backgroundnoise(:)).^2;
    new_noise = scale_factor * backgroundnoise;
    

    更具体地说,第一行计算要应用于背景噪声功率的比例因子,而第二行则将其应用于背景噪声样本。要通过scale_factor缩放噪声功率,实际上您需要通过sqrt(scale_factor)缩放样本,如下所示:
    scale_factor = sqrt(rms_new / rssq(backgroundnoise(:)).^2);
    new_noise = scale_factor * backgroundnoise;
    

    您提供的数据样本的另一个问题是首先如何处理背景噪声。实际上,直接从噪声信号中减去噪声片段可能会增加噪声,除非已仔细地获得了减去的噪声估计 vector ,以便在逐个样本的基础上将其与实际噪声很好地关联起来(您的样本似乎并非如此)。减去具有类似特征(例如噪声功率)的典型噪声样本根本不足以消除噪声。

    通常,可以通过使用各种噪声消除技术之一来降低噪声。这些通常涉及使用adaptive filters或固定滤波器(不太复杂,但需要先验的信号和噪声特性知识)对噪声信号进行滤波。

    关于matlab - 我想给嘈杂的音频添加更多的噪声,为什么我对信噪比的计算测试不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230423/

    相关文章:

    linux - 传送未阻塞信号需要多长时间?

    matlab - 如何使用可变大小的原始图像 block 来训练 SVM?

    c# - 使用 NAudio 处理后播放 wav 文件

    matlab - 如何将矩阵的行绘制为图表上的点?

    c# - 读取麦克风分贝和音调/频率

    ios - iOS如何在Shared/AppGroup/xxx/Library/Sounds中播放自定义通知声音文件

    c - signal() 返回类型

    python - matplotlib 中 Matlab 的 surf(x,y,z,c) 的等价物是什么?

    ios - 单击后退按钮iOS 6时如何继续播放音频