Mercurial > hg > aimmat
view aim-mat/modules/bmm/pzfc/AGCdampStep.m @ 4:537f939baef0 tip
various bug fixes and changed copyright message
author | Stefan Bleeck <bleeck@gmail.com> |
---|---|
date | Tue, 16 Aug 2011 14:37:17 +0100 |
parents | 74dedb26614d |
children |
line wrap: on
line source
function [pdampsmod, agcstate] = AGCdampStep(detect, pdamps, ... agcepsilons, agcgains, agcstate, agcfactor); % % function [pdampsmod, agcstate] = AGCdampStep(detect, pdamps, % agcepsilons, agcgains, agcstate); % % update the dampings and agcstates based on present outputs % including 50% stereo coupling if two channels based on size of % agcstate is twice the number of channels if nargin < 6 agcfactor=12; end Nch = length(pdamps); Ntracks = size(detect,2); % two columns for stereo Nstages = length(agcepsilons); if length(detect)==0, Ntracks = 1; % mono default if size(agcstate,2)>Nstages Ntracks = round(size(agcstate,2)/Nstages); % pass in agcstate big % enough to do stereo end detect = DetectFun(0.0)*ones(Nch,1); %agcstate = 1.2*detect*ones(1,Ntracks*Nstages); % a detect-dependent %hack to initialize damping rep = 1+rem((1:Ntracks*Nstages)-1,Nstages); agcstate = 1.2*detect*agcgains(rep); % rep is like [1 2 3 4 1 2 3 4] detect = DetectFun(0.0)*ones(Nch,Ntracks); end agcepsleft = 0.3; % 0.15; agcepsright = 0.3; % 0.15; spacecoeffs = [agcepsleft, 1.0-agcepsleft-agcepsright, agcepsright]; for k = 1:Ntracks % track number (1 for mono, 2 for second channel) for j = 1:Nstages % stage number jj = j + (k-1)*Nstages; % index into state columns %spatial smoothing: agcavg = filter(spacecoeffs, 1, [agcstate(1,jj); agcstate(:,jj); ... agcstate(Nch,jj)]); agcavg = agcavg(3:(Nch+2)); %time smoothing: epsilon = agcepsilons(j); agcstate(:,jj) = agcavg*(1-epsilon) + epsilon*detect(:,k)*agcgains(j); end end %agcstate can't exceed 0.25, usually , with max detect being 0.5 % only INCREASE the damping over pdamp %agcfactor = 12; % 6.0; % 12.0; % now set above or as an argument offset = 1-agcfactor*DetectFun(0.0); % 0.7422 for DetectFun(0)=0.0215 % this makes the minimum damping (with 0 signal into AGC and agcstate being % equal to the DetectFun value at zero, which may be zero) equal the nominal for k = 1:Ntracks % track number (1 for mono, 2 for second channel) % pdampsmod(:,k) = pdamps.*min(1.5,(offset+agcfactor*... % (mean(agcstate')' + mean(agcstate(:,((k-1)*Nstages+1):k*Nstages)')')/2)); pdampsmod(:,k) = pdamps.*(offset+agcfactor*... (mean(agcstate')' + mean(agcstate(:,((k-1)*Nstages+1):k*Nstages)')')/2); % the above hack weights the track AGC and the average equally % for mono is same as just ...ofset+agcfactor*sum(agcstates')' end %plot([detect, pdamps, pdampsmod, agcstate, sum(agcstate')']) %drawnow