0001 function [gci goi] = sigma(lx,fs,fmax)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 if(nargin<3)
0040 fmax = 400;
0041 end
0042
0043
0044 fmin = 50;
0045 Tmin = 1/fmax;
0046 Tmax = 1/fmin;
0047 oqmin = 0.1;
0048 oqmax = 0.9;
0049
0050 gwlen = Tmin;
0051 fwlen=0.000;
0052
0053
0054 lx = lx/max(abs(lx));
0055
0056
0057 nlev = 3;
0058 nu = length(lx);
0059 nU=(2^nlev)*ceil(nu./(2^nlev));
0060 [Lo_D Hi_D] = wfilters('bior1.5','d');
0061 [swa swd] = swt([lx; zeros(nU-nu,1)],nlev,Lo_D,Hi_D);
0062 swa=swa(:,1:nu); swd=swd(:,1:nu);
0063 mp = prod(swd)';
0064 mp = [0;mp];
0065
0066
0067 nmp = mp;
0068 nmp(find(nmp>0)) = 0;
0069 crnmp = nthroot(nmp,3);
0070
0071 pmp = mp;
0072 pmp(find(pmp<0)) = 0;
0073 crpmp = nthroot(pmp,3);
0074
0075
0076 [gcic sew ngrdel ntoff] = xewgrdel(nmp,fs,gwlen,fwlen);
0077 ngrdel=-[zeros(ntoff,1); ngrdel(1:end-ntoff)];
0078 [goic sew pgrdel ptoff] = xewgrdel(pmp,fs,gwlen,fwlen);
0079 pgrdel=-[zeros(ptoff,1); pgrdel(1:end-ptoff)];
0080
0081
0082 gci = zeros(1,length(lx));
0083 gciall = zeros(1,length(lx));
0084 gciall(:) = NaN;
0085 gciall(round(gcic)) = 0.25;
0086
0087 goi = zeros(1,length(lx));
0088 goiall = zeros(1,length(lx));
0089 goiall(:) = NaN;
0090 goiall(round(goic)) = 0.25;
0091
0092
0093
0094
0095 mngrdel = (-((gwlen*fs)/2-1):(gwlen*fs)/2-1)';
0096 mngrdellen = length(mngrdel);
0097 cmngrdel = zeros(length(ngrdel),1);
0098
0099 for i=1:length(gcic)
0100 lbnd = round(gcic(i)-((gwlen*fs)/2-1));
0101 ubnd = lbnd+mngrdellen-1;
0102
0103 if ~( (lbnd<1) || (ubnd>length(ngrdel)) )
0104 nfv(i,1) = sum(crnmp(lbnd:ubnd));
0105 nfv(i,2) = min(crnmp(lbnd:ubnd));
0106 nfv(i,3) = sqrt( mean( (mngrdel-ngrdel(lbnd:ubnd)).^2 ) );
0107
0108 cmngrdel(lbnd:ubnd) = mngrdel;
0109 end
0110 end
0111
0112 nclust = 2;
0113 snfv = size(nfv);
0114
0115
0116 [mm,vv,ww]=gaussmix(nfv,var(nfv)/100,[],nclust,'kf');
0117
0118
0119 [y I] = min(mm(:,1));
0120
0121
0122 for i=1:nclust
0123 [m_,v_,w_,g,f,ll(i,:)]=gaussmix(nfv,[],0,mm(i,:),vv(i,:),ww(i,:));
0124 end
0125 [m,in]=max(ll);
0126
0127 close all;
0128 naccept = [];
0129 nreject = [];
0130 for i=1:snfv(1)
0131 if (in(i) == I)
0132 naccept = [naccept; nfv(i,:)];
0133 else
0134 nreject = [nreject; nfv(i,:)];
0135 end
0136 end
0137
0138
0139 for i=1:length(nfv)
0140 if (in(i) == I)
0141 gci(round(gcic(i))) = 0.5;
0142 end
0143 end
0144
0145
0146 if(length(gci)>2)
0147
0148 fgci = find(gci);
0149
0150 if ( (fgci(2)-fgci(1)) > Tmax*fs)
0151 fgci = fgci(2:end);
0152 end
0153
0154 i=2;
0155 while(i<length(fgci)-1)
0156 if ( ((fgci(i)-fgci(i-1))>Tmax*fs) && ((fgci(i+1)-fgci(i))>Tmax*fs) )
0157 fgci = [fgci(1:i-1) fgci(i+1:end)];
0158 end
0159 i = i+1;
0160 end
0161
0162 if ( (fgci(end)-fgci(end-1)) > Tmax*fs)
0163 fgci = fgci(1:end-1);
0164 end
0165
0166 gci = zeros(1,max(fgci));
0167 gci(fgci) = 0.5;
0168 end
0169
0170
0171
0172 mpgrdel = (-((gwlen*fs)/2-1):(gwlen*fs)/2-1)';
0173 mpgrdellen = length(mpgrdel);
0174 cmpgrdel = zeros(length(pgrdel),1);
0175
0176 for i=1:length(goic)
0177 lbnd = round(goic(i)-((gwlen*fs)/2-1));
0178
0179 ubnd = min(lbnd+mpgrdellen-1,length(crpmp));
0180
0181 if ~( (lbnd<1) || (ubnd>length(pgrdel)) )
0182 pfv(i,1) = sum(crpmp(lbnd:ubnd));
0183 pfv(i,2) = max(crpmp(lbnd:ubnd));
0184 pfv(i,3) = sqrt( mean( (mpgrdel-pgrdel(lbnd:ubnd)).^2 ) );
0185
0186 cmpgrdel(lbnd:ubnd) = mpgrdel;
0187 end
0188 end
0189
0190 nclust = 2;
0191 spfv = size(pfv);
0192
0193
0194 [mm,vv,ww]=gaussmix(pfv,var(pfv)/100,[],nclust,'kf');
0195
0196
0197 [y I] = max(mm(:,1));
0198
0199
0200 ll = [];
0201 for i=1:nclust
0202 [m_,v_,w_,g,f,ll(i,:)]=gaussmix(pfv,[],0,mm(i,:),vv(i,:),ww(i,:));
0203 end
0204 [m,in]=max(ll);
0205
0206 paccept = [];
0207 preject = [];
0208 for i=1:spfv(1)
0209 if (in(i) == I)
0210 paccept = [paccept; pfv(i,:)];
0211 else
0212 preject = [preject; pfv(i,:)];
0213 end
0214 end
0215
0216
0217 for i=1:length(pfv)
0218 if (in(i) == I)
0219 goi(round(goic(i))) = 0.75;
0220 end
0221 end
0222
0223
0224
0225
0226 goiprefilt = goi;
0227 goifilt = zeros(size(goi));
0228 gciind = find(gci);
0229 Tprev = Tmax;
0230 prev = 0;
0231 nofirst = 0;
0232 for i=2:length(gciind)
0233 lbnd = gciind(i-1);
0234 ubnd = gciind(i);
0235 T = ubnd-lbnd;
0236 if(T>Tmax*fs)
0237 T = Tprev;
0238 end
0239 I = find(goi( round(lbnd+(1-oqmax)*T):round(lbnd+(1-oqmin)*T) ));
0240 if(~isempty(I))
0241 prev = round(I(1)+(1-oqmax)*T-1);
0242 goifilt(round(I(1)+lbnd+(1-oqmax)*T-1)) = 0.5;
0243 else
0244 if(prev>0)
0245 if( (lbnd+prev) < gciind(i) )
0246 goifilt(lbnd + prev-1) = 0.5;
0247 else
0248 goifilt( gciind(i)-1) = 0.5;
0249 end
0250 end
0251 if(i==2)
0252 nofirst = 1;
0253 end
0254 end
0255 if(nofirst && (prev>0))
0256 goifilt(gciind(1)+prev-1) = 0.5;
0257 nofirst = 0;
0258 end
0259 Tprev = T;
0260 end
0261
0262 lbnd = gciind(end);
0263 I = find(goi( round(lbnd+(1-oqmax)*T):min(round(lbnd+(1-oqmin)*T),length(goi))));
0264 if(~isempty(I))
0265 goifilt(round(I(1)+lbnd+(1-oqmax)*T-1)) = 0.5;
0266 else
0267 if(prev>0)
0268 goifilt(lbnd + prev) = 0.5;
0269 end
0270 end
0271 goi = goifilt;
0272
0273 gci = find(gci>0);
0274 goi = find(goi>0);
0275
0276
0277 function [tew,sew,y,toff]=xewgrdel(u,fs,gwlen,fwlen)
0278
0279 error(nargchk(2,4,nargin));
0280
0281 if(nargin < 4)
0282 fwlen = voicebox('dy_fwlen');
0283 end
0284 if (nargin < 3)
0285 gwlen = voicebox('dy_gwlen');
0286 end
0287
0288
0289
0290 gw=2*floor(gwlen*fs/2)+1;
0291 ghw=window('hamming',gw,'s');
0292 ghw = ghw(:);
0293 ghwn=ghw'.*(gw-1:-2:1-gw)/2;
0294
0295 u2=u.^2;
0296 yn=filter(ghwn,1,u2);
0297 yd=filter(ghw,1,u2);
0298 yd(abs(yd)<eps)=10*eps;
0299 y=yn(gw:end)./yd(gw:end);
0300 toff=(gw-1)/2;
0301 fw=2*floor(fwlen*fs/2)+1;
0302 if fw>1
0303 daw=window('hamming',fw,'s');
0304 y=filter(daw,1,y)/sum(daw);
0305 toff=toff-(fw-1)/2;
0306 end
0307 [tew,sew]=zerocros(y,'n');
0308
0309 tew=tew+toff;