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.