Code covered by the BSD License  

Highlights from
Analog Filter Design Toolbox

image thumbnail

Analog Filter Design Toolbox

by

 

27 Dec 2005 (Updated )

GUI to design and simulate active (opamp) LP and HP Bessel, Butter, Cheby, and Elliptic filters.

GuiFilterOrder(varargin)
function varargout = GuiFilterOrder(varargin)
% GUIFILTERORDER M-file for guiFilterOrder.fig
%      GUIFILTERORDER, by itself, creates a new GUIFILTERORDER or raises the existing
%      singleton*.
%
%      H = GUIFILTERORDER returns the handle to a new GUIFILTERORDER or the handle to
%      the existing singleton*.
%
%      GUIFILTERORDER('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUIFILTERORDER.M with the given input arguments.
%
%      GUIFILTERORDER('Property','Value',...) creates a new GUIFILTERORDER or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before guiFilterOrder_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to guiFilterOrder_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%

% Last Modified by GUIDE v2.5 04-Jan-2003 22:52:45

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GuiFilterOrder_OpeningFcn, ...
                   'gui_OutputFcn',  @GuiFilterOrder_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin & isstr(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before guiFilterOrder is made visible.
function GuiFilterOrder_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to guiFilterOrder (see VARARGIN)

% Choose default command line output for guiFilterOrder

global strFilterObject
if isempty(strFilterObject)
   load('matlab');
   disp([mfilename ' called in debug mode using matlab.mat datafile'])
end

% set the figure's title
set(handles.figFilterOrder,'Name','Analog Filter Designer')

% set fc
fFc = strFilterObject.fFc;
if fFc >= 1e6
    set(handles.uipmFc,'Value',4)
    set(handles.uitxFc, 'String', num2str(fFc/1e6))
elseif fFc >= 1000
    set(handles.uipmFc,'Value',3)
    set(handles.uitxFc, 'String', num2str(fFc/1e3))
elseif fFc >= 1
    set(handles.uipmFc,'Value',2)
    set(handles.uitxFc, 'String', num2str(fFc))
elseif strFilterObject > 0
    set(handles.uipmFc,'Value',1)
    set(handles.uitxFc, 'String', num2str(fFc*1000))
else
    error(['Fc in ' mfilename ' is negative'])
end

% set f1
switch strFilterObject.sPurpose
    case 'Lowpass'
        fF1 = 5*fFc; % so f1 is in the cutoff band
    case 'Highpass'
        fF1 = fFc/5; % so f1 is in the cutoff band
    otherwise error(['Unidentified sPurpose of strFilterObject in ' mfilename])
end
if fF1 >= 1e6
    set(handles.uipmF1,'Value',4)
    set(handles.uitxF1, 'String', num2str(fF1/1e6))
elseif fF1 >= 1000
    set(handles.uipmF1,'Value',3)
    set(handles.uitxF1, 'String', num2str(fF1/1e3))
elseif fF1 >= 1
    set(handles.uipmF1,'Value',2)
    set(handles.uitxF1, 'String', num2str(fF1))
elseif strFilterObject > 0
    set(handles.uipmF1,'Value',1)
    set(handles.uitxF1, 'String', num2str(fF1*1000))
else
    error(['fF1 in ' mfilename ' is negative'])
end

% set the gain at f1
set(handles.uitxGain,'String','-60')

% set the status bar
set(handles.uitxStatus,'String','Choose stop/passband attenuation and press Calculate');


function varargout = GuiFilterOrder_OutputFcn(hObject, eventdata, handles)
varargout{1} = [];


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                              Calculate
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function uipbCalculate_Callback(hObject, eventdata, handles)
global strFilterObject

OMAX = 15; % The maximum filter order checked

% get the information from the gui
fp = str2num(get(handles.uitxFc,'String'))*10^((get(handles.uipmFc,'Value')-2)*3);
fs = str2num(get(handles.uitxF1,'String'))*10^((get(handles.uipmF1,'Value')-2)*3);
if any([fp fs]<=0)
    errordlg('Frequencies must be postive','Error','modal')
    return
end
rs = abs(str2num(get(handles.uitxGain,'String')));
if rs<=3
    errordlg('The gain in the stopband must be less than -3dB','Error','modal')
    return
end

% if HP make LP
if fp > fs
    temp = fs;
    fs = fp;
    fp = temp;
end    

% determine the required Bessel filter order
Utility_GetDefaultFilterObject;
strFilterObject.sPurpose = 'Lowpass';
strFilterObject.sType = 'Bessel';
strFilterObject.fFc = fp;
oBe = 1;
for oBe = 1:OMAX+1
    strFilterObject.nOrder = oBe;
    strFilterObject = Utility_zpk(strFilterObject);
    z = strFilterObject.vZeros;
    p = strFilterObject.vPoles;
    k = strFilterObject.fK;
    w=fs*2*pi;
    curRs = -20*log10(abs(k*prod(j*w-z)/prod(j*w-p)));
    if curRs > rs
        break
    end
end

% determine the required Butterworth filter order
wa=fs/fp;
if rs>1
    oBu = ceil(log10((10.^(0.1*abs(rs))-1)./(10.^(0.1*3.01)-1))/(2*log10(wa)));
    if oBu<1, oBu=1; end
else
    oBu=1;
end

% determine the required Chebychev filter order
oCh=ceil(acosh(sqrt((10^(.1*abs(rs))-1)/(10^(.1*3.01)-1)))/acosh(wa));
if oCh<1, oCh=1; end

% determine the required Elliptic filter order
epsilon = sqrt(10 .^ (0.1*3.01)-1);
k1 = epsilon./sqrt(10 .^ (0.1*rs)-1);
k = 1/wa;
m = [k.^2 1-k.^2 (k1 .^2) 1-(k1 .^2)];
if any(m<0 | m>1)
    oEl=1;
else
    capk = ellipke(m);
    oEl = ceil(capk(1)*capk(4)/(capk(2)*capk(3)));
    if oEl<1, oEl=1; end
end

% send the result to the gui
if oBe > OMAX, sBe = sprintf('>%g',OMAX); else sBe = num2str(oBe); end
set(handles.uitxBe,'String',sBe)

if oBu > OMAX, sBu = sprintf('>%g',OMAX); else sBu = num2str(oBu); end
set(handles.uitxBu,'String',sBu)

if oCh > OMAX, sCh = sprintf('>%g',OMAX); else sCh = num2str(oCh); end
set(handles.uitxC1,'String',sCh)
set(handles.uitxC2,'String',sCh)

if oEl > OMAX
    sEl = sprintf('>%g',OMAX); 
elseif isnan(oEl)
    sEl = '?';
else 
    sEl = num2str(oEl); 
end
set(handles.uitxEl,'String',sEl)

Contact us