作为答案发布的 SNR 计算方法在 matlab 中实现
德夫回答的实施:
% the starting and ending point of speech in samples obtain through Audacity;
% select a portion of the waveform where speech is seen to be present
begin_speech = 25400; end_speech = 26800;
snr_before = mean( data_s(begin_speech:end_speech) .^2) / mean( data_n(begin_speech:end_speech) .^2);
db_snr_before = 10*log10( snr_before ); % same thing, but in dB
% calculation on data after noise reduction follows:
residual_noise = data_s(begin_speech:end_speech) - output(begin_speech:end_speech);
snr_after = mean( data_s(begin_speech:end_speech) .^ 2)/mean( residual_noise .^ 2);
db_snr_after = 10*log10( snr_after );
结果是
db_snr_before = 15.6853
db_snr_after = -22.0388
dspGuru 答案的实现:
begin_speech = 25400; end_speech = 26800;
% before noise reduction
DB1 = 10*log10( var(data_n(begin_speech:end_speech)));
DB2 = 10*log10( var(data_s(begin_speech:end_speech)));
db_SNR_before = DB2 - DB1;
% after noise reduction
[data_stnr, fs_stnr, nbits_stnr] = wavread('AdMStry_thru_nr.wav');
Z = output(begin_speech:end_speech) - data_stnr(begin_speech:end_speech);
db_residual_noise = 10*log10( var(Z) );
db_speech = 10*log10( var(data_stnr(begin_speech:end_speech)));
db_SNR_after = db_speech - db_residual_noise;
结果是:
db_SNR_before = 15.6848
db_SNR_after = 0.9252
begin_speech 和 end_speech 代表 wavfile 的那些部分,以样本数表示,其中存在确定的语音(通过直接观察波形通过大胆获得)
为什么经过降噪后信噪比变小了?
在第二种方法(dspGuru)中,为了计算降噪后的信噪比,得到分子上的信号值,我也通过降噪算法只传递了纯语音。如果我在第一种(Deve)方法中做同样的事情,两种方法的结果几乎相等
为什么会这样?为什么 SNR after 小于 SNR_before ?
这是波形的屏幕截图: