|
@ -29,16 +29,19 @@ specification_stop_radial_frequency = ... |
|
|
specification_min_stop_attenuation = 24+AEM(4)*(6/9); % dB |
|
|
specification_min_stop_attenuation = 24+AEM(4)*(6/9); % dB |
|
|
specification_max_pass_attenuation = 0.5+AEM(3)/36; % dB |
|
|
specification_max_pass_attenuation = 0.5+AEM(3)/36; % dB |
|
|
|
|
|
|
|
|
clear design_param_m |
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== DESIGN SPECIFICATIONS =====' '\n' ... |
|
|
|
|
|
'Filter design specifications:\n' ... |
|
|
|
|
|
'Pass frequency = %.3fHz = %.3frad/s\n' ... |
|
|
|
|
|
'Stop frequency = %.3fHz = %.3frad/s\n' ... |
|
|
|
|
|
'Min stop attenuation = %.3fdB\n' ... |
|
|
|
|
|
'Max pass attenuation = %.3fdB\n'], ... |
|
|
|
|
|
specification_pass_frequency, specification_pass_radial_frequency, ... |
|
|
|
|
|
specification_stop_frequency, specification_stop_radial_frequency, ... |
|
|
|
|
|
specification_min_stop_attenuation, specification_max_pass_attenuation); |
|
|
|
|
|
|
|
|
%{ |
|
|
clear design_param_m |
|
|
specification_pass_radial_frequency = 15707.96; % rad/s |
|
|
|
|
|
specification_stop_radial_frequency = 6283.2; % rad/s |
|
|
|
|
|
|
|
|
|
|
|
specification_min_stop_attenuation = 25; % dB |
|
|
|
|
|
specification_max_pass_attenuation = 0.5; % dB |
|
|
|
|
|
%} |
|
|
|
|
|
% ========== DESIGN SPECIFICATIONS END ========== |
|
|
% ========== DESIGN SPECIFICATIONS END ========== |
|
|
|
|
|
|
|
|
%% ========== PROTOTYPE LOW PASS DESIGN SPECIFICATIONS START ========== |
|
|
%% ========== PROTOTYPE LOW PASS DESIGN SPECIFICATIONS START ========== |
|
@ -53,16 +56,25 @@ prototype_normalized_stop_radial_frequency = ... |
|
|
|
|
|
|
|
|
% Min and max attenuations remain the same |
|
|
% Min and max attenuations remain the same |
|
|
|
|
|
|
|
|
|
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== PROTOTYPE LOW PASS DESIGN SPECIFICATIONS =====' '\n' ... |
|
|
|
|
|
'The prototype low pass filter will be designed with the\n' ... |
|
|
|
|
|
'normalized stop radial frequency %.3frad/s, the normalized\n' ... |
|
|
|
|
|
'pass radial frequency is equal to 1rad/s.\n' ... |
|
|
|
|
|
'Min and max attenuation specifications remain the same.\n'], ... |
|
|
|
|
|
prototype_normalized_stop_radial_frequency); |
|
|
|
|
|
|
|
|
% ========== PROTOTYPE LOW PASS DESIGN SPECIFICATIONS END ========== |
|
|
% ========== PROTOTYPE LOW PASS DESIGN SPECIFICATIONS END ========== |
|
|
|
|
|
|
|
|
%% ========== PROTOTYPE LOW PASS DESIGN START ========== |
|
|
%% ========== PROTOTYPE LOW PASS DESIGN START ========== |
|
|
% Designs the prototype normalized filter. |
|
|
% Designs the prototype normalized filter. |
|
|
|
|
|
|
|
|
% Calculates the filter's order using the eq. 9-52 |
|
|
% Calculates the filter's order using the eq. 9-52 |
|
|
design_filter_order = ceil(log10(((10^ ... |
|
|
temp_filter_order = log10(((10^ ... |
|
|
(specification_min_stop_attenuation/10)-1)/(10^ ... |
|
|
(specification_min_stop_attenuation/10)-1)/(10^ ... |
|
|
(specification_max_pass_attenuation/10)-1)))/ ... |
|
|
(specification_max_pass_attenuation/10)-1)))/ ... |
|
|
(2*log10(prototype_normalized_stop_radial_frequency))); |
|
|
(2*log10(prototype_normalized_stop_radial_frequency)); |
|
|
|
|
|
design_filter_order = ceil(temp_filter_order); |
|
|
|
|
|
|
|
|
% Calculates the frequency at which half power of the low pass prototype |
|
|
% Calculates the frequency at which half power of the low pass prototype |
|
|
% occurs using the eq. 9-48 |
|
|
% occurs using the eq. 9-48 |
|
@ -162,13 +174,34 @@ else % Even number of poles |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== PROTOTYPE LOW PASS DESIGN =====' '\n' ... |
|
|
|
|
|
'A prototype low pass Butterworth filter is designed with the\n' ... |
|
|
|
|
|
'specifications previously calculated.\n\n' ... |
|
|
|
|
|
'Filter order = %.3f\n' ... |
|
|
|
|
|
'Filter order ceiling = %d\n' ... |
|
|
|
|
|
'Radial frequency at which half power occurs = %.3frad/s\n' ... |
|
|
|
|
|
'Butterworth angles are ' char(177) '%.2f' char(176) ' and ' ... |
|
|
|
|
|
char(177) '%.2f' char(176) '\n'], ... |
|
|
|
|
|
temp_filter_order, design_filter_order, ... |
|
|
|
|
|
design_half_power_radial_frequency, design_butterworth_angles(1,1), ... |
|
|
|
|
|
design_butterworth_angles(1,2)); |
|
|
|
|
|
|
|
|
|
|
|
fprintf('\nLow pass Butterworth poles found:\n'); |
|
|
|
|
|
for i=1:low_pass_prototype_number_of_poles |
|
|
|
|
|
fprintf(['Pole %d:\t' '%.3f' char(177) ... |
|
|
|
|
|
'%.3fi, radial frequency = %.3f, Q = %.3f\n'], ... |
|
|
|
|
|
i, low_pass_prototype_poles_real_parts(1,i), ... |
|
|
|
|
|
low_pass_prototype_poles_imaginary_parts(1,i), ... |
|
|
|
|
|
low_pass_prototype_poles_radial_frequencies(1,i), ... |
|
|
|
|
|
low_pass_prototype_poles_Q(1,i)); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
% Clears unneeded variables from workspace |
|
|
% Clears unneeded variables from workspace |
|
|
% |
|
|
|
|
|
clearVars = {'i', 'prototype_normalized_stop_radial_frequency', ... |
|
|
clearVars = {'i', 'prototype_normalized_stop_radial_frequency', ... |
|
|
'low_pass_prototype_half_power_radial_frequency', 'theta'}; |
|
|
'low_pass_prototype_half_power_radial_frequency', 'theta'}; |
|
|
clear(clearVars{:}) |
|
|
clear(clearVars{:}) |
|
|
clear clearVars |
|
|
clear clearVars |
|
|
% |
|
|
|
|
|
|
|
|
|
|
|
% ========== PROTOTYPE LOW PASS DESIGN END ========== |
|
|
% ========== PROTOTYPE LOW PASS DESIGN END ========== |
|
|
|
|
|
|
|
@ -192,6 +225,27 @@ high_pass_poles_Q = low_pass_prototype_poles_Q; |
|
|
% filter order |
|
|
% filter order |
|
|
high_pass_transfer_function_zeros = zeros([1 design_filter_order]); |
|
|
high_pass_transfer_function_zeros = zeros([1 design_filter_order]); |
|
|
|
|
|
|
|
|
|
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== LOW PASS TO HIGH PASS TRANSFORMATION =====' '\n' ... |
|
|
|
|
|
'The prototype low pass Butterworth filter is transformed into\n' ... |
|
|
|
|
|
'a high pass Butterworth using the transformation S = 1/s.\n']); |
|
|
|
|
|
|
|
|
|
|
|
fprintf('\nHigh pass Butterworth normalized poles found:\n'); |
|
|
|
|
|
for i=1:high_pass_number_of_poles |
|
|
|
|
|
fprintf(['Pole %d:\t' '%.3f' char(177) ... |
|
|
|
|
|
'%.3fi, radial frequency = %.3f, Q = %.3f\n'], ... |
|
|
|
|
|
i, high_pass_poles_real_parts(1,i), ... |
|
|
|
|
|
high_pass_poles_imaginary_parts(1,i), ... |
|
|
|
|
|
high_pass_poles_radial_frequencies(1,i), ... |
|
|
|
|
|
high_pass_poles_Q(1,i)); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
fprintf('\nTransfer function zeros:\n'); |
|
|
|
|
|
for i=1:length(high_pass_transfer_function_zeros) |
|
|
|
|
|
fprintf(['Zero %d:\t' '0%+.3fi\n'], ... |
|
|
|
|
|
i, high_pass_transfer_function_zeros(1,i)); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
% Clears unneeded variables from workspace |
|
|
% Clears unneeded variables from workspace |
|
|
clear low_pass_prototype_number_of_poles |
|
|
clear low_pass_prototype_number_of_poles |
|
|
clear -regexp ^low_pass_prototype_ |
|
|
clear -regexp ^low_pass_prototype_ |
|
@ -213,6 +267,21 @@ for i=1:high_pass_number_of_poles |
|
|
design_half_power_radial_frequency; |
|
|
design_half_power_radial_frequency; |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== POLES DE-NORMALIZATION =====' '\n' ... |
|
|
|
|
|
'The high pass filter designed is normalized.\n' ... |
|
|
|
|
|
'The poles are de-normalized.\n']); |
|
|
|
|
|
|
|
|
|
|
|
fprintf('\nHigh pass Butterworth poles found:\n'); |
|
|
|
|
|
for i=1:high_pass_number_of_poles |
|
|
|
|
|
fprintf(['Pole %d:\t' '%.3f' char(177) ... |
|
|
|
|
|
'%.3fi, radial frequency = %.3f, Q = %.3f\n'], ... |
|
|
|
|
|
i, high_pass_poles_real_parts(1,i), ... |
|
|
|
|
|
high_pass_poles_imaginary_parts(1,i), ... |
|
|
|
|
|
high_pass_poles_radial_frequencies(1,i), ... |
|
|
|
|
|
high_pass_poles_Q(1,i)); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
% Clears unneeded variables from workspace |
|
|
% Clears unneeded variables from workspace |
|
|
clear i |
|
|
clear i |
|
|
clear -regexp ^geffe_ |
|
|
clear -regexp ^geffe_ |
|
@ -283,10 +352,30 @@ for i=1:high_pass_number_of_poles |
|
|
tf(unit_numerator, unit_denominator); |
|
|
tf(unit_numerator, unit_denominator); |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
% Outputs results |
|
|
|
|
|
fprintf(['\n' '===== UNITS IMPLEMENTATION =====' '\n' ... |
|
|
|
|
|
'Units implementation details:\n']); |
|
|
|
|
|
for i=1:high_pass_number_of_poles |
|
|
|
|
|
fprintf(['Unit %d:\n' ... |
|
|
|
|
|
'\tPole radial frequency = %.3f\n'... |
|
|
|
|
|
'\tPole Q = %.3f\n' ... |
|
|
|
|
|
'\tTransfer function zero = 0%+.3fi (double)\n' ... |
|
|
|
|
|
'\tCircuit elements:\n' ... |
|
|
|
|
|
'\t\tR1 = %.3fOhm\n' ... |
|
|
|
|
|
'\t\tR2 = %.3fOhm\n' ... |
|
|
|
|
|
'\t\tr1 = %.3fOhm\n' ... |
|
|
|
|
|
'\t\tr2 = %.3fOhm\n' ... |
|
|
|
|
|
'\t\tC1 = %.7fF\n' ... |
|
|
|
|
|
'\t\tC2 = %.7fF\n'], ... |
|
|
|
|
|
i, high_pass_poles_radial_frequencies(1,i), ... |
|
|
|
|
|
high_pass_poles_Q(1,i), ... |
|
|
|
|
|
high_pass_transfer_function_zeros(1,i), ... |
|
|
|
|
|
units_R(1,i), units_R(1,i), units_r1(1,i), units_r2(1,i), ... |
|
|
|
|
|
units_C(1,i), units_C(1,i)); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
% Clears unneeded variables from workspace |
|
|
% Clears unneeded variables from workspace |
|
|
clearVars = {''}; |
|
|
clearVars = {'i'}; |
|
|
clear(clearVars{:}) |
|
|
clear(clearVars{:}) |
|
|
clear clearVars |
|
|
clear clearVars |
|
|
clear -regexp _transfer_function$ |
|
|
clear -regexp _transfer_function$ |
|
@ -320,13 +409,13 @@ ltiview(units_transfer_functions(1,1), ... |
|
|
|
|
|
|
|
|
%ltiview(total_transfer_function); |
|
|
%ltiview(total_transfer_function); |
|
|
|
|
|
|
|
|
% |
|
|
%{ |
|
|
plot_transfer_function(total_transfer_function, ... |
|
|
plot_transfer_function(total_transfer_function, ... |
|
|
[design_half_power_radial_frequency/(2*pi) ... |
|
|
[design_half_power_radial_frequency/(2*pi) ... |
|
|
specification_stop_frequency ... |
|
|
specification_stop_frequency ... |
|
|
specification_pass_frequency ... |
|
|
specification_pass_frequency ... |
|
|
15000]); |
|
|
15000]); |
|
|
% |
|
|
%} |
|
|
|
|
|
|
|
|
% Clears unneeded variable from workspace |
|
|
% Clears unneeded variable from workspace |
|
|
clearVars = {'total_transfer_function'}; |
|
|
clearVars = {'total_transfer_function'}; |
|
|