Matlab - Uso de las funciones "real" e "imag"

 
Vista:

Uso de las funciones "real" e "imag"

Publicado por José Carlos Vilela (7 intervenciones) el 11/04/2007 17:55:22
Mi problema es con dos funciones bien sencillas, real e imag. Estas funciones devuelven la parte real y la parte imaginaria de un número complejo, respectivamente. Sin embargo, cuando las uso fuera de la ventana de comandos de MATLAB, o sea, cuando las uso dentro de un M-file producen un mensaje de error que dice algo como esto: "subscript indice must either be real positive integer or logical". Esto me da la idea de que el problema está en el argumento que la función recibe, sin embargo, yo le paso un argumento correcto: un número complejo. La verdad es que es un error muy extraño porque la función trabaja correctamente cuando la saco del M-file y la ejecuto en la ventana de comandos de MATLAB. Agradeceré cualquier idea o sugerencia. Saludos a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Uso de las funciones

Publicado por Pumy (38 intervenciones) el 11/04/2007 19:58:20
Te sugiero que copies y pegues aquí esa parte del código para poder ayudarte a encontrar el problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por Antonio (32 intervenciones) el 11/04/2007 21:51:55
Sería interesante saber con que comando (o de que forma) haces la llamada de ese valor complejo en tu m-file. Si lo lees desde un archivo, lo introduces desde la ventana de comandos; utilizarás algún comando y despues le asignarás el valor o valores leidos a alguna variable a la que luego aplicarás "real" e "imag", no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por José Carlos Vilela (7 intervenciones) el 11/04/2007 22:48:09
Primero que todo muchas gracias por responder. Creo que pondré aquí en el foro, como bien me han sugerido, el fragmento de código donde hago uso de las funciones real e imag. Ahora mismo no tengo aquí el programa, pero lo pondré enseguida. Por otra parte, para ti Antonio, te diré que en mi programa calculo un grupo de valores complejos que luego guardo en un simple vector. Y por último, llamo a las funciones real e imag, y les paso como parámetro "uno a uno" los elementos de ese vector que contiene números complejos...así de simple. No leo nada de fichero, ni siquiera tomo valores de una interfaz gráfica (GUIDE), nada de eso, sencillamente mi programa es una simple función dentro de un M-file. Insisto en que es un error muy extraño pues llevo tiempo escribiendo programas en MATLAB y jamás había visto cosa igual. Prometo poner lo antes posible el fragmento de mi código, pero creo que mi problema no tiene solución: es imposible que ejecute con éxito cada una de las líneas de mi programa, una a una, desde la ventana de comandos y que luego dentro del M-file la ejecución se detenga justo en la línea en que uso "real" y "imag". Un abrazo a todos, pronto nos veremos nuevamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por Pumy (38 intervenciones) el 12/04/2007 19:31:18
Bueno, no sé qué debe hacer el programa, pero creo que a real e imag le podrías pasar el vector completo y te devolvería uno con la parte real o imaginaria de cada elemento.

De todas formas revisa bien, parece error de los subindices. Cuando lo pongas aquí te echo un vistazo.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por Antonio (32 intervenciones) el 12/04/2007 21:46:11
Ok, si no te digo lo contrario. Además, tal y como lo explicas parece una función muy simple. Es posible que Matlab no te permita hacer la operación que quieres (o de la forma que quieres).

Yo también llevo algún tiempo programando mis cosillas con Matlab y se que muchas veces puedes estar dando vueltas y vueltas a un código intentando solucionar un problema que parece irresoluble, y luego descubres con asombro que el error estaba en un pequeño detalle muy simple.

Bueno, es cuestión de echarle un vistazo...
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por José Carlos Vilela (7 intervenciones) el 16/04/2007 15:32:10
Hola a todos, y en espcial a Antonio y a Pumy. Bueno, a continuación pongo el fragmento de código donde uso las funciones real e imag..."resiuos" es un vector de números complejos. Para calcular ciertos coeficientes: B0,B1,A1,A2 necesitos las partes reales e imaginarias de esos números complejos guardados en "residuos". Es todo bien simple, no comprendo la razón de este contratiempo. El error lo da cuando llega a la línea:
B0=2*Tm*real(residuos(i))...espero noticias. Ah, por si acaso, pongo también el código completo de mi programa. Para darles una idea, este programa es para diseñar filtros digitales(para el procesamiento de digital de señales)usando la Aproximación de Chebyshev y el Método de la Respuesta Invariante al Impulso, si alguien conoce de esto entenderá, y si no pues no interesa, se puede entender todo sin conocer nada de procesamiento digital de señales. Saludos a todos:

FRAGMENTO:

for i=1:fix(N/2)
disp(i)
B0=2*Tm*real(residuos(i))
B1=-2*Tm*exp(real(polos(i))*Tm)*(real(residuos(i))...
*cos(imag(polos(i))*Tm)+imag(residuos(i))*sin(imag(polos(i))*Tm))
A1=-2*exp(real(polos(i))*Tm)*cos(imag(polos(i))*Tm)
A2=exp(2*real(polos(i))*Tm)
end

CODIGO COMPLETO:

