problema en funcion
Publicado por oscar (15 intervenciones) el 24/04/2008 11:36:46
Hola, tengo un problemilla es esta funcion, a ver si le echais un vistazo y me decis porque no funciona:
function [BS,LT,LNT] = Componentes_tonales(F,UA,MAP,LBC,sampling_frequency)
if sampling_frequency == 0 | 1
BS = zeros(512,1);
LML = [];
c = 1;
for k = 3:500,
if (F(k)>F(k-1) & F(k)>=F(k+1))
LML(c,1) = k;
LML(c,2) = F(k);
c = c+1;
end
end
LT = [];
c = 1;
if not(isempty(LML))
for i = 1:length(LML(:,1)),
k = LML(i,1);
tonal = 1;
if (2<k & k<63)
J = [-2,2];
elseif (63<=k & k<127)
J = [-3,-2,2,3];
elseif (127<=k & k<255)
J = [-6:-2,2:6];
elseif (255<=k & k<=500)
J = [-12:-2,2:12];
else
tonal = 0;
end
for j = J,
tonal = tonal & (F(k)-F(k+j) >= 7);
end
if tonal
LT(c,1) = k;
LT(c,2) = 10*log10(10^(F(k-1)/10)+10^(F(k)/10)+10^(F(k+1)/10));
BS(k) = 1; % Bandera de componente tonal = 1.
for j = [J,-1,1],
BS(k+j) = 3; % Bandera de componente irrelevante = 3.
end
c = c+1;
end
end
end
LNT = [];
for i = 1:26,
POT = -200;
PESO = 0; % Usado para calcular la media geométrica de la banda crítica.
for k = UA(LBC(i,1),1):UA(LBC(i+1,1),1)-1,
if (BS(k) == 0) % Bandera de componente no examinada = 0.
POT = 10*log10(10^(POT/10)+10^(F(k)/10));
PESO = PESO+10^(F(k)/10)*(UA(MAP(k),2)-i);
BS(k) = 3; % Bandera de componente irrelevante = 3.
end
end
if (POT <= -200)
IND = round(mean(UA(LBC(i,1),1)+UA(LBC(i+1,1),1)));
else
IND = UA(LBC(i,1),1)+round(PESO/10^(POT/10)*...
(UA(LBC(i+1,1),1)-UA(LBC(i,1),1)));
end
if (IND<1)
IND = 1;
end
if (IND>512)
IND = 512;
end
if (BS(IND) == 1)
IND = IND+1;
end
LNT(i,1) = IND;
LNT(i,2) = POT;
BS(IND) = 2;
end
elseif sampling_frequency == 2
BS = zeros(512,1);
LML = [];
c = 1;
for k = 3:500,
if (F(k)>F(k-1) & F(k)>=F(k+1))
LML(c,1) = k;
LML(c,2) = F(k);
c = c+1;
end
end
LT = [];
c = 1;
if not(isempty(LML))
for i = 1:length(LML(:,1)),
k = LML(i,1);
tonal = 1;
if (2<k & k<63)
J = [-2,2];
elseif (63<=k & k<127)
J = [-3,-2,2,3];
elseif (127<=k & k<255)
J = [-6:-2,2:6];
elseif (255<=k & k<=500)
J = [-12:-2,2:12];
else
tonal = 0;
end
for j = J,
tonal = tonal & (F(k)-F(k+j) >= 7);
end
if tonal
LT(c,1) = k;
LT(c,2) = 10*log10(10^(F(k-1)/10)+10^(F(k)/10)+10^(F(k+1)/10));
BS(k) = 1; % Bandera de componente tonal = 1.
for j = [J,-1,1],
BS(k+j) = 3; % Bandera de componente irrelevante = 3.
end
c = c+1;
end
end
end
LNT = [];
for i = 1:24,
POT = -200;
PESO = 0; % Usado para calcular la media geométrica de la banda crítica.
for k = UA(LBC(i,1),1):UA(LBC(i+1,1),1)-1,
if (BS(k) == 0) % Bandera de componente no examinada = 0.
POT = 10*log10(10^(POT/10)+10^(F(k)/10));
PESO = PESO+10^(F(k)/10)*(UA(MAP(k),2)-i);
BS(k) = 3; % Bandera de componente irrelevante = 3.
end
end
if (POT <= -200)
IND = round(mean(UA(LBC(i,1),1)+UA(LBC(i+1,1),1)));
else
IND = UA(LBC(i,1),1)+round(PESO/10^(POT/10)*...
(UA(LBC(i+1,1),1)-UA(LBC(i,1),1)));
end
if (IND<1)
IND = 1;
end
if (IND>512)
IND = 512;
end
if (BS(IND) == 1)
IND = IND+1;
end
LNT(i,1) = IND;
LNT(i,2) = POT;
BS(IND) = 2;
end
end
------------------------------------------
Perdon por pegar semejante parrafada, el problema es el siguiente.
La variable sampling_frequency se la meto a la funcion desde un programa principal exterior. El valor qu etoma dicha variable entra bien en la funcion ya que ya lo he comprobado. El problema es que le meta un 0, 1 o 2 siempre me entra en el primer if aunque le meta un dos y no se porque.
Gracias, ciao.
function [BS,LT,LNT] = Componentes_tonales(F,UA,MAP,LBC,sampling_frequency)
if sampling_frequency == 0 | 1
BS = zeros(512,1);
LML = [];
c = 1;
for k = 3:500,
if (F(k)>F(k-1) & F(k)>=F(k+1))
LML(c,1) = k;
LML(c,2) = F(k);
c = c+1;
end
end
LT = [];
c = 1;
if not(isempty(LML))
for i = 1:length(LML(:,1)),
k = LML(i,1);
tonal = 1;
if (2<k & k<63)
J = [-2,2];
elseif (63<=k & k<127)
J = [-3,-2,2,3];
elseif (127<=k & k<255)
J = [-6:-2,2:6];
elseif (255<=k & k<=500)
J = [-12:-2,2:12];
else
tonal = 0;
end
for j = J,
tonal = tonal & (F(k)-F(k+j) >= 7);
end
if tonal
LT(c,1) = k;
LT(c,2) = 10*log10(10^(F(k-1)/10)+10^(F(k)/10)+10^(F(k+1)/10));
BS(k) = 1; % Bandera de componente tonal = 1.
for j = [J,-1,1],
BS(k+j) = 3; % Bandera de componente irrelevante = 3.
end
c = c+1;
end
end
end
LNT = [];
for i = 1:26,
POT = -200;
PESO = 0; % Usado para calcular la media geométrica de la banda crítica.
for k = UA(LBC(i,1),1):UA(LBC(i+1,1),1)-1,
if (BS(k) == 0) % Bandera de componente no examinada = 0.
POT = 10*log10(10^(POT/10)+10^(F(k)/10));
PESO = PESO+10^(F(k)/10)*(UA(MAP(k),2)-i);
BS(k) = 3; % Bandera de componente irrelevante = 3.
end
end
if (POT <= -200)
IND = round(mean(UA(LBC(i,1),1)+UA(LBC(i+1,1),1)));
else
IND = UA(LBC(i,1),1)+round(PESO/10^(POT/10)*...
(UA(LBC(i+1,1),1)-UA(LBC(i,1),1)));
end
if (IND<1)
IND = 1;
end
if (IND>512)
IND = 512;
end
if (BS(IND) == 1)
IND = IND+1;
end
LNT(i,1) = IND;
LNT(i,2) = POT;
BS(IND) = 2;
end
elseif sampling_frequency == 2
BS = zeros(512,1);
LML = [];
c = 1;
for k = 3:500,
if (F(k)>F(k-1) & F(k)>=F(k+1))
LML(c,1) = k;
LML(c,2) = F(k);
c = c+1;
end
end
LT = [];
c = 1;
if not(isempty(LML))
for i = 1:length(LML(:,1)),
k = LML(i,1);
tonal = 1;
if (2<k & k<63)
J = [-2,2];
elseif (63<=k & k<127)
J = [-3,-2,2,3];
elseif (127<=k & k<255)
J = [-6:-2,2:6];
elseif (255<=k & k<=500)
J = [-12:-2,2:12];
else
tonal = 0;
end
for j = J,
tonal = tonal & (F(k)-F(k+j) >= 7);
end
if tonal
LT(c,1) = k;
LT(c,2) = 10*log10(10^(F(k-1)/10)+10^(F(k)/10)+10^(F(k+1)/10));
BS(k) = 1; % Bandera de componente tonal = 1.
for j = [J,-1,1],
BS(k+j) = 3; % Bandera de componente irrelevante = 3.
end
c = c+1;
end
end
end
LNT = [];
for i = 1:24,
POT = -200;
PESO = 0; % Usado para calcular la media geométrica de la banda crítica.
for k = UA(LBC(i,1),1):UA(LBC(i+1,1),1)-1,
if (BS(k) == 0) % Bandera de componente no examinada = 0.
POT = 10*log10(10^(POT/10)+10^(F(k)/10));
PESO = PESO+10^(F(k)/10)*(UA(MAP(k),2)-i);
BS(k) = 3; % Bandera de componente irrelevante = 3.
end
end
if (POT <= -200)
IND = round(mean(UA(LBC(i,1),1)+UA(LBC(i+1,1),1)));
else
IND = UA(LBC(i,1),1)+round(PESO/10^(POT/10)*...
(UA(LBC(i+1,1),1)-UA(LBC(i,1),1)));
end
if (IND<1)
IND = 1;
end
if (IND>512)
IND = 512;
end
if (BS(IND) == 1)
IND = IND+1;
end
LNT(i,1) = IND;
LNT(i,2) = POT;
BS(IND) = 2;
end
end
------------------------------------------
Perdon por pegar semejante parrafada, el problema es el siguiente.
La variable sampling_frequency se la meto a la funcion desde un programa principal exterior. El valor qu etoma dicha variable entra bien en la funcion ya que ya lo he comprobado. El problema es que le meta un 0, 1 o 2 siempre me entra en el primer if aunque le meta un dos y no se porque.
Gracias, ciao.
Valora esta pregunta
0