Code covered by the BSD License  

Highlights from
Reverberation Time Calculator

from Reverberation Time Calculator by Edward Zechmann
Calculates Reverberation Time from multiple microphones using time records

[yC, B, A]=Cweight_time_filter(y, Fs, B, A)
function [yC, B, A]=Cweight_time_filter(y, Fs, B, A)
% % This program applies an C-weighting filter to 
% % a sound pressure time record.  Then it outputs the C-weighted tme
% % record and the filter coefficients.
% % 
% % 
% Example='';
% y=rand(1, 50000); % (Pa) waveform
%                   % y should have the size (num_channels, num_datasample)
%                   % 
% Fs=50000;         % (Hz) Sampling rate 
% B=[];             % C-weighting filter coefficients
% A=[];             % C-weighting filter coefficients
% % 
% % Output Variables
% % yC is the C-weighted time record Pa
% % B is an array of C-weighting filter coefficients
% % A is an array of C-weighting filter coefficients
% % 
% % 
% % This program uses the signal processing toolbox 
% % 
% % This program uses functions from 
% % -- Christophe Couvreur (couvreur@thor.fpms.ac.be), August 1997. 
% % this is the octave set of filter functions from Matlab Central
% %
% % 
% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % 
% % Written by Edward L. Zechmann           
% %     date  June 2007
% %     modified 15 November 2007   Updated comments
% %     modified 19 December 2007   added a resampling routine 
% %                                 to improve accruacy at low and
% %                                 high freuencies 
% %                                 Updated comments
% %                                 
% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % 
% % 
% % Please feel free to modify this code.
% % 

% surpress an annoying warning due to a nearly singular matrix which almost always occurs with filtering.
warning('off','MATLAB:nearlySingularMatrix')

p=1;
q=1;
Fsn=Fs;
flag0=0;

if Fs > 50000;
    flag0=1;
    q=ceil(Fs/40000);
    Fsn=Fs/q;
end

[m1 n1]=size(y);
flag1=0;

if m1 > n1
    flag1=1;
    y=y';
    [m1, n1]=size(y);
end


if isequal(flag0, 1)
    buf=resample(y(1, :), p, q);
    n2=length(buf);
    y2=zeros(m1,n2);
    y2(1, :)=buf;
    clear('buf');
    if m1 > 1
        for e1=2:m1;
            y2(e1, :)=resample(y(e1, :), p, q);
        end
    end
else
    y2=y;
end

clear('y');

if (nargin < 4) || length(B) < 4 ||  length(A) < 4

    [B,A] = cdsgn(Fsn); 
end

yC=zeros(size(y2));
   
for e1=1:m1;
    yC(e1, :) = real(filter(B, A, y2(e1, :)));
end

if isequal(flag0, 1)
    buf=resample(yC(1, :), q, p);
    n2=length(buf);
    yCC=zeros(m1,n2);
    yCC(1, :)=buf;
    clear('buf');
    if m1 > 1
        for e1=2:m1;
            yCC(e1, :)=resample(yC(e1, :), q, p);
        end
    end
else
    yCC=yC;
end

clear('yC');

if isequal(flag0, 1)
    if n2 > n1
        n2=n1;
    end

    yC=yCC(1:m1, 1:n2);
else
    yC=yCC(1:m1, 1:n1);
end

%output yC with the same size as y was input
if isequal(flag1, 1)
    yC=yC';
end


Contact us at files@mathworks.com