Tuesday, December 15, 2009

Editando sonido con Octave

Octave es un software muy parecido a Matlab, pero libre. Trae consigo un sin fin de funciones matemáticas, sobre todo para trabajar con matrices.
Una de las muchas cosas interesantes que se pueden hacer con este software es cargar un archivo de audio en una matriz y editarlo.

Un archivo de audio tiene tres propiedades :

Muestras por segundo (Hz)
Número de bits por muestra
Cantidad de canales.

Usando la función wavread se puede leer un archivo WAV. Un sonido monofónico se guardará en una matriz de una columna, un sonido stereo una matriz de dos columnas, etc.

Sonido original:



Efecto de eco :


#archivo entrada, archivo salida, sample rate(ej. 44100,22050,etc)
function ecoAudio(nombre_wav, salida_wav, samplerate_hz)
wav_matrix = wavread(nombre_wav); #leer wav
desp = int32( size(wav_matrix)(1)/20 );
m2 = shift(wav_matrix,desp);
wav_matrix = wav_matrix + m2;
wavwrite(wav_matrix,samplerate_hz,salida_wav);
endfunction


Aplicando efecto de eco:




Cambio de rapidez :


#archivo entrada, archivo salida,sample rate,rapidez
function rapidezAudio(nombre_wav, salida_wav, samplerate_hz, rapidez)
wav_matrix = wavread(nombre_wav);
wavwrite(wav_matrix, samplerate_hz*rapidez, salida_wav);
endfunction


Reproduciendo a la mitad de su velocidad:



Reproduciendo al doble de su velocidad:


Reproducir al revés :



#archivo entrada, archivo salida, sample rate
function revertirAudio(nombre_wav, salida_wav,samplerate_hz)
wav_matrix = wavread(nombre_wav);
wav_matrix = flipud(wav_matrix); #revertir filas
wavwrite(wav_matrix,samplerate_hz,salida_wav);
endfunction


Reproduciendo al revés:

Wednesday, December 2, 2009

Usando un entero como un arreglo de caracteres

Si tenemos una variable de tipo int por lo general ocupará 4 bytes de memoria, los que podremos usar literalmente a nuestro antojo. Por ejemplo podemos usar este espacio como un arreglo de 4 elementos de 1 byte cada uno.

Ejemplo uso de un entero como un arreglo de caracteres:



#include <stdio.h>

int main() {

int num;
num=0;
( (char *)&num )[0] = 7;
( (char *)&num )[1] = 3;
printf("%i %i\n",( (char*)&num )[0],( (char*)&num )[1]);
*( (char *)&num ) = 2;
*( (char *)&num + 1) = 4;
printf("%i %i\n",( (char*)&num )[0],( (char*)&num )[1]);
printf("%d\n",num);
}


Lo anterior imprime :

7 3
2 4
1026

La variable num queda como 1026 porque:
| 0000 0000 |0000 0000 | 0000 0100 | 0000 0010 |
| 0 | 0 | 4 | 2 |

La idea de este ejemplo es comprender mejor cómo funciona el lenguaje porque en la práctica usar un entero como un arreglo de char no hace que el código sea más simple.

Thursday, November 5, 2009

Problema de ingenio

Vas por un camino en medio de la selva que luego se dividirá en dos caminos, uno lleva a una tribu amigable y el otro lleva a una tribu canibal. Te encuentras con dos aborígenes de los cuales uno es de la tribu canibal y el otro es de la tribu amigable. El canibal NUNCA dice la verdad y el amigable SIEMPRE dice la verdad, no sabes cual de los dos es el canibal y sólo puedes hacer una pregunta que será respondida por los dos aborígenes.
¿Qué pregunta debes hacer para saber cuál es el camino que te conviene seguir?

Sunday, October 11, 2009

Programación y ajedrez

