107 lines
2.3 KiB
Matlab
107 lines
2.3 KiB
Matlab
function Lim = PQdataBoundary (WAV, Nchan, StartS, Ns)
|
|
% Search for the data boundaries in a file
|
|
% StartS - starting sample frame
|
|
% Ns - Number of sample frames
|
|
|
|
% P. Kabal $Revision: 1.1 $ $Date: 2003/12/07 13:34:10 $
|
|
|
|
PQ_L = 5;
|
|
Amax = 32768;
|
|
NBUFF = 2048;
|
|
PQ_ATHR = 200 * (Amax / 32768);
|
|
|
|
% Search from the beginning of the file
|
|
Lim(1) = -1;
|
|
is = StartS;
|
|
EndS = StartS + Ns - 1;
|
|
while (is <= EndS)
|
|
Nf = min (EndS - is + 1, NBUFF);
|
|
x = PQgetData (WAV, is, Nf);
|
|
for (k = 0:Nchan-1)
|
|
Lim(1) = max (Lim(1), PQ_DataStart (x(k+1,:), Nf, PQ_L, PQ_ATHR));
|
|
end
|
|
if (Lim(1) >= 0)
|
|
Lim(1) = Lim(1) + is;
|
|
break
|
|
end
|
|
is = is + NBUFF - (PQ_L-1);
|
|
end
|
|
|
|
% Search from the end of the file
|
|
% This loop is written as if it is going in a forward direction
|
|
% - When the "forward" position is i, the "backward" position is
|
|
% EndS - (i - StartS + 1) + 1
|
|
Lim(2) = -1;
|
|
is = StartS;
|
|
while (is <= EndS)
|
|
Nf = min (EndS - is + 1, NBUFF);
|
|
ie = is + Nf - 1; % Forward limits [is, ie]
|
|
js = EndS - (ie - StartS + 1) + 1; % Backward limits [js, js+Nf-1]
|
|
x = PQgetData (WAV, js, Nf);
|
|
for (k = 0:Nchan-1)
|
|
Lim(2) = max (Lim(2), PQ_DataEnd (x(k+1,:), Nf, PQ_L, PQ_ATHR));
|
|
end
|
|
if (Lim(2) >= 0)
|
|
Lim(2) = Lim(2) + js;
|
|
break
|
|
end
|
|
is = is + NBUFF - (PQ_L-1);
|
|
end
|
|
|
|
% Sanity checks
|
|
if (~ ((Lim(1) >= 0 & Lim(2) >= 0) | (Lim(1) < 0 & Lim(2) < 0)))
|
|
error ('>>> PQdataBoundary: limits have difference signs');
|
|
end
|
|
if (~(Lim(1) <= Lim(2)))
|
|
error ('>>> PQdataBoundary: Lim(1) > Lim(2)');
|
|
end
|
|
|
|
if (Lim(1) < 0)
|
|
Lim(1) = 0;
|
|
Lim(2) = 0;
|
|
end
|
|
|
|
%----------
|
|
function ib = PQ_DataStart (x, N, L, Thr)
|
|
|
|
ib = -1;
|
|
s = 0;
|
|
M = min (N, L);
|
|
for (i = 0:M-1)
|
|
s = s + abs (x(i+1));
|
|
end
|
|
if (s > Thr)
|
|
ib = 0;
|
|
return
|
|
end
|
|
|
|
for (i = 1:N-L) % i is the first sample
|
|
s = s + (abs (x(i+L-1+1)) - abs (x(i-1+1))); % L samples apart
|
|
if (s > Thr)
|
|
ib = i;
|
|
return
|
|
end
|
|
end
|
|
|
|
%----------
|
|
function ie = PQ_DataEnd (x, N, L, Thr)
|
|
|
|
ie = -1;
|
|
s = 0;
|
|
M = min (N, L);
|
|
for (i = N-M:N-1)
|
|
s = s + abs (x(i+1));
|
|
end
|
|
if (s > Thr)
|
|
ie = N-1;
|
|
return
|
|
end
|
|
|
|
for (i = N-2:-1:L-1) % i is the last sample
|
|
s = s + (abs (x(i-L+1+1)) - abs (x(i+1+1))); % L samples apart
|
|
if (s > Thr)
|
|
ie = i;
|
|
return
|
|
end
|
|
end
|