在Matlab中使用octaveFilter出现意外结果

时间:2018-08-01 23:49:01

标签: matlab filter fft octave acoustics

我的目标是为特定的中心频率获得一个1/3倍频程的频带信号。 我想使用Matlab的octaveFilter功能,但我期望在1000 Hz处获得一个1/3八度的频带峰值,但是在1000 Hz的最左和最右边计算了非常正的声压级。

See Output

我该怎么办?

    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

1 个答案:

答案 0 :(得分:0)

主要问题是您正在计算信号的功率,在某些情况下,信号的功率包括明显的瞬态响应。为了说明这一点,下面将对预期的稳态响应进行推导,并比较所得的计算出的响应,包括和排除瞬态部分。

基于algorithm description of octaveFilter,可以构造滤波器组中每个滤波器的理想稳态响应。下图给出了这些响应:

Filter responses

请注意,响应确实会在指定范围之外明显下降,但不会完全消失。结果,频率超出指定频段的输入信号仍会在滤波器组中的所有滤波器上产生一些输出(尽管很小)。对于1000Hz的正弦输入信号,您可以通过在上图中的1000Hz垂直线查找相应的滤波器响应的截距来获得每个滤波器的输出的稳态响应。这应该为您提供以下图表,显示滤波器组对1000Hz时95dB输入的响应:

Expected steady-state response to 1000Hz input

现在,您可能会注意到,对于以1000Hz为中心的滤波器,您的结果非常接近于这些稳态响应,但是随着我们进一步远离1000Hz,差值会增加。如果我们查看时域中的一个滤波信号,我们可能会注意到,在信号的初始瞬变过程中确实可以发现很大一部分能量:

Time-domain transient response

只需消除瞬变,就可以使您更接近预期的稳态响应。棘手的部分是弄清楚需要丢弃多少样本。作为一般经验法则,我通常使用大约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)));

将不包括瞬态的初始样本在内的结果响应与您之前的结果进行比较,将会发现这确实对图形产生了重大影响,并且现在的结果与我们之前的理想稳态更好地吻合响应图:

Comparision