apuntesdeprogramacion dsp

14
Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal -v1.1- Marzo de 2012 1 PROGRAMACION CON MATLAB 1 PARTE: INTRODUCION 1.1 QUE ES MATLAB. Matlab es un software de cálculo Matemático, análisis de datos, desarrollo de algoritmos y simulación de modelados. Matlab es una familia de programas incluido dentro de uno, más una variedad de tollboxes. Los toolboxes son una colección especial de programas MATLAB es una utilidad matemática, originalmente concebida para realizar cálculos numéricos con vectores y matrices (de ahí el nombre, MATrix LABoratory), aunque en las sucesivas versiones ha ido incorporando multitud de aplicaciones nuevas. 1.2 SCRIPT and FUNCTION FILES (Archivos M) En Matlab nosotros podemos escribir programas y realizar operaciones de dos formas. - Directamente en el Command Window, escribiendo en el prompt. - O también podemos escribir código de programa dentro los archivos m M-File. Los archivos m, siempre se guardan con extensión (.m). En Matlab existe dos tipos de archivos m, los script files y los function files. Mas adelante utilizaremos en ejemplos para que entendamos de mejor forma. 1.3 CREANDO Y USANDO SCRIPT FILES. Dentro los archivos m es común utilizar el símbolo % para escribir comentarios que aclaren los programas que realizamos. Todo lo que se escribe después del símbolo % el compilador Matlab no lo reconoce como código. Los comentarios en un programa son muy importantes ya que nos puede aclarar sectores de código. Creamos nuestro primer script file (archivo m). Ejemplo 1. %----MI PRIMER PROGRAMA SCRIPT FILE------- %Este programa calcula el Sin "seno" de un %vector y grafica el resultado %...............Example E1................ x = 1:4; y = sin(x); disp(y) stem(x,y) title('Secuencia discreta Sinusoidal'); xlabel('x[n]'); ylabel('y[n]') %............Fin del programa............. Al ejecutar nos da la siguiente respuesta en Command Window. 0.8415 0.9093 0.1411 -0.7568. ● La grafica de salida

Upload: moises-juan-h-a

Post on 04-Jan-2016

219 views

Category:

Documents


0 download

DESCRIPTION

DSP, procesamiento digital de senal, apuntes

TRANSCRIPT

Page 1: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 1

PROGRAMACION CON MATLAB 1 PARTE: INTRODUCION 1.1 QUE ES MATLAB.

Matlab es un software de cálculo Matemático, análisis de datos, desarrollo de algoritmos y simulación de modelados. Matlab es una familia de programas incluido dentro de uno, más una variedad de tollboxes. Los toolboxes son una colección especial de programas

MATLAB es una utilidad matemática, originalmente concebida para realizar cálculos numéricos con vectores y matrices (de ahí el nombre, MATrix LABoratory), aunque en las sucesivas versiones ha ido incorporando multitud de aplicaciones nuevas.

1.2 SCRIPT and FUNCTION FILES (Archivos M)

En Matlab nosotros podemos escribir programas y realizar operaciones de dos formas. - Directamente en el Command Window, escribiendo en el prompt. - O también podemos escribir código de programa dentro los archivos m M-File.

Los archivos m, siempre se guardan con extensión (.m). En Matlab existe dos tipos de archivos m, los script files y los function files. Mas adelante utilizaremos en ejemplos para que entendamos de mejor forma.

1.3 CREANDO Y USANDO SCRIPT FILES.

Dentro los archivos m es común utilizar el símbolo % para escribir comentarios que aclaren los programas que realizamos. Todo lo que se escribe después del símbolo % el compilador Matlab no lo reconoce como código. Los comentarios en un programa son muy importantes ya que nos puede aclarar sectores de código.

Creamos nuestro primer script file (archivo m). Ejemplo 1. %----MI PRIMER PROGRAMA SCRIPT FILE------- %Este programa calcula el Sin "seno" de un %vector y grafica el resultado %...............Example E1................ x = 1:4; y = sin(x); disp(y) stem(x,y) title('Secuencia discreta Sinusoidal'); xlabel('x[n]'); ylabel('y[n]') %............Fin del programa.............