El verano del 2008 comencé a programar un motor de ajedrez en C, que probablemente será un chimpacé al lado de cualquier otro motor. Aún no lo termino, pues le dedico tiempo solo los veranos y unos escazos días.
En los primeros programas de ajedrez el tablero se representaba usando un arreglo, luego se comenzó a usar una técnica que revolucionó el mundo del ajedrez, los bitboards.
Un bitboard es una representación del tablero usando un entero de 8 bytes, dado que cada byte tiene 8 bits se pueden representar los 64 casilleros del tablero con un bitboard.
La ventaja de esta representación es que los cálculos son mucho menos costosos en memoria y CPU porque un bitboard pesa mucho menos que un arreglo de 64 carácteres y se usan operaciones a nivel de bit como el AND,OR,XOR y shift para muchos de los cálculos.

Verificar si un casillero del tablero se encuentra ocupado por una pieza usando bitboards:

typedef uint64_t bitboard;
...
/* square number 0-63 (a1-h8) */
int isOccuped(bitboard board, int square) {

if( board & (1<< square) ) {
return 1;
}
return 0;
}

Para revisar si una casilla del tablero esta ocupada usando un arreglo tendriamos que recorrer el arreglo e ir revisando casilla por casilla, lo cual resulta más costoso y menos elegante.

Wednesday, October 7, 2009

Aritmética de punteros

Estaba indeciso acerca de que escribir en mi descuidado blog y decidí que a partir de hoy comenzaré a postear algunos fragmentos de código.
Sé que es muy fácil encontrar buenos ejemplos acerca del tema de hoy, pero más de alguno lo habrá olvidado y lo recordará por casualidad al llegar aquí.
C permite sumar o restar números enteros a un puntero, desplazando la dirección a la que este apunta la cantidad de bytes que ocupa el tipo de dato del puntero multiplicada por el número entero que se le ha sumado o restado.


#include <stdio.h>
#include <stdlib.h>

int main() {

int* intArray;
/* (int *) indica al compilador que en la memoria reservada
se almacenaran enteros
malloc (memory allocate) reserva (sizeof(int)*3) bytes de memoria
sizeof(int) retorna la cantidad de bytes que ocupa un int
(en mi caso 4 bytes)
inicialmente intArray apunta al primer byte de memoria reservada
*/
intArray = (int *) malloc(sizeof(int)*3);
*intArray = 1; //equivalente a intArray[0] = 1
//desplazar direccion apuntada por intArray sizeof(int) bytes
intArray = intArray + 1;
*intArray = 2;
intArray = intArray +1;
*intArray = 3;
printf("%i %i %i\n",*(intArray - 2),*(intArray - 1),*intArray);
/* si llamamos inmediatamente a free(intArray) obtendremos un error
en tiempo de ejecucion pues intArray ya no apunta al primer byte
de memoria reservada*/

//intArray debe apuntar al 1er byte de la memoria reservada
intArray = intArray - 2;
free(intArray);

}


Muestra en pantalla:
1 2 3

Friday, February 27, 2009

Almacenando tus imagenes en Flickr

Estoy usando Joomla y el componente Morfeoshow para referenciar a un album de Flickr desde otro sitio web, lo cual me evita usar el ancho de banda y espacio de hosting para mostrar una galería de imagenes, además de darme la comodidad de administrar las fotos en flickr, que tiene una interfaz muy comoda.
Me cree una cuenta en Flickr, cree un album, y llené un formulario para solicitar un application key que es una clave que tienes que poner en la aplicación que accederá a las fotos de un album flickr, el uso de la API de Flickr es gratuito cuando no es con fines comerciales.
En cuanto al componente Morfeoshow, que sirve para hacer galerías fotográficas en Joomla, tuve un pequeño problema por un molesto boton "retroceder" que salía abajo de la galería. En mi caso no lo necesitaba asi que lo desactivé.
Para desactivar el boton retroceder se debe cambiar la línea:
if ($params_morfeo['back'] == 0) por if ($params_morfeo['back'] == 1)
Que está en components/com_morfeoshow/morfeoshow.html.php en la línea 552 (versión 1.2.0 de morfeoshow).

Saturday, February 21, 2009

Virtualbox, que maravilla

Hoy probé virtualbox, un software de virtualización que te permite crear una maquina virtual para instalar algún sistema operativo y probarlo desde el sistema que estas usando sin necesidad de reiniciar ni finalizar ningún proceso.
Me impresionó su facilidad de uso, tiene un asistente esplendido con el cual en menos de 2 minutos tienes una maquina virtual configurada, porque te pregunta cuanta memoria ram y disco le asignaras a la nueva maquina, sin entrar en mayores detalles. Luego puedes cargar el sistema operativo a instalar desde la unidad de dvd o una imagen ISO.
Yo le instalé windows xp profesional sin necesidad de salir de ubuntu, sin configurar nada pude navegar en internet explorer y escribir este artículo.
Hace años que no uso vmware, asi que no puedo comparar, pero si puedo recomendar esta fabulosa herramienta llamada virtualbox.

Wednesday, February 11, 2009

Notebook nuevo

Estoy posteando desde mi nuevo notebook. Un Lenovo N500, con un diseño parecido al de mi antiguo IBM t23 que me acompañó por 3 años.
Necesitaba con urgencia actualizarme, pues mi antiguo notebook me tenía muy limitado.
¡Muy feliz con la compra!

Monday, February 9, 2009

Palabras

Nuestra lengua es bella y abundante, he oído decir una y otra vez, es una afirmación atrevida para alguien que no habla más de dos idiomas, cuando en el mundo hay más de 6000.
Tal vez la belleza radica en nuestras ideas y por ende cada ser humano ama su idioma. Por mi parte no hablo ningún idioma a la perfección, pues desconozco una gran parte de los recursos disponibles y mal utilizo otros.
Que compleja, que deslumbrante y que útil es nuestra capacidad para comunicarnos. Aumentemos nuestro vocabulario, abramos nuevas puertas en el laberinto del lenguaje.

profiláctico
, ca.

(Del gr. προφυλακτικός; de προφυλάσσειν, prevenir, precaver).

1. adj. Med. Dicho de una persona o de una cosa: Que puede preservar de la enfermedad.

2. m. preservativo.

3. f. Med. Parte de la medicina que tiene por objeto la conservación de la salud y la preservación de la enfermedad.


moción.

(Del lat. motĭo, -ōnis).

1. f. Acción y efecto de mover o ser movido.

2. f. Alteración del ánimo.

3. f. Inspiración interior que Dios ocasiona en el alma.

4. f. Proposición que se hace o sugiere en una junta que delibera.

5. f. En las lenguas semíticas, nombre que se da a las vocales y a los signos que las representan.

6. f. Gram. Expresión del género mediante un cambio de terminación.


díscolo, la.

(Del lat. dyscŏlus, y este del gr. δύσκολος).

1. adj. Desobediente, que no se comporta con docilidad. U. t. c. s.


Fuente: www.rae.es

Wednesday, February 4, 2009

¿Cómo se impulsan los cohetes?

Los cohetes se impulsan gracias a la aplicación de la tercera ley de Newton: Para cada acción ocurre siempre una reacción igual y opuesta (en cuanto a fuerza). Por ejemplo si tu ejerces un golpe fuerte sobre una pared, tu mano a su vez recibe un golpe de igual magnitud y de dirección opuesta al golpe recibido por la pared.
El ejemplo clásico para explicar como se impulsa un cohete es el de un globo que se desinfla. El aire que es expulsado del globo empuja al aire que esta fuera del globo y el aire que esta fuera del globo empuja al globo hacia adelante.
En el caso de un cohete que va en el espacio, no tenemos aire que empujar, pues esta en el vacío, pero el cohete al quemar combustible produce gases que a su vez son empujados por los nuevos gases que van siendo producidos al instante, produciendo un par de acción reacción entre el gas que fue producido y el que está siendo producido.

Referencias:

Artículo de www.selecciones.com
Ebook de Paul A. Tipler

Sunday, January 18, 2009

Mis refranes favoritos

  • Ningún viento es favorable a quien no sabe donde va.
  • Lo que no te mata, te hace más fuerte.
  • Cuando realmente deseas algo, todo el universo conspira para que puedas conseguirlo.
  • No hay mal que dure cien años.
  • Todo tiene solución, menos la muerte.
  • Al pobre no des el pescado. Enseñale a pescar.
  • Dicen que la fe mueve montañas, pero la dinamita ha demostrado ser más efectiva.
  • El mentiroso y el ladrón, siempre salen pillados.

Thursday, January 15, 2009

mysql error 1045