function chebinvar(wc,wa,Ap,Aa,fm)
% fac: frecuencia analógica de corte(rad/s).
% faa: frecuencia analógica de atenuación(rad/s).
% faax: frecuencia analógica de atenuación normalizada.
% wc: fecuencia digital de corte(rad).
% wa: frecuencia digital de atenuación(rad).
% Ap: atenuacion en la banda de paso(dB).
% Aa: atenuación en la banda de atenuación(dB).
% fm: fecuencia de muestreo(Hz).

Tm=1/fm;
fac=wc/Tm;
faa=wa/Tm;
faax=faa/fac;

epsilon=sqrt(10^(-Ap/-10)-1);
Cn=sqrt((10^(-Aa/-10)-1)/epsilon^2);
n=acosh(Cn)/acosh(faax);
N=ceil(n); %Primer entero mayor.

%Calculando los polos de la función de sistema en Sx.
a=(1/N)*asinh(1/epsilon);
for i=N:2*N-1
real=sinh(a)*sin((2*i+1)*pi/(2*N));
imag=cosh(a)*cos((2*i+1)*pi/(2*N));
polosx(i-(N-1))=complex(real,imag);
end
polos=polosx*fac; %Desnormalizando los polos del plano Sx.

%Calculando las constantes Kx(residuos) de las fracciones simples.
%Nota: Los polos se multiplican por -1 porque los términos del denominador
%en la función de sistema son de la forma: (Sx-polosx).
coefden=[1 -1*polosx(1)];
for i=1:N-1
coefden=conv(coefden,[1 -1*polosx(i+1)]);
end
residuosx=residue(1,coefden);
residuosx=circshift(residuosx,[-1 1]); %Dando a los residuos el mismo orden de los polos.
residuos=residuosx*fac; %Desnormalizando los residuos del plano Sx.

% Calculando los coeficientes del filtro digital.
if rem(N,2)~=0
disp('Función de primer orden:')
B0=Tm*residuos(ceil(N/2))
A1=-1*exp(polos(ceil(N/2))*Tm)

disp('Funciones de segundo orden:')
for i=1:fix(N/2)
disp(i)
B0=2*Tm*real(residuos(i))
B1=-2*Tm*exp(real(polos(i))*Tm)*(real(residuos(i))...
*cos(imag(polos(i))*Tm)+imag(residuos(i))*sin(imag(polos(i))*Tm))
A1=-2*exp(real(polos(i))*Tm)*cos(imag(polos(i))*Tm)
A2=exp(2*real(polos(i))*Tm)
end
else
disp('Funciones de segundo orden:')
for i=1:fix(N/2)
disp(i)
B0=2*Tm*real(residuos(i))
B1=-2*Tm*exp(real(polos(i))*Tm)*(real(residuos(i))...
*cos(imag(polos(i))*Tm)+imag(residuos(i))*sin(imag(polos(i))*Tm))
A1=-2*exp(real(polos(i))*Tm)*cos(imag(polos(i))*Tm)
A2=exp(2*real(polos(i))*Tm)
end
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por Pumy (38 intervenciones) el 16/04/2007 18:38:45
El uso de la función parece correcto, como tú decías, probando con variables en la línea de comandos todo va bien, y según veo en el código, tanto Tm como residuos(i) son elementos simples.

Estoy casi seguro de que el problema está en el subíndice i, que se sale del array residuos. Veo que i va de 1 hasta fix(N/2), para que funcione siempre la longitud de residuos debe ser el entero más cercano a N/2, que puede ser el entero mayor. Para comprobar que el problema está aquí pon la siguiente línea justo antes de la que te da el error:

disp(residuos(i))

Y si te da error en esta ya sabes por qué es.

Yo he probado con unos coeficientes a voleo (1,2,3,4,5) y no me ha dado problema, pero puede que aparezca con otros coeficientes concretos que estés intentando usar tú.

Esto es sólo una intuición y a lo mejor no tiene sentido pero se me ocurre que en lugar de fix(N/2) uses floor(N/2) que redondea al entero menor.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por José Carlos Vilela (7 intervenciones) el 16/04/2007 22:53:40
Estimado Pumy, he probado con tus sugerencias y nada. El problema no es del índice, o sea, el problema no radica en que le estoy pasando un índice mayor que el soportado por él. Mira, prueba si puedes lo siguiente y verás claramente lo que digo:

Copia mi código completo en un M-file y ponle como nombre "chebinvar.m"
Ponlo en el directorio que desees y llámalo con los siguientes parámetros:

chebinvar(pi/6,pi/3.5,2.5,20,6000)

Fíjate en el error que da justo al llegar a la línea que te comentaba. El error lo da en la primera iteración del ciclo, o sea, que no es un error porque haya excedido el índice, sino que es un error en el uso de la función "real". El error literalmente es:

??? Subscript indices must either be real positive integers or logicals.

Te invito a que en un momentico pruebes lo que te digo...un abrazo para ti, José Carlos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Uso de las funciones

Publicado por Juan Camilo (2 intervenciones) el 11/11/2008 16:48:50
Me gustaría hacerles una consulta a uds que parecen buenos en la programación de Matlab. Estoy realizando mi proyecto de grado y ahora estoy necesitando de una función que me arroje la frecuencia (Hz) y la amplitud de una señal o vector, me explico:

[frecuencia,amplitud]=funcion(señal_o_vector);

Gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar