估计乐队中声音的强度

时间:2015-01-06 19:05:50

标签: matlab rms

我使用butterworth带通滤波器在特定乐队中过滤了我的wav声音。 现在我想计算特定频段中声音的强度。

[B1,A1] = butter(4,[10 635]/(fs_orig/2),'bandpass');
freqz(B1,A1) %The frequency response of your filter1
dataIn = x1; %your music
dataOut1 = filter(B1, A1, dataIn); % // filter command filters your music

首先必须计算特定频段的均方根值? rms1 = rms(dataOut1)这给了我10到625赫兹之间的rms。但是当0 db对应于rms值为1时,我应该如何计算它为dB?

1 个答案:

答案 0 :(得分:0)

您的方法很好(包括建议的20*log10(rms)),但您最终会绘制瞬时幅度...即数据的每个样本的幅度,这可能是采样率44100赫兹或者什么的。这可能不是你想要的,因为作为人类,这不是我们感知“音量”或“响度”的方式。

人类听不到比10到40赫兹更快的幅度变化。因此,您需要将瞬时幅度值低通滤波到比原始44100 Hz采样率慢的值。

我推荐这样的东西:

%filter your data
[B1,A1] = butter(4,[10 635]/(fs_orig/2),'bandpass');
freqz(B1,A1) %The frequency response of your filter1
dataIn = x1; %your music
dataOut1 = filter(B1, A1, dataIn); % // filter command filters your music

%compute the instantaneous power
data_pow = dataOut1.^2;

%low pass filter at 5 Hz
lp_Hz = 5;
[b,a]=butter(2,lp_Hz/(fs_orig/2));
data_pow = filter(b,a,data_pow);

%convert to dB
data_dB = 10*log10(data_pow);

%plot
t_sec = ([1:length(data_dB)]-1)/fs_orig;
plot(t_sec,data_dB);
xlabel('Time (sec)');
ylabel('Amplitude (dB)');