我该怎么办?
Fs = 48000; % Sampling rate
t = 0:1/Fs:1-1/Fs; % Time vector of 1 second
f = 1000; % Frequency of signal
dpres = sin(2*pi*f*t); % Signal in [Pa]
frCen = [100 300 600 800 1000 1200 1300 1600];
[Spl,frCen] = CompOctSplFreq(dpres,frCen)
figure()
semilogx(frCen,Spl,'ro-')
title('1/3-Octave Filtered SPL over Frequency')
xlabel('Center Frequency of Octave Band Filter [Hz]')
ylabel('SPL [dB]')
function [Spl,frCen] = CompOctSplFreq(dpres,frCen);
% Reads singal in pressure over time
freqNum = length(frCen);
Fs = length(dpres);
% Setting up the 1/3-octave filters for all center frequencies
for f = 1:freqNum
octaveFilterBank{f} = octaveFilter(frCen(f),'1/3 octave','SampleRate',Fs,'FilterOrder',12);
% Filtering the signal with the corresponding filters
dpresFiltered(:,f) = octaveFilterBank{f}(dpres');
% Getting the average for each filter frequency band
drms(f) = sqrt(sum(dpresFiltered(:,f).^2)/length(dpresFiltered(:,f)));
end
% Converting the root mean square pressure to SPL
pRef = 20e-06; % Reference pressure
Spl = 20*log10(drms/pRef);
end
答案 0 :(得分:0)
主要问题是您正在计算信号的功率,在某些情况下,信号的功率包括明显的瞬态响应。为了说明这一点,下面将对预期的稳态响应进行推导,并比较所得的计算出的响应,包括和排除瞬态部分。
基于algorithm description of octaveFilter,可以构造滤波器组中每个滤波器的理想稳态响应。下图给出了这些响应:
请注意,响应确实会在指定范围之外明显下降,但不会完全消失。结果,频率超出指定频段的输入信号仍会在滤波器组中的所有滤波器上产生一些输出(尽管很小)。对于1000Hz的正弦输入信号,您可以通过在上图中的1000Hz垂直线查找相应的滤波器响应的截距来获得每个滤波器的输出的稳态响应。这应该为您提供以下图表,显示滤波器组对1000Hz时95dB输入的响应:
现在,您可能会注意到,对于以1000Hz为中心的滤波器,您的结果非常接近于这些稳态响应,但是随着我们进一步远离1000Hz,差值会增加。如果我们查看时域中的一个滤波信号,我们可能会注意到,在信号的初始瞬变过程中确实可以发现很大一部分能量:
只需消除瞬变,就可以使您更接近预期的稳态响应。棘手的部分是弄清楚需要丢弃多少样本。作为一般经验法则,我通常使用大约5个时间常数,其中一个时间常数约为通带滤波器半带宽的倒数。可以使用以下方法进行计算:
G = 10^(3/10);
b = 3; % for 1/3-octave
fhi = frCen(f)*G^(0.5/b);
flow = frCen(f)*G^(-0.5/b);
M = 10/(fhi-flow); % 5 time-constants (one time-constant is ~ 1/((fhi-flow)/2) )
drms(f) = sqrt(sum(dpresFiltered(M:end,f).^2)/length(dpresFiltered(M:end,f)));
将不包括瞬态的初始样本在内的结果响应与您之前的结果进行比较,将会发现这确实对图形产生了重大影响,并且现在的结果与我们之前的理想稳态更好地吻合响应图: