function varargout = GuiBuildActiveCircuit(varargin)
% GUIBUILDACTIVECIRCUIT M-file for GuiBuildActiveCircuit.fig
% GUIBUILDACTIVECIRCUIT, by itself, creates a new GUIBUILDACTIVECIRCUIT or raises the existing
% singleton*.
%
% H = GUIBUILDACTIVECIRCUIT returns the handle to a new GUIBUILDACTIVECIRCUIT or the handle to
% the existing singleton*.
%
% GUIBUILDACTIVECIRCUIT('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GUIBUILDACTIVECIRCUIT.M with the given input arguments.
%
% GUIBUILDACTIVECIRCUIT('Property','Value',...) creates a new GUIBUILDACTIVECIRCUIT or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before GuiBuildActiveCircuit_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to GuiBuildActiveCircuit_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GuiBuildActiveCircuit
% Last Modified by GUIDE v2.5 27-Dec-2003 17:44:28
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GuiBuildActiveCircuit_OpeningFcn, ...
'gui_OutputFcn', @GuiBuildActiveCircuit_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 GuiBuildActiveCircuit is made visible.
function GuiBuildActiveCircuit_OpeningFcn(hObject, eventdata, handles, varargin)
global strFilterObject
global strCircuit
% Load data
if isempty(strFilterObject)
temp=load('matlab');
disp([mfilename ' called in debug mode using matlab.mat datafile'])
strFilterObject = temp.strFilterObject;
else
strFilterObject=Utility_zpk(strFilterObject); % find poles, zeros
% reset the fK1, vPoles1, vZeros1
% strFilterObject.fK1=[];
% strFilterObject.vPoles1=[];
% strFilterObject.vZeros1=[];
end
% fill out the initial circuit structure and build graphics
if isempty(strCircuit) % todo: must reset strCircuit if strFilterObject changed
strCircuit = BuildCircuit_Zpk2Circuit(strFilterObject);
end
handles.strCircuit = strCircuit;
UpdateTopThirdGUI(handles)
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
sStatus = { ...
'Select each stage, and if desired, change circuit schematic, component tolerances, and component values.', ...
'You must choose a non-exact component tolerance and then close this window to enable "use toleranced components" in other windows.'};
set(handles.uitxStatus,'String',sStatus)
% Choose default command line output for GuiBuildActiveCircuit
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = GuiBuildActiveCircuit_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callbacks in the Upper Third of Display %
% uipmStage, uipmPolarity, uipmRTol, uipmCTol %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function uipmStage_Callback(hObject, eventdata, handles)
UpdateTopThirdGUI(handles)
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
function uipmPolarity_Callback(hObject, eventdata, handles)
global strCircuit
switch get(hObject,'Value')
case 1, strCircuit.sPolarity = 'd'; % don't care
case 2, strCircuit.sPolarity = 'n'; % non-inverting
case 3, strCircuit.sPolarity = 'i'; % inverting
end
strCircuit = BuildCircuit_LastStage(strCircuit);
% the change in polarity may have removed a previous inverting gain stage, so remove its z1,p1,k1
nStages=strCircuit.nStages;
if nStages<5
strCircuit.vStage(nStages+1).z1=[];
strCircuit.vStage(nStages+1).p1=[];
strCircuit.vStage(nStages+1).k1=[];
end
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(strCircuit)
handles.strCircuit = strCircuit;
guidata(gcbo,handles)
UpdateTopThirdGUI(handles) % maybe viewing last stage, or a stage was deleted/added
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
function uipmRTol_Callback(hObject, eventdata, handles)
global strCircuit
switch get(hObject,'Value')
case 1, nRTol = 0;
case 2, nRTol = 1;
case 3, nRTol = 5;
end
strCircuit.nRTol = nRTol;
nCTol = strCircuit.nCTol;
for i=1:strCircuit.nBiquads
strCircuit.vStage(i) = BuildCircuit_UpdateComponents(strCircuit.vStage(i),nRTol,nCTol);
end
% to get a close-as-possible overall gain, refigure last stage. LastStage calls UpdateComponent
strCircuit = BuildCircuit_LastStage(strCircuit);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(strCircuit)
handles.strCircuit=strCircuit;
guidata(gcbo,handles)
UpdateTopThirdGUI(handles) % maybe viewing last stage, or a stage was deleted/added
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
function uipmCTol_Callback(hObject, eventdata, handles)
global strCircuit
switch get(hObject,'Value')
case 1, nCTol = 0;
case 2, nCTol = 1;
case 3, nCTol = 5;
case 4, nCTol = 10;
end
strCircuit.nCTol = nCTol;
nRTol = strCircuit.nRTol;
for i=1:strCircuit.nBiquads
strCircuit.vStage(i) = BuildCircuit_UpdateComponents(strCircuit.vStage(i),nRTol,nCTol);
end
% to get a close-as-possible overall gain, refigure last stage. LastStage calls UpdateComponent
strCircuit = BuildCircuit_LastStage(strCircuit);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(strCircuit)
handles.strCircuit=strCircuit;
guidata(gcbo,handles)
UpdateTopThirdGUI(handles) % maybe viewing last stage, or a stage was deleted/added
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callbacks in the Middle Third of Display %
% uiaxCircuit, uitxStage %
% uipmSelectedCircuit, uitxRecommendedCircuit %
% uipbDetails, uipbPrint %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function uipmSelectedCircuit_Callback(hObject, eventdata, handles)
global strCircuit
% get the new title from the pm
contents = get(hObject,'String');
nSelections = length(contents);
if nSelections == 1
return
end
schTitle = contents{get(hObject,'Value')};
% determine the new schName from the schTitle (which is generic) and the sPurpose
curStage = get(handles.uipmStage,'Value');
% calculation function below
strCircuit = BuildCircuit_SelectCircuit(strCircuit, curStage, schTitle);
% update the gui and save the new data
handles.strCircuit = strCircuit;
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(strCircuit) % may have changed the polarity of k1
UpdateTopThirdGUI(handles) % may have changed the number of stages required
UpdateMiddleThirdGUI(handles)
UpdateBottomThirdGUI(handles)
guidata(gcbo,handles)
function uipbDetails_Callback(hObject, eventdata, handles)
curStage = get(handles.uipmStage,'Value');
GuiBuildStageInformation(handles.strCircuit.vStage(curStage),curStage)
function uipbPrint_Callback(hObject, eventdata, handles)
printdlg(handles.uiBuildActiveCircuit)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Components %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function uitxCa_Callback(hObject, eventdata, handles)
% get the new Ca and setup variables
nCurStage = get(handles.uipmStage,'Value');
strStage = handles.strCircuit.vStage(nCurStage);
nRTol = handles.strCircuit.nRTol;
nCTol = handles.strCircuit.nCTol;
componentName = 'Ca';
componentValue = str2num(get(handles.uitxCa,'String'))*10^(get(handles.uipmCa,'Value')*3-15);
% calculation function below
handles.strCircuit.vStage(nCurStage) = BuildCircuit_UpdateComponents(handles.strCircuit.vStage(nCurStage),nRTol,nCTol,componentName,componentValue);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(handles.strCircuit)
% update the gui and save the new data
UpdateBottomThirdGUI(handles)
guidata(gcbo,handles)
function uipmCa_Callback(hObject, eventdata, handles)
uitxCa_Callback(hObject, eventdata, handles)
function uitxCb_Callback(hObject, eventdata, handles)
% get the new Cb and setup variables
nCurStage = get(handles.uipmStage,'Value');
strStage = handles.strCircuit.vStage(nCurStage);
nRTol = handles.strCircuit.nRTol;
nCTol = handles.strCircuit.nCTol;
componentName = 'Cb';
componentValue = str2num(get(handles.uitxCb,'String'))*10^(get(handles.uipmCb,'Value')*3-15);
% calculation function below
handles.strCircuit.vStage(nCurStage) = BuildCircuit_UpdateComponents(handles.strCircuit.vStage(nCurStage),nRTol,nCTol,componentName,componentValue);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(handles.strCircuit)
% update the gui and save the new data
UpdateBottomThirdGUI(handles)
guidata(gcbo,handles)
function uipmCb_Callback(hObject, eventdata, handles)
uitxCb_Callback(hObject, eventdata, handles)
function uitxRa_Callback(hObject, eventdata, handles)
% get the new Ra and setup variables
nCurStage = get(handles.uipmStage,'Value');
strStage = handles.strCircuit.vStage(nCurStage);
nRTol = handles.strCircuit.nRTol;
nCTol = handles.strCircuit.nCTol;
componentName = 'Ra';
componentValue = str2num(get(handles.uitxRa,'String'))*10^(get(handles.uipmRa,'Value')*3-3);
% calculation function below
handles.strCircuit.vStage(nCurStage) = BuildCircuit_UpdateComponents(handles.strCircuit.vStage(nCurStage),nRTol,nCTol,componentName,componentValue);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(handles.strCircuit)
% update the gui and save the new data
UpdateBottomThirdGUI(handles)
guidata(gcbo,handles)
function uipmRa_Callback(hObject, eventdata, handles)
uitxRa_Callback(hObject, eventdata, handles)
function uitxRb_Callback(hObject, eventdata, handles)
% get the new Ra and setup variables
nCurStage = get(handles.uipmStage,'Value');
strStage = handles.strCircuit.vStage(nCurStage);
nRTol = handles.strCircuit.nRTol;
nCTol = handles.strCircuit.nCTol;
componentName = 'Rb';
componentValue = str2num(get(handles.uitxRb,'String'))*10^(get(handles.uipmRb,'Value')*3-3);
% calculation function below
handles.strCircuit.vStage(nCurStage) = BuildCircuit_UpdateComponents(handles.strCircuit.vStage(nCurStage),nRTol,nCTol,componentName,componentValue);
% determine the overall filter Z1,P1, and k1 directly into the global variable strFilterObject
UpdateFilter_Z1P1k1(handles.strCircuit)
% update the gui and save the new data
UpdateBottomThirdGUI(handles)
guidata(gcbo,handles)
function uipmRb_Callback(hObject, eventdata, handles)
uitxRCb_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DrawStages %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function DrawStages(nStages,nSelected,hax)
ARROW = 35;
ARROWSHORT = 20;
BOX = 70;
XT = 25;
axes(hax)
hold off
cla
set(hax,'Units','pixels')
axPosition=get(hax,'Position');
xStart = axPosition(3)/2 - nStages*(BOX+ARROW)/2 - ARROWSHORT -XT/2;
DrawText(xStart,'x(t)')
hold on
DrawArrow(xStart+XT,ARROWSHORT)
for i=1:nStages
DrawBox(xStart+XT+ARROWSHORT+(i-1)*(ARROW+BOX),BOX,sprintf('Stage %g',i),nSelected==i)
end
for i=1:nStages-1
DrawArrow(xStart+XT+ARROWSHORT+i*BOX+(i-1)*ARROW,ARROW)
end
DrawArrow(xStart+XT+ARROWSHORT+nStages*BOX+(nStages-1)*ARROW,ARROWSHORT)
DrawText(xStart+XT+2*ARROWSHORT+nStages*BOX+(nStages-1)*ARROW+5,'y(t)')
set(gca,'XLim',[0 axPosition(3)])
set(gca,'YLim',[0 axPosition(4)])
set(gca,'TickLength',[0 0])
set(gca,'XTick',[])
set(gca,'YTick',[])
hold off
function DrawBox(x,width,label,highlight)
HEIGHT = 30;
YSTART = 10;
if nargin==2 || ~highlight % thin blue box
color = [0 0 1];
thickness = 1;
else % thick red box
color = [1 0 0];
thickness = 1.5;
end
vx=[x x+width x+width x x];
vy=[YSTART YSTART YSTART+HEIGHT YSTART+HEIGHT YSTART];
plot(vx,vy,'Color',color,'LineWidth',thickness)
hold on
text(x+width/2-20,YSTART+HEIGHT/2,label);
function DrawArrow(x,len)
ARROWLEN = 5;
YSTART = 25;
vx = x+[0 len len-ARROWLEN len len-ARROWLEN];
vy = YSTART+[0 0 ARROWLEN 0 -ARROWLEN];
plot(vx,vy,'k','LineWidth',1)
function DrawText(x,label)
text(x,25,label)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UpdateTopThirdGUI %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function UpdateTopThirdGUI(handles)
global strFilterObject
global strCircuit
% create the figure title bar
set(handles.uiBuildActiveCircuit,'Name',strFilterObject.sTitle)
% draw the boxes
curStage = get(handles.uipmStage,'Value');
DrawStages(strCircuit.nStages,curStage,handles.uiaxStage)
% error check to make sure a stage was not deleted making current stage to edit non-existant
maxStage = strCircuit.nStages;
if curStage > maxStage
if curStage==1
error('Zero or negative maxStage')
else
curStage = maxStage;
set(handles.uipmStage,'Value',curStage);
end
end
% fill the popup "stage to edit" with the correct number of choices
tString={};
for i=1:maxStage
tString{i}=num2str(i);
end
tString=tString';
set(handles.uipmStage,'String',tString)
% set the passband polarity popup box correctly
sPolarity = strCircuit.sPolarity;
switch sPolarity
case 'd', set(handles.uipmPolarity,'Value',1)
case 'n', set(handles.uipmPolarity,'Value',2)
case 'i', set(handles.uipmPolarity,'Value',3)
end
% set the resistor tolerance popup box correctly
nRTol=strCircuit.nRTol;
switch nRTol
case 0, set(handles.uipmRTol,'Value',1)
case 1, set(handles.uipmRTol,'Value',2)
case 5, set(handles.uipmRTol,'Value',3)
end
% set the capacitor tolerance popup box correctly
nCTol=strCircuit.nCTol;
switch nCTol
case 0, set(handles.uipmCTol,'Value',1)
case 1, set(handles.uipmCTol,'Value',2)
case 5, set(handles.uipmCTol,'Value',3)
case 10, set(handles.uipmCTol,'Value',4)
end
% Set the title of the middle third of figure
set(handles.uitxStage,'String',sprintf('Stage %g',curStage))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UpdateMiddleThirdGUI %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Draws the schematic and grays out unused boxes in bottom third
function UpdateMiddleThirdGUI(handles)
% load pictures of schematics
persistent strGraphic
if isempty(strGraphic)
t=load('BuildCircuit.mat');
strGraphic = t.strGraphic;
end
% display curStage schematic
curStage = get(handles.uipmStage,'Value');
axes(handles.uiaxCircuit)
schName = lower(handles.strCircuit.vStage(curStage).schName);
hImage = image(strGraphic.(schName), 'Parent', handles.uiaxCircuit);
% fix the display details
set(handles.uiaxCircuit, ...
'Visible', 'off', ...
'YDir' , 'reverse' , ...
'XLim' , get(hImage,'XData'), ...
'YLim' , get(hImage,'YData') ...
);
set(handles.uiBuildActiveCircuit,'Colormap',gray(16))
% fill in "selected circuit" box with options
schName = handles.strCircuit.vStage(curStage).schName;
sPurpose = handles.strCircuit.sPurpose;
curChoice = handles.strCircuit.vStage(curStage).schTitle;
curRec = handles.strCircuit.vStage(curStage).recTitle;
switch schName(1:2)
case {'ZO','SO'}
vcStrings = {curChoice};
otherwise
switch sPurpose
case 'LP'
vcStrings = {'Sallen-Key','Multiple Feedback','Ackerberg-Mossberg (+)','Ackerberg-Mossberg (-)'};
case 'HP'
vcStrings = {'Sallen-Key','Ackerberg-Mossberg'};
case 'Notch'
vcStrings = {'Multiple Feedback','Ackerberg-Mossberg'};
otherwise
error('Unidentified schematic name and purpose')
end
end
set(handles.uipmSelectedCircuit,'String',vcStrings);
% fill in "selected circuit" box with current choice, allowing for possible spelling error
for i=1:length(vcStrings)
index(i)=isequal(curChoice,vcStrings{i});
end
[dummy,i] = max(index);
set(handles.uipmSelectedCircuit,'Value',i)
% fill in "recommended circuit" box
set(handles.uitxRecommendedCircuit,'String',curRec)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UpdateBottomThirdGUI %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function UpdateBottomThirdGUI(handles)
curStage = get(handles.uipmStage,'Value');
nCSelect = length(handles.strCircuit.vStage(curStage).vfCSelect);
nRSelect = length(handles.strCircuit.vStage(curStage).vfRSelect);
nCCalc = length(handles.strCircuit.vStage(curStage).vfCCalc);
nRCalc = length(handles.strCircuit.vStage(curStage).vfRCalc);
% gray out unused boxes
switch nCSelect
case 0
set(handles.uitxCa,'Enable','off'); set(handles.uitxCa,'String','0');
set(handles.uipmCa,'Enable','off'); set(handles.uipmCa,'Value',1);
set(handles.uitxCb,'Enable','off'); set(handles.uitxCb,'String','0');
set(handles.uipmCb,'Enable','off'); set(handles.uipmCb,'Value',1);
case 1
set(handles.uitxCa,'Enable','on'); set(handles.uitxCa,'String',handles.strCircuit.vStage(curStage).csCSelectMan{1})
set(handles.uipmCa,'Enable','on'); set(handles.uipmCa,'Value',handles.strCircuit.vStage(curStage).vnCSelectExp(1)/3+5)
set(handles.uitxCb,'Enable','off'); set(handles.uitxCb,'String','0');
set(handles.uipmCb,'Enable','off'); set(handles.uipmCb,'Value',1);
case 2
set(handles.uitxCa,'Enable','on'); set(handles.uitxCa,'String',handles.strCircuit.vStage(curStage).csCSelectMan{1})
set(handles.uipmCa,'Enable','on'); set(handles.uipmCa,'Value',handles.strCircuit.vStage(curStage).vnCSelectExp(1)/3+5)
set(handles.uitxCb,'Enable','on'); set(handles.uitxCb,'String',handles.strCircuit.vStage(curStage).csCSelectMan{2})
set(handles.uipmCb,'Enable','on'); set(handles.uipmCb,'Value',handles.strCircuit.vStage(curStage).vnCSelectExp(2)/3+5)
otherwise, error('bad nCSelect')
end
switch nRSelect
case 0
set(handles.uitxRa,'Enable','off'); set(handles.uitxRa,'String','0');
set(handles.uipmRa,'Enable','off'); set(handles.uipmRa,'Value',1);
set(handles.uitxRb,'Enable','off'); set(handles.uitxRb,'String','0');
set(handles.uipmRb,'Enable','off'); set(handles.uipmRb,'Value',1);
case 1
set(handles.uitxRa,'Enable','on'); set(handles.uitxRa,'String',handles.strCircuit.vStage(curStage).csRSelectMan{1})
set(handles.uipmRa,'Enable','on'); set(handles.uipmRa,'Value',handles.strCircuit.vStage(curStage).vnRSelectExp(1)/3+1)
set(handles.uitxRb,'Enable','off'); set(handles.uitxRb,'String','0');
set(handles.uipmRb,'Enable','off'); set(handles.uipmRb,'Value',1);
case 2
set(handles.uitxRa,'Enable','on'); set(handles.uitxRa,'String',handles.strCircuit.vStage(curStage).csRSelectMan{1})
set(handles.uipmRa,'Enable','on'); set(handles.uipmRa,'Value',handles.strCircuit.vStage(curStage).vnRSelectExp(1)/3+1)
set(handles.uitxRb,'Enable','on'); set(handles.uitxRb,'String',handles.strCircuit.vStage(curStage).csRSelectMan{2})
set(handles.uipmRb,'Enable','on'); set(handles.uipmRb,'Value',handles.strCircuit.vStage(curStage).vnRSelectExp(2)/3+1)
otherwise, error('bad nRSelect')
end
switch nCCalc
case 0
set(handles.uitxC1,'Visible','off')
set(handles.uitxC2,'Visible','off')
set(handles.uitxC3,'Visible','off')
set(handles.uitxC4,'Visible','off')
set(handles.uitxStaticC1,'Enable','off')
set(handles.uitxStaticC2,'Enable','off')
set(handles.uitxStaticC3,'Enable','off')
set(handles.uitxStaticC4,'Enable','off')
set(handles.uitxStaticC1sub,'Enable','off')
set(handles.uitxStaticC2sub,'Enable','off')
set(handles.uitxStaticC3sub,'Enable','off')
set(handles.uitxStaticC4sub,'Enable','off')
case 1
set(handles.uitxC1,'Visible','on'); set(handles.uitxC1,'String',handles.strCircuit.vStage(curStage).csCCalc{1})
set(handles.uitxC2,'Visible','off')
set(handles.uitxC3,'Visible','off')
set(handles.uitxC4,'Visible','off')
set(handles.uitxStaticC1,'Enable','on')
set(handles.uitxStaticC2,'Enable','off')
set(handles.uitxStaticC3,'Enable','off')
set(handles.uitxStaticC4,'Enable','off')
set(handles.uitxStaticC1sub,'Enable','on')
set(handles.uitxStaticC2sub,'Enable','off')
set(handles.uitxStaticC3sub,'Enable','off')
set(handles.uitxStaticC4sub,'Enable','off')
case 2
set(handles.uitxC1,'Visible','on'); set(handles.uitxC1,'String',handles.strCircuit.vStage(curStage).csCCalc{1})
set(handles.uitxC2,'Visible','on'); set(handles.uitxC2,'String',handles.strCircuit.vStage(curStage).csCCalc{2})
set(handles.uitxC3,'Visible','off')
set(handles.uitxC4,'Visible','off')
set(handles.uitxStaticC1,'Enable','on')
set(handles.uitxStaticC2,'Enable','on')
set(handles.uitxStaticC3,'Enable','off')
set(handles.uitxStaticC4,'Enable','off')
set(handles.uitxStaticC1sub,'Enable','on')
set(handles.uitxStaticC2sub,'Enable','on')
set(handles.uitxStaticC3sub,'Enable','off')
set(handles.uitxStaticC4sub,'Enable','off')
case 3
set(handles.uitxC1,'Visible','on'); set(handles.uitxC1,'String',handles.strCircuit.vStage(curStage).csCCalc{1})
set(handles.uitxC2,'Visible','on'); set(handles.uitxC2,'String',handles.strCircuit.vStage(curStage).csCCalc{2})
set(handles.uitxC3,'Visible','on'); set(handles.uitxC3,'String',handles.strCircuit.vStage(curStage).csCCalc{3})
set(handles.uitxC4,'Visible','off')
set(handles.uitxStaticC1,'Enable','on')
set(handles.uitxStaticC2,'Enable','on')
set(handles.uitxStaticC3,'Enable','on')
set(handles.uitxStaticC4,'Enable','off')
set(handles.uitxStaticC1sub,'Enable','on')
set(handles.uitxStaticC2sub,'Enable','on')
set(handles.uitxStaticC3sub,'Enable','on')
set(handles.uitxStaticC4sub,'Enable','off')
case 4
set(handles.uitxC1,'Visible','on'); set(handles.uitxC1,'String',handles.strCircuit.vStage(curStage).csCCalc{1})
set(handles.uitxC2,'Visible','on'); set(handles.uitxC2,'String',handles.strCircuit.vStage(curStage).csCCalc{2})
set(handles.uitxC3,'Visible','on'); set(handles.uitxC3,'String',handles.strCircuit.vStage(curStage).csCCalc{3})
set(handles.uitxC4,'Visible','on'); set(handles.uitxC4,'String',handles.strCircuit.vStage(curStage).csCCalc{4})
set(handles.uitxStaticC1,'Enable','on')
set(handles.uitxStaticC2,'Enable','on')
set(handles.uitxStaticC3,'Enable','on')
set(handles.uitxStaticC4,'Enable','on')
set(handles.uitxStaticC1sub,'Enable','on')
set(handles.uitxStaticC2sub,'Enable','on')
set(handles.uitxStaticC3sub,'Enable','on')
set(handles.uitxStaticC4sub,'Enable','on')
otherwise, error('bad nCCalc')
end
switch nRCalc
case 0
set(handles.uitxR1,'Visible','off')
set(handles.uitxR2,'Visible','off')
set(handles.uitxR3,'Visible','off')
set(handles.uitxR4,'Visible','off')
set(handles.uitxStaticR1,'Enable','off')
set(handles.uitxStaticR2,'Enable','off')
set(handles.uitxStaticR3,'Enable','off')
set(handles.uitxStaticR4,'Enable','off')
set(handles.uitxStaticR1sub,'Enable','off')
set(handles.uitxStaticR2sub,'Enable','off')
set(handles.uitxStaticR3sub,'Enable','off')
set(handles.uitxStaticR4sub,'Enable','off')
case 1
set(handles.uitxR1,'Visible','on'); set(handles.uitxR1,'String',handles.strCircuit.vStage(curStage).csRCalc{1})
set(handles.uitxR2,'Visible','off')
set(handles.uitxR3,'Visible','off')
set(handles.uitxR4,'Visible','off')
set(handles.uitxStaticR1,'Enable','on')
set(handles.uitxStaticR2,'Enable','off')
set(handles.uitxStaticR3,'Enable','off')
set(handles.uitxStaticR4,'Enable','off')
set(handles.uitxStaticR1sub,'Enable','on')
set(handles.uitxStaticR2sub,'Enable','off')
set(handles.uitxStaticR3sub,'Enable','off')
set(handles.uitxStaticR4sub,'Enable','off')
case 2
set(handles.uitxR1,'Visible','on'); set(handles.uitxR1,'String',handles.strCircuit.vStage(curStage).csRCalc{1})
set(handles.uitxR2,'Visible','on'); set(handles.uitxR2,'String',handles.strCircuit.vStage(curStage).csRCalc{2})
set(handles.uitxR3,'Visible','off')
set(handles.uitxR4,'Visible','off')
set(handles.uitxStaticR1,'Enable','on')
set(handles.uitxStaticR2,'Enable','on')
set(handles.uitxStaticR3,'Enable','off')
set(handles.uitxStaticR4,'Enable','off')
set(handles.uitxStaticR1sub,'Enable','on')
set(handles.uitxStaticR2sub,'Enable','on')
set(handles.uitxStaticR3sub,'Enable','off')
set(handles.uitxStaticR4sub,'Enable','off')
case 3
set(handles.uitxR1,'Visible','on'); set(handles.uitxR1,'String',handles.strCircuit.vStage(curStage).csRCalc{1})
set(handles.uitxR2,'Visible','on'); set(handles.uitxR2,'String',handles.strCircuit.vStage(curStage).csRCalc{2})
set(handles.uitxR3,'Visible','on'); set(handles.uitxR3,'String',handles.strCircuit.vStage(curStage).csRCalc{3})
set(handles.uitxR4,'Visible','off')
set(handles.uitxStaticR1,'Enable','on')
set(handles.uitxStaticR2,'Enable','on')
set(handles.uitxStaticR3,'Enable','on')
set(handles.uitxStaticR4,'Enable','off')
set(handles.uitxStaticR1sub,'Enable','on')
set(handles.uitxStaticR2sub,'Enable','on')
set(handles.uitxStaticR3sub,'Enable','on')
set(handles.uitxStaticR4sub,'Enable','off')
case 4
set(handles.uitxR1,'Visible','on'); set(handles.uitxR1,'String',handles.strCircuit.vStage(curStage).csRCalc{1})
set(handles.uitxR2,'Visible','on'); set(handles.uitxR2,'String',handles.strCircuit.vStage(curStage).csRCalc{2})
set(handles.uitxR3,'Visible','on'); set(handles.uitxR3,'String',handles.strCircuit.vStage(curStage).csRCalc{3})
set(handles.uitxR4,'Visible','on'); set(handles.uitxR4,'String',handles.strCircuit.vStage(curStage).csRCalc{4})
set(handles.uitxStaticR1,'Enable','on')
set(handles.uitxStaticR2,'Enable','on')
set(handles.uitxStaticR3,'Enable','on')
set(handles.uitxStaticR4,'Enable','on')
set(handles.uitxStaticR1sub,'Enable','on')
set(handles.uitxStaticR2sub,'Enable','on')
set(handles.uitxStaticR3sub,'Enable','on')
set(handles.uitxStaticR4sub,'Enable','on')
otherwise, error('bad nRCalc')
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UpdateFilter_Z1P1k1 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function UpdateFilter_Z1P1k1(strCircuit)
% makes the overall strFilterObject Z1,P1,k reflect the individual stage's z1,p1,k
global strFilterObject
% setup
nBiquads=strCircuit.nBiquads;
bFirstOrderStage=strCircuit.bFirstOrderStage;
bGainStage=strCircuit.bGainStage;
nStages=strCircuit.nStages;
% find zeros
vZeros1=[];
vPoles1=[];
fK1=1;
for i=1:nBiquads
vZeros1 = [vZeros1; strCircuit.vStage(i).z1(:)];
vPoles1 = [vPoles1; strCircuit.vStage(i).p1(:)];
fK1=fK1*strCircuit.vStage(i).k1;
end
if bFirstOrderStage | bGainStage
vZeros1 = [vZeros1; strCircuit.vStage(nStages).z1];
vPoles1 = [vPoles1; strCircuit.vStage(nStages).p1];
fK1=fK1*strCircuit.vStage(nStages).k1;
end
strFilterObject.vZeros1=vZeros1;
strFilterObject.vPoles1=vPoles1;
strFilterObject.fK1=fK1;