Hoy instalé mysql y obtuve un error al intentar acceder como root con los parametros -u root -p. La única forma de poder acceder a una base de datos era invocando mysql desde una consola con root.
Para solucionar el problema probe restablecer la contraseña de root, crear otro usuario, etc.
Sucedía una y otra vez lo siguiente:

mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)


Donde obviamente yo tipeaba la contraseña correcta.

Finalmente la forma de evitar el problema fue desinstalar mysql con la opción --purge para que remueva todos los ficheros de configuración, e instalarlo de nuevo.

apt-get remove --purge mysql-server-5.0
apt-get install mysql-server-5.0

Tuesday, January 6, 2009

Diferencia entre Voltaje y Amperaje

La unidad de voltaje o potencial es el [volt] y la unidad del amperaje es el amperio [A].
Un volt = J/C, Un Joule por cada Coulomb, donde Joule es energía y Coulomb es carga.
Un Amperio = C/s, Un Coulomb por cada segundo.
Sabemos que la electricidad es el flujo de electrones, donde cada electrón aporta con una porción diminuta de carga.
Luego podríamos hacer la siguiente analogía: Imaginemos un ejercito de soldados, donde cada uno lleva una mochila con energía en su espalda.
La cantidad de soldados que pasa por unidad de tiempo es equivalente a los amperios. La cantidad de energía que lleva cada soldado en su mochila es correspondiente al voltaje o potencial.
Cuando un soldado pasa por un pantano pierde energía, entonces se gasta el voltaje, luego el pantano sería una resistencia.

Saturday, January 3, 2009

pcmcia usb 2.0

Me han regalado un disco duro externo Simpletech de 500 GB , un regalo muy útil, pues con 30 GB de disco poco podía tener.
Al conectar el disco al pcmcia de 4 puertos usb 2.0 que tengo instalado en mi IBM t23, este no era detectado ni encendía su luz, buscando un poco me percate de que para los dispositivos que requieren mayor potencia debo conectar un transformador a la tarjeta pcmcia.
Dejé el transformador que venía con la pcmcia y que nunca usé en Valparaíso; Estoy a 10 horas de distancia de allí.
Googleando un poco me encontré con que la tarjeta pcmcia necesita una fuente de 5V y por lo menos 2A para poder alimentar dispositivos que gastan más energía. Entonces se me ocurrió la idea de usar una vieja fuente AT para resolver el problema. Pues dispone de una salida de 5V (cable rojo) y 12V (cable amarillo).
Con mis pobres conocimientos de electrónica me armé de un cable con un jack dc que saqué de un eliminador de pilas y lo conecté a los cables rojo y negro de la fuente (cables de los conectores que se usan para alimentar discos duros y lectores de dvd). Además cómo la fuente no tenía el interruptor, uní los cables negro con cafe y blanco con azul para que al enchufar la fuente encienda.
Gracias a lo anterior he podido usar mi disco externo y ahorrarme comprar un transformador de 5V.
Algunas moralejas que aprendí acerca de fuentes de alimentación:
El voltaje de la fuente debe ser el mismo que el requerido por el circuito a alimentar.
El amperaje de la fuente debe ser mayor o igual al requerido por el circuito a alimentar, entre más amperaje tenga la fuente más útil puede resultar, pues puede entregar una mayor potencia y alimentar una mayor gama de aparatos.
Recordando lo que aprendí en física:

V = R*I (V = Volts, R=Ohms I=Amperios)
Si despejamos la corriente tenemos que:
I = V/R
La resistencia depende del circuito que estamos alimentando y el voltaje depende de la fuente de alimentación. Luego la corriente requerida por el circuito se ajusta al voltaje de la fuente y a la resistencia del circuito, por lo tanto solo importa que el voltaje de la fuente sea igual al requerido. Pues el circuito pide los amperios que necesita a la fuente.
Si la fuente tiene menos amperios que los necesitados por el circuito, no sirve, pues se puede estropear la fuente y el circuito no obtendrá los amperios
necesarios para su correcto funcionamiento.
P = V*I, viendo las unidades, se tienen J/c * c/s =J/s=Watts!
La tarjeta pcmcia requiere 5V y 2A, por lo tanto gasta 10 Watts.