从本质上讲,我只想录音,想降低信噪比。为简单起见,我提取了要测量信噪比的音频的特定部分,称为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/