● Al ejecutar nos da la siguiente respuesta en Command Window.

0.8415 0.9093 0.1411 -0.7568.

● La grafica de salida

Page 2: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 2

1 1.5 2 2.5 3 3.5 4-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1Secuencia discreta Sinusoidal

x[n]

y[n]

● Otra forma de ejecutar el programa es directamente en el prompt >> example1 0.8415 0.9093 0.1411 -0.7568

● Si necesitamos saber que es lo que realiza nuestro programa desde promt escribimos lo siguiente:

>> help example1 ----MI PRIMER PROGRAMA SCRIPT FILE------- Este programa calcula el Sin "seno" de un vector y grafica el resultado ...............Example E1................

Practica. i) Describa cada línea de Código del anterior ejemplo. ii) modifique x para introducir un vector de 1 a 10 con saltos de 0.1, cambie la amplitud a 5 y observe su resultado.

Nota. Para nombrar a los archivos puede utilizar letras Mayúsculas o minúsculas (nosotros utilizaremos minúscula y si el nombre tiene mas de dos palabras por ejemplo calculoDeRaices.m separaremos cada palabra por una letra mayúscula. Debe tener en cuenta para los nombres que en inicio no debe escribir símbolos ni números. Para separar palabras puedes utilizar barra baja (_), y no debes exceder los 31 caracteres.

Page 3: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 3

1.4 DATOS DE ENTRADA Y SALIDA.

Matlab contiene varios comandos para obtener datos de entrada y mostrar datos de salida, para que nuestras respuestas sean más legibles. En la siguiente tabla se describe dichos comandos.

Comandos en Matlab Descripción

disp(A) Muestra el contenido, pero no el nombre del array A. disp(‘texto’) Muestra un texto string.

x = input(‘texto’)

Entrada de dato el cual se almacena en la variables x

x = input(‘texto’,’s’)

Entrada de dato de tipo string el cual se almacena en la variables x.

k = menu(‘titulo’,’op1’, ‘Op2’,...)

Ejemplo 2. %-----------PROGRAMA SCRIPT FILE---------- %Este programa suma dos numeros introducidos %por el promt y nos muestra texto %...............Example 2................ disp('Buen dia!!!...Estudiante de MATLAB') disp('..................................') disp('CACULADORA BASICA') x1 = input('ingrese el primer dato: '); x2 = input('ingrese el segundo dato: '); suma = x1 + x2 disp('Gracias por utilizar este programa') %............Fin del programa.............

● Al ejecutar nos da la siguiente respuesta en Command Window.

Buen dia!!!...Estudiante de MATLAB .................................. CACULADORA BASICA ingrese el primer dato: 5 ingrese el segundo dato: 5

suma =

10

Gracias por utilizar este programa Ejercicios

i) Escribir un programa que realice las operaciones básicas como suma, resta, multiplicación y división entre dos valores numéricos, debe aclarar en el programa introduciendo texto con el comando disp. Estos dos datos deben ser introducidos por el prompt.

ii) Usted escriba y proponga un programa que resuelva un problema matemático, utilizar todo lo aprendido hasta el momento.

Page 4: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 4

1.5 Operadores Relacionales.

Son las siguientes.

Operadores relacionales

Descripción

< Menor que. <= Menor igual que. > Mayor que >= Mayor igual que. == Igual que. ~= Distinto que.

MATLAB tiene seis operadores relacionales que realiza comparaciones entre arrays (vectores y matrices). Note que el operador “igual que” lleva dos signos “igual” la operación que realiza es la de comparar dos variables, ósea si son iguales o distintos, si el primer caso fuera verdadero nos devuelve 1 en caso contrario 0. Este tipo de respuestas son llamados lógicos y pueden ser almacenados en alguna otra variable.

Ejemplo 3.

3.1) El Command Window escribimos lo siguiente

3.2)

También podemos utilizar los operadores relacionales para extraer resultados de los arrays, por ejemplo si x = [6 3 9 11], y = [14 2 9 13] si realizamos la siguiente comparación z = x(x<y) el resultado nos dará z = [6 11].

Page 5: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 5

Al realizar la comparación de los arrays elemento por elemento los valores por verdad “salen” y se almacenan en z. No olvidar que los operadores relacionales comparan dos arrays elemento por elemento

Ejercicios.

1.- Dado dos arrays, x = [-9, -6, 0, 2, 5] e y = [-10, -6, 2, 4, 6].Utilice los 6 operadores relacionales. Con distintos ejemplos y analizar sus respuestas.

2.- Dado los siguientes arrays, x = [-15, -8, 9, 8, 5] e y = [-20, 12, -4, 8, 9]. ¿Cual es el resultado de las siguientes operaciones? Analice sus respuestas.

a) ( )yxz <= aa) ( )yxxz <=

b) ( )yxz >= bb) ( )yxyz >=

c) ( )yxz == ~ cc) ( )yxxz == ~

d) ( )yxz ===

e) ( )4−>= yz

1.6 VARIABLES LOCALES Y GLOBALES.

1.6.1 Variables Locales. Generalmente las variables en los archivos m son de tipo locales y se definen usualmente al inicio de cada script o en su defecto en variables de entrada. Todas las variables dentro la función son borrados después que finaliza la ejecución, exceptuando las variables de salida que se almacenan en memoria. 1.5.2 Variables Globales. Las variables Globales son aquellos que se consideran en todo el programa (Archivo m y Funciones). El comando Global declara que es una variable global La sintaxis es de la siguiente forma.

Global var_1 var_2 … var_n;

La palabra reservada global indica que las variables son globales var_1 a var_n son los nombres de las variables globales.

1.7 METODOLOGIA PARA SOLUCIONAR PROBLEMAS.

Para resolver un problema es importante tener un Plan de acción. La metodología general para resolver problemas son los siguientes:

Pasos para resolver problemas de Ingeniería.

1. Entender el propósito del problema. 2. Recolectar más información con respecto al problema. 3. Escribir el problema y la posible solución pseudocodigo. 4. Representar en diagrama de Flujos la solución correcta 5. Realizar pruebas del diagrama de flujo y corregir u optimizar si es posible.

Page 6: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 6

6. Traducir el diagrama de flujo en código de MATLAB.

Regla de Oro. Para resolver problemas relativamente largos y complejos debe pensar en lo siguiente “divide y vencerás”.

1.8 DEPURACION DE ERRORES.

El proceso de depuración es la búsqueda y borrado de errores en nuestro programa. Los errores usualmente están dentro las siguientes categorías.

1. Error de sintaxis, por ejemplo la omisión de paréntesis y comas etc. MATLAB usualmente detecta los errores más obvios y los muestra en el Command Window localizando dicho error.

2. Errores debidos a malos procedimientos matemáticos llamados runtime errors. Estos no necesariamente ocurren en el momento de la ejecución sino que dependen de los datos de entrada que nosotros introducimos un ejemplo común de esto es introducir el cero como un dato.

1.9 ESTILO DE PROGRAMACION.

En programación es muy importante seguir un estilo de programación para que nuestros programas sean ordenados, completos y muy legibles.

Estructura sugerida para la creación de M- Files y Script Files.

1. Sección de Comentarios. Debe contener lo siguiente: - El nombre del programa y cualquier palabra clave sobre el programa. - Una breve explicación de lo que hace el programa. - La fecha creada y el nombre del “creador”. - La definición de las variables internas y como de entrada y de salida.

2. Programa.

El programa debe tener un orden secuencial. Se deben definir bien las variables internas y/o entrada y salida, cada script y/o línea de código relativamente desconocido debe tener un comentario aclaratorio. Para tener una mejor “visión” del programa debemos realizar separaciones entre bloques completos utilizando comentarios y símbolos.

3. Información Extra.

En esta sección podemos hacer la descripción completa de nuestro programa en forma de comentario, la forma en que se debe ejecutar valores máximos y mínimos que se deben introducir (si son datos de entrada). Esta sección no obligatoria pero de mucha ayuda si copias el programa para que otra persona pueda entenderlo.

Page 7: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 7

2. FUNCIONES FUNCTION Files

Las Funciones son programas (subprogramas) las cuales tienen cierta independencia y realizan una operación específica. Se introducen datos, procesa los datos y devuelve resultados. Las Funciones son parte de un “todo”, ósea de un programa principal tipo M el cual lo “llama” cada vez que lo requiera.

En Matlab las function files son muy usadas, las Funciones aceptan argumentos de entrada y producen argumentos de salida, la sintaxis general es la siguiente:

Function [out_var1, out_var2,…] = myfunctionName [in_var1, in_var2, …]

Las Funciones definidas por el usuario se crean dentro los archivos m. cada una de estas funciones debe comenzar con una Línea de definición que contenga:

La palabra funcion Una variable (o muchas variables) que defina la Salida de la función. Un nombre de la función (que es la que se guarda por defecto) Una variable (o muchas variables) que se use como argumentos de Entrada

Por ejemplo:

funcion OutputData = my_funcion(InputData)

Las funciones requieren argumento de entrada “InputData”, que de acuerdo al tipo de función requerida es un tipo de dato ingresado desde Command Window. Luego ejecuta las líneas de código de la función llamada “my_function”. Y genera una salida “OutputData” que puede ser visualizada directamente desde promt de Command Window.

Para ejecutar una función desde el Promt se escribe de la siguiente forma >> outputData=my_function(InputData) Algunas consideraciones a tomar en cuenta:

El nombre de la Función debe comenzar con una Letra no usa números o símbolos especiales.

El nombre no debe ser muy largo y si quisiéramos separar dos textos del nombre

usamos barra baja “_”. Por ejemplo: poly_grafica. Ejemplo 4. Desarrollo function y = poly(x) %Esta funcion calcula el valor de un polinomio %de tercer orden y = 3*x.^3+5*x.^2-2*x+1;

● Ejecutando la función en el Promt tenemos

Parámetros de Salida

Nombre de la Función

Parámetros de entrada

Palabra clave

Page 8: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 8

>> y = poly(2)

y = 41

● O también

>> poly(2)

ans = 41

● Para introducir varios datos de entrada, tenemos

>> y = poly([2 6 4])

y = 41 817 265 Ejemplo 5

Realizar un programa Completo con archivos m y funciones para que realice la conversión de grados a radianes, radianes a grados. Los datos deben ingresarse desde teclado.

Desarrollo.

● Primero realizamos las funciones para el cálculo matemático. function radianes = gAr(grados) %Esta funcion conviente los grados %en Radianes %--------------------------------- radianes = grados*(pi/180); end function grados = rAg(radianes) %Esta funcion conviente los radianes %en grados %--------------------------------- grados = radianes*(180/pi); end

● Programa Main_1 (example 5) %.............PROGRAMA MAIN_1............. %Este programa realiza la conversion de %de Grados a radianes %los datos se ingresan desde teclado %By Moises Juan Huallpa DSP-2012 %----------------------------------------- clc;clear all;

Page 9: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 9

grados = input('Ingrese un dato grados: '); radianes = gAr(grados); disp('En Radianes es:') disp('----------------------------------') disp(radianes) disp('----------------------------------') %-----------------------------------------

● Ejecute el programa y analice sus resultados. ii) Luego, ingrese varios datos en un vector observe los resultados. iii) Realice mejoras en el programa main_1, para que realice las dos conversiones en solo un programa. Usted optime para que funciones considerando todas las posibilidades de Error.

