Generate Butterworth bandpass filter matrix for Online calculation [A, B, C, D, Z] = vb_online_butter_init(freq,fsamp,Norder,Nch,type) type : filter type : 'low', 'high' , 'band' freq = cutoff freqency for type = 'low', 'high' [flow fhigh] : bandpass freqency for type = 'band' fsamp = sampling freqency Norder = filter order Nch : Dimension of input signal Z : Internal state variable (Nch x Norder) [A, B, C, D] = butter(Norder, freq/(fsamp/2)); A = A'; B = B'; C = C'; D = D'; A: Norder x Norder, B: 1 x Norder, C: Norder x 1, D: 1 x 1 Y = Z * C + U * D; % Output update Z = Z * A + U * B; % Internal state variable update Masa-aki Sato Copyright (C) 2011, ATR All Rights Reserved. License : New BSD License(see VBMEG_LICENSE.txt)
0001 function [A, B, C, D, Z] = vb_online_butter_init(freq,fsamp,Norder,Nch,type) 0002 % Generate Butterworth bandpass filter matrix for Online calculation 0003 % [A, B, C, D, Z] = vb_online_butter_init(freq,fsamp,Norder,Nch,type) 0004 % type : filter type : 'low', 'high' , 'band' 0005 % freq = cutoff freqency for type = 'low', 'high' 0006 % [flow fhigh] : bandpass freqency for type = 'band' 0007 % fsamp = sampling freqency 0008 % Norder = filter order 0009 % Nch : Dimension of input signal 0010 % Z : Internal state variable (Nch x Norder) 0011 % 0012 % [A, B, C, D] = butter(Norder, freq/(fsamp/2)); 0013 % A = A'; B = B'; C = C'; D = D'; 0014 % A: Norder x Norder, 0015 % B: 1 x Norder, 0016 % C: Norder x 1, 0017 % D: 1 x 1 0018 % Y = Z * C + U * D; % Output update 0019 % Z = Z * A + U * B; % Internal state variable update 0020 % 0021 % Masa-aki Sato 0022 % 0023 % Copyright (C) 2011, ATR All Rights Reserved. 0024 % License : New BSD License(see VBMEG_LICENSE.txt) 0025 0026 if nargin ~= 5, error('nargin must be 5'); end; 0027 0028 switch type 0029 case 'band' 0030 if length(freq) ~= 2, error('two freqency required for bandpass'); end; 0031 [A, B, C, D] = butter(Norder, freq/(fsamp/2)); 0032 case 'low' 0033 if length(freq) ~= 1, error('one freqency required for lowpass'); end; 0034 [A, B, C, D] = butter(Norder, freq/(fsamp/2)); 0035 case 'high' 0036 if length(freq) ~= 1, error('one freqency required for highpass'); end; 0037 [A, B, C, D] = butter(Norder, freq/(fsamp/2) ,'high'); 0038 otherwise 0039 error('filter type is wrong'); 0040 end 0041 0042 A = A'; B = B'; C = C'; D = D'; 0043 0044 Norder = size(A,1); 0045 Z = zeros( Nch, Norder ); 0046