Desarrollo.(Example 6) %.............PROGRAMA MAIN_2............. %Este programa realiza la conversion de %de Grados a radianes y Radianes a Grados %los datos se ingresan desde teclado %By Moises Juan Huallpa DSP-2012 %----------------------------------------- clc;clear all; disp('QUE OPERACION QUIERE REALIZAR:') disp('Para la convercion de grados a radianes, Escriba 1') disp('Para la convercion de radianes a grados, Escriba 2') in = input('eligo: '); if in == 1 grados = input('ingrese un dato en grados: '); radianes = gAr(grados); disp(radianes) elseif in ==2 radianes = input('ingrese un dato en radianes: '); grados = rAg(radianes); disp(grados) else disp('No ingreso dato'); end %-----------------------------------------

Analice el programa y observe los resultados.

Page 10: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 10

3. TIPOS DE ESTRUCTURAS.

Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias sentencias dependiendo de validez de una expresión. En otras palabras, ‘Si se cumple la condición (...), se debe hacer (...). De lo contrario, si la condición no se cumple, se debe hacer (...)’. Los operandos condicionales if-else y switch se utilizan en las operaciones condicionales. Una sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a ser ejecutadas. Estructuras Repetitivas. A menudo es necesario repetir una cierta operación varias veces en el programa. Un conjunto de comandos que se repiten es denominado un bucle de programa. Cuántas veces se ejecutará, es decir cuánto tiempo el programa se quedará en el bucle, depende de las condiciones de salir del bucle, mas adelante se estudiaran con detalle.

3.1 Estructuras Condicionales. 3.1.1. Estructura IF Idea Básica.- Si la condición es verdadera true realiza la operación statements sale de IF y continúa con el programa, se expresa de la siguiente forma:

if (expression) statements

end

● Si tenemos una condicional con dos posibles respuestas entonces; si la primera expresión es verdadera se ejecuta Statements1 (declaración 1) y por falso false se ejecuta Statements y luego sale del programa.

if expression1

Statements1 else statements end

● Si tenemos dos condicionales en el programa; Si la primera expresión es verdadera se ejecuta statements1, luego se evalúa la segunda expresión y se ejecuta statements2 y por falso false, si no cumple las anteriores condiciones entonces se ejecuta statements y luego sale del programa.

if expression1 Statements1 elseif expression2 Statements2 else statements end Diagrama de Flujo.-

Ejercicios de Aplicación. i) Grafique los Diagramas en bloque de las condicionales IF estudiadas.

Page 11: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 11

Ejemplos de Análisis y de comprensión

a) Tenemos dos valores, utilizar las condicional IF para realizar comparaciones y luego que muestre el resultado

%:::::::::::EJEMPLO 7 USO DE IF::::::::::: %Programa para entender el USO DE LA %de condicional IF ELSE %Aux.Doc.: Moises Juan Huallpa DSP-2012 %----------------------------------------- a = 5; b = 7; if (a == b) disp('a y b son iguales') else disp('a y b son distintos') end %-----------------------------------------

Ejercicios de Aplicación. i) Utilice todas las condicionales y analice sus resultados. ii) Luego modifique el programa para poder introducir datos por teclado. iii) Utilice tres variables a, b y c encontrar el mayor de los tres datos, mostrar los resultados en pantalla. iv) Escribir un programa para la solución de ecuaciones de 2do. Grado, considere todas las posibilidades y algunos errores al introducir cualquier dato de las variables. Investigación. i) Investigue el uso de las funciones str2double, errordlg, questdlg. Para el uso de en programación con MATLAB

3.1.2 Estructura SWITCH

Idea básica.- El operador switch permite elegir entre varias opciones

Switch variable

Case expression_1 Opracion1

Case expression_2

Opracion2 . . . Case expression_N

OpracionN Otherwise Operación se evalua en otros casos

end

La estructura Switch permite seleccionar un código en particular, si alguna de las condiciones son iguales a una de las expresiones, los comandos son evaluados.

Diagrama de Flujo.-

Investigue la forma de representa switch en diagrama de flujo para Matlab

Page 12: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 12

Ejemplos de Análisis y de comprensión

a) Example 8

%::::::::EJEMPLO DE CONDICIONAL SWITCH:::::: %.......................................... %Aux.Doc.: Moises Juan Huallpa Alanoca %LAB. Procesamiento Digital de Señal %------------------------------------------- dato = input('Ingrese un dato: '); switch dato case 1 disp('------------------------------') disp('El numero es 1') disp('------------------------------') case 2 disp('------------------------------') disp('El numero es 2') disp('------------------------------') case 3 disp('------------------------------') disp('El numero es 3') disp('------------------------------') otherwise disp('------------------------------') disp('Numero fuera de Rango') disp('------------------------------') end

Analice el programa y observe los resultados. 3.2 Estructuras Repetitivas. 3.2.1 BUCLES o LOOPs

Un LOOP es una estructura de repetición y realiza cálculos de tiempos o conteos numéricos. Cada repetición de un LOOP es un paso. En MATLAB existen dos tipos de LOOPs que son for y while. El primero es usado para contar un numero determinado de pasos y el segundo para girar en un proceso y terminar si se satisface una condición

3.2.2 Estructura FOR (Reiterativo PARA) Concepto.- La forma general esta dada por:

El block de comandos entre for y end para todos los valores que se describe en el rango de la expresión.

Page 13: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 13

En concreto es una declaración repetitiva que especifica cantidad de veces que realiza una acción. Diagrama de Flujo.-

Investigue la forma de representa for en diagrama de flujo para Matlab Ejemplos de Análisis y de comprensión

a) Example 9 %:::::::::::::EJEMPLO DE LOOPs FOR:::::::::::::: %............................................... %Ejemplo para entender el funcionamiento de FOR %Aux.Doc.: Moises Juan Huallpa Alanoca %LAB. Procesamiento Digital de Señal %----------------------------------------------- clc; clear all; for k=1:5 disp(k) end %----------------------------------------------

● Ejecute el programa y observe los resultados

● Otra forma de Ejecute el programa es Paso por Paso, observando el comportamiento dentro el mismo programa. Para ello usamos la siguiente herramienta en Matlab

● Y ejecutemos el programa paso a paso, al mismo tiempo observemos el prompt.

Page 14: ApuntesdeProgramacion DSP

Aux.Doc: Moisés Juan Huallpa Alanoca Procesamiento Digital de Señal

-v1.1- Marzo de 2012 14

b) Example 10. Ahora que pasaría si limitamos un loop dentro de OTRO loop. FOR anidado %:::::::::::::EJEMPLO DE LOOPs FOR:::::::::::::: %............................................... %Ejemplo para entender el funcionamiento de FOR %Anidado %Aux.Doc.: Moises Juan Huallpa Alanoca %LAB. Procesamiento Digital de Señal %----------------------------------------------- for k =1:6 for m =1:3 disp(k) end end %-------------------------------------------------

● Ejecute el programa, y observe el resultado en el prompt

Nota. Analicemos en forma detalla que ocurre internamente: Muestra los valores del 1 al 6, cada valor es “evaluado” 3 veces (tiempos).

Ejercicio.

1. Use el loop for para determinar la suma de los primeros 10 términos de la siguiente Serie 35k con .10,...3,2,1=k

__________________________________________________

El discípulo se quejaba constantemente a su Maestro Zen: «No haces más que ocultarme el secreto último del Zen». Y se resistía a creer las consiguientes negativas del Maestro. Un día, el Maestro se lo llevó a pasear con él por el monte. Mientras paseaban, oyeron cantar a un pájaro. «¿Has oído el canto de ese pájaro?», le preguntó el Maestro. «Sí», respondió el discípulo. «Bien; ahora ya sabes que no te he estado ocultando nada». «Sí», asintió. el discípulo.

Si realmente has oído cantar a un pájaro, si realmente has visto un árbol..., deberías saber (más allá de las palabras y los conceptos).

El Canto del Pájaro (Anthony de Mello)