<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>It should work... &#187; Matlab</title>
	<atom:link href="http://vierito.es/wordpress/tag/matlab/feed/" rel="self" type="application/rss+xml" />
	<link>http://vierito.es/wordpress</link>
	<description>Cuando cualquier trasto es útil</description>
	<lastBuildDate>Sat, 09 Jul 2011 02:34:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Descodificar tonos DTMF usando Matlab</title>
		<link>http://vierito.es/wordpress/2009/11/25/descodificar-tonos-dtmf-usando-matlab/</link>
		<comments>http://vierito.es/wordpress/2009/11/25/descodificar-tonos-dtmf-usando-matlab/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 01:16:50 +0000</pubDate>
		<dc:creator>vierito5</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[DTMF]]></category>
		<category><![CDATA[FFT]]></category>
		<category><![CDATA[Fourier]]></category>
		<category><![CDATA[Matlab]]></category>

		<guid isPermaLink="false">http://vierito.es/wordpress/?p=710</guid>
		<description><![CDATA[Ya vimos como crear tonos DTMF usando Matlab y han pedido en un par de comentarios [1] [2] cómo se haría a la inversa, así que aquí va He cogido el script para generar los tonos del otro post y lo he cambiado para los pitidos duren 40ms (que se resume a cambiar que use [...]]]></description>
			<content:encoded><![CDATA[<p>Ya vimos como <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDEvMTUvbGxhbWFuZG8tcG9yLXRlbGVmb25vLWNvbi1tYXRsYWIv">crear tonos DTMF usando Matlab</a> y han pedido en un par de comentarios [<a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDEvMTUvbGxhbWFuZG8tcG9yLXRlbGVmb25vLWNvbi1tYXRsYWIvI2NvbW1lbnQtOTIw">1</a>] [<a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDEvMTUvbGxhbWFuZG8tcG9yLXRlbGVmb25vLWNvbi1tYXRsYWIvI2NvbW1lbnQtMTA5OQ==">2</a>] cómo se haría a la inversa, así que aquí va <img src='http://vierito.es/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>He cogido el script para generar los tonos del otro post y lo he cambiado para los pitidos duren 40ms (que se resume a cambiar que use 320 muestras en lugar de 1200 para cada pitido o silencio), para que sea un poco más real. El wav que voy a usar será el siguiente: <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzExL3Jpbmcud2F2">ring.wav</a></p>
<p>Empezamos, ¿qué necesitamos? Cada pitido estará compuesto por una pareja de tonos así que para saber qué número es deberemos reconocer las dos frecuencias principales que tienen los pitidos, y conocer la frecuencia viene a ser lo mismo que saber el periodo.</p>
<p>Hace un tiempo hice una práctica de Tratamiento Digital de la Señal en la que se hacían cosas de estas, uno de los códigos no es mío, está indicado. El resto los hicimos <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL21vdW5zdHJ1b2RlbGFzZ2FsbGV0YXMuYmxvZ3Nwb3QuY29t">Rafa</a> y yo en su día.</p>
<p>Aprovechándonos de la Transformada de Fourier:</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">function</span> <span style="color: #080;">&#91;</span>P,f<span style="color: #080;">&#93;</span>=periodograma<span style="color: #080;">&#40;</span>x,N<span style="color: #080;">&#41;</span>
<span style="color: #228B22;">% [P f]=periodograma(x,N)</span>
<span style="color: #228B22;">% Calcula N muestras del periodograma de las muestras en x</span>
<span style="color: #228B22;">% N debe ser &gt; que length(x)</span>
<span style="color: #228B22;">%</span>
<span style="color: #228B22;">% P: Periodograma propiamente</span>
<span style="color: #228B22;">% f frecuencias correspondientes</span>
&nbsp;
k=<span style="color: #33f;">0</span>:N-<span style="color: #33f;">1</span>;
f=k./N;
&nbsp;
L=<span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span>;
P=<span style="color: #33f;">1</span>/L*<span style="color: #080;">&#40;</span><span style="color: #0000FF;">fft</span><span style="color: #080;">&#40;</span>x,N<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>.^<span style="color: #33f;">2</span>;</pre></div></div>

<p>Pero lo propio será usar un programa que use <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24=">ventanas</a>  para su propósito:</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">function</span> <span style="color: #080;">&#91;</span>P,f<span style="color: #080;">&#93;</span>=periodmodif<span style="color: #080;">&#40;</span>x,ventana,N<span style="color: #080;">&#41;</span>
<span style="color: #228B22;">% [P ,f]=periodmodif(x,ventana,N)</span>
<span style="color: #228B22;">%</span>
<span style="color: #228B22;">% Calcula N muestras del periodograma modificado de las muestras en x</span>
<span style="color: #228B22;">% N debe ser &gt; que length(x)</span>
<span style="color: #228B22;">%</span>
<span style="color: #228B22;">% P: Periodograma propiamente</span>
<span style="color: #228B22;">% f frecuencias correspondientes</span>
&nbsp;
<span style="color: #0000FF;">if</span> N &lt;= <span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span>
   <span style="color: #0000FF;">error</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'N debe ser &gt; que length(x)'</span><span style="color: #080;">&#41;</span>;
<span style="color: #0000FF;">else</span>
   k=<span style="color: #33f;">0</span>:N-<span style="color: #33f;">1</span>;
   f=k./N;
&nbsp;
   L=<span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span>;
   m=<span style="color: #33f;">0</span>:L-<span style="color: #33f;">1</span>;
&nbsp;
   U=<span style="color: #33f;">1</span>/L*<span style="color: #080;">&#40;</span><span style="color: #0000FF;">sum</span><span style="color: #080;">&#40;</span>ventana<span style="color: #080;">&#40;</span>m+<span style="color: #33f;">1</span><span style="color: #080;">&#41;</span>.^<span style="color: #33f;">2</span><span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>;
   P=<span style="color: #33f;">1</span>/<span style="color: #080;">&#40;</span>L*U<span style="color: #080;">&#41;</span>*<span style="color: #0000FF;">abs</span><span style="color: #080;">&#40;</span><span style="color: #0000FF;">fft</span><span style="color: #080;">&#40;</span>x.*ventana,N<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>.^<span style="color: #33f;">2</span>;
<span style="color: #0000FF;">end</span></pre></div></div>

<p>Cargamos el fichero <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzExL3Jpbmcud2F2">ring.wav</a></p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;">&gt;&gt; <span style="color: #080;">&#91;</span>x,fs,nbits<span style="color: #080;">&#93;</span>= <span style="color: #0000FF;">wavread</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'ring.wav'</span><span style="color: #080;">&#41;</span>
&gt;&gt; t=<span style="color: #33f;">0</span>:<span style="color: #33f;">1</span>/fs:<span style="color: #33f;">1</span>/fs*<span style="color: #080;">&#40;</span><span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span>-<span style="color: #33f;">1</span><span style="color: #080;">&#41;</span>;
&gt;&gt; <span style="color: #0000FF;">plot</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span></pre></div></div>

<p><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzExL3JpbmcucG5n"><img src="http://vierito.es/wordpress/wp-content/uploads/2009/11/ring-480x360.png" alt="ring" title="ring" width="480" height="360" class="aligncenter size-medium wp-image-719" /></a></p>
<p>Ahora tendremos que calcular de cuanto es nuestra ventana mínima. La separación mínima entre tonos es de 320 muestras (que además en este caso es la misma entre todos los tonos) luego la frecuencia digital será 320 / fs = 320/8000 = 0.04</p>
<p>Y aquí un poco de teoría sobre ventanas gracias a los <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3VzZXJzLmFsbGllZG1vZHMubmV0L35mYWx1Y28vYXB1bnRlc3Bhay8=">Apuntes de Pak</a>:</p>
<p><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzExL3ZlbnRhbmFzX0xURFNfcGFrLlBORw=="><img src="http://vierito.es/wordpress/wp-content/uploads/2009/11/ventanas_LTDS_pak.PNG" alt="ventanas_LTDS_pak" title="ventanas_LTDS_pak" width="463" height="548" class="aligncenter size-full wp-image-720" /></a></p>
<p>Pero no voy a aburriros con ella así que nos quedaremos en que vamos a usar una ventana tipo Hamming, luego necesitaremos una longitud de ventana L = 4 / resolución = 4 / 0.04 = 100 muestras</p>
<p>Ahora vamos a determinar los dígitos, y para ello vamos a hacer uso de la siguiente función para búscar máximos:</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">function</span> p=buscapicosu<span style="color: #080;">&#40;</span>x,umbral<span style="color: #080;">&#41;</span>
<span style="color: #228B22;">%posi_picos=buscapicosu(x,umbral)</span>
<span style="color: #228B22;">% Busca los máximos locales de un vector mayores que un cierto umbral</span>
<span style="color: #228B22;">% umbral se expresa en % respecto al valor máximo del vector.</span>
<span style="color: #228B22;">% Ej. buscapicos(x,60) buscaria los picos mayores o iguales al 60% del</span>
<span style="color: #228B22;">% pico más alto</span>
<span style="color: #228B22;">%</span>
<span style="color: #228B22;">% posi_picos son los indices del vector de entrada correspondientes a los picos.</span>
&nbsp;
<span style="color: #228B22;">% (C) Antonio Albiol , 2003</span>
&nbsp;
<span style="color: #228B22;">%Primero descarto los valores menores que el umbral</span>
&nbsp;
umbral=<span style="color: #0000FF;">max</span><span style="color: #080;">&#40;</span>x<span style="color: #080;">&#40;</span>:<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>*umbral/<span style="color: #33f;">100</span>;
&nbsp;
x=x.*<span style="color: #080;">&#40;</span>x&gt;umbral<span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #228B22;">%Ahora buscaré los máximos</span>
&nbsp;
<span style="color: #228B22;">%Primero creo un vector con dos valores muy pequeños en los extremos</span>
xe=<span style="color: #080;">&#91;</span>-<span style="color: #0000FF;">inf</span>;x<span style="color: #080;">&#40;</span>:<span style="color: #080;">&#41;</span>;-<span style="color: #0000FF;">inf</span><span style="color: #080;">&#93;</span>;
&nbsp;
<span style="color: #228B22;">%Ahora calculo la derivada</span>
d1=<span style="color: #0000FF;">diff</span><span style="color: #080;">&#40;</span>xe<span style="color: #080;">&#41;</span>;
ld1=<span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>d1<span style="color: #080;">&#41;</span>;
<span style="color: #228B22;">%Ahora busco valores de la derivada de signo diferente consecutivos y que sean máximos</span>
p=<span style="color: #0000FF;">find</span><span style="color: #080;">&#40;</span><span style="color: #0000FF;">sign</span><span style="color: #080;">&#40;</span>d1<span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>:ld1<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>.*<span style="color: #0000FF;">sign</span><span style="color: #080;">&#40;</span>d1<span style="color: #080;">&#40;</span><span style="color: #33f;">1</span>:<span style="color: #080;">&#40;</span>ld1-<span style="color: #33f;">1</span><span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>&lt;<span style="color: #33f;">0</span> &amp; <span style="color: #0000FF;">sign</span><span style="color: #080;">&#40;</span>d1<span style="color: #080;">&#40;</span><span style="color: #33f;">1</span>:ld1-<span style="color: #33f;">1</span><span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>&gt;<span style="color: #33f;">0</span><span style="color: #080;">&#41;</span>;</pre></div></div>

<p>Cada pitido y cada silencio dura 320 muestras luego calculamos periodos en esas zonas. Vamos a por el primer dígito, con ventana Hamming de 100 y usando 1024 puntos:</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;">&gt;&gt; <span style="color: #080;">&#91;</span>P,f<span style="color: #080;">&#93;</span>=periodmodif<span style="color: #080;">&#40;</span>x<span style="color: #080;">&#40;</span><span style="color: #33f;">320</span>:<span style="color: #33f;">320</span>+<span style="color: #33f;">99</span><span style="color: #080;">&#41;</span>,hamming<span style="color: #080;">&#40;</span><span style="color: #33f;">100</span><span style="color: #080;">&#41;</span>,<span style="color: #33f;">1024</span><span style="color: #080;">&#41;</span>;
&gt;&gt; buscapicosu<span style="color: #080;">&#40;</span><span style="color: #0000FF;">abs</span><span style="color: #080;">&#40;</span>P<span style="color: #080;">&#41;</span>,<span style="color: #33f;">50</span><span style="color: #080;">&#41;</span>
&nbsp;
<span style="color: #0000FF;">ans</span> =
&nbsp;
   <span style="color: #33f;">110</span>
   <span style="color: #33f;">190</span>
   <span style="color: #33f;">836</span>
   <span style="color: #33f;">916</span></pre></div></div>

<p>En el espectro digital, de 0 a 1, veremos que las frecuencias se repiten en espejo a partir de 0.5. Luego la frecuencia 110 se corresponde con la 916, igualmente ocurre entre la de 190 y 836, son lo mismo. Así que sólo tenemos que ver a qué corresponden 110 y 190.</p>
<p>Nota a tener en cuenta: en las FFTs (Fast Fourier Transforms) el cálculo se hace mucho más rapido cuando N es una potencia de 2, por eso la elección de hacerlo en 1024 puntos no ha sido del todo al azar.</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;">&gt;&gt; <span style="color: #33f;">110</span>/<span style="color: #33f;">1024</span>*fs
&nbsp;
<span style="color: #0000FF;">ans</span> =
&nbsp;
  <span style="color: #33f;">859.3750</span>
&nbsp;
&gt;&gt; <span style="color: #33f;">190</span>/<span style="color: #33f;">1024</span>*fs
&nbsp;
<span style="color: #0000FF;">ans</span> =
&nbsp;
  1.4844e+003</pre></div></div>

<p>Nos vamos a la tablita y vemos con qué 2 valores más cercanos concuerdan 859.375 y 1484.4 Hz. Claramente sería con 852 y 1477 Hz que juntos corresponden con el dígito 9.</p>
<p><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzExL2R0bWYxLnBuZw=="><img src="http://vierito.es/wordpress/wp-content/uploads/2009/11/dtmf1.png" alt="dtmf1" title="dtmf1" width="485" height="189" class="aligncenter size-full wp-image-722" /></a></p>
<p>Y así con cada uno de los dígitos <img src='http://vierito.es/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Sé que estaría mucho mejor un script que hiciera todo el proceso entero y obtuviera qué número es de la tabla pero últimamente necesito días de 30 horas así os tendréis que conformar con esto. ¿A qué número he llamado?<br/><br/><i>&#8211;<br/>Fuente original en <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNz">http://vierito.es/wordpress</a></i><br/><br/><strong>Similar Posts:</strong>
<ul class="similar-posts">
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDEvMTUvbGxhbWFuZG8tcG9yLXRlbGVmb25vLWNvbi1tYXRsYWIv" rel=\"bookmark\" title=\"January 15, 2009\">Llamando por teléfono con Matlab</a></li>
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDgvMTAvY3Vlc3Rpb24tZGUtb3B0aW1pemFjaW9uLw==" rel=\"bookmark\" title=\"August 10, 2009\">Cuestión de optimización</a></li>
</ul>
<p><!-- Similar Posts took 5.394 ms --></p>
 <img src="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=710" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://vierito.es/wordpress/2009/11/25/descodificar-tonos-dtmf-usando-matlab/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://vierito.es/wordpress/wp-content/uploads/2009/11/ring.wav" length="12204" type="audio/x-wav" />
		</item>
		<item>
		<title>Cuestión de optimización</title>
		<link>http://vierito.es/wordpress/2009/08/10/cuestion-de-optimizacion/</link>
		<comments>http://vierito.es/wordpress/2009/08/10/cuestion-de-optimizacion/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 19:37:54 +0000</pubDate>
		<dc:creator>vierito5</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cat]]></category>
		<category><![CDATA[eficiencia]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[Matlab]]></category>
		<category><![CDATA[optimización]]></category>

		<guid isPermaLink="false">http://vierito.es/wordpress/?p=255</guid>
		<description><![CDATA[Y es que se ha perdido el romanticismo&#8230; xD A día de hoy contamos con ordenadores chorrecientas veces más rápidos que hace pocos años y cuando se programa haces pruebas con sistemas de 3GHz, varios MB de cache y 2GB de RAM mínimo y todo tira para adelante. Bueno, todo tira hasta cierto punto, tus [...]]]></description>
			<content:encoded><![CDATA[<p>Y es que se ha perdido el romanticismo&#8230; xD</p>
<p>A día de hoy contamos con ordenadores chorrecientas veces más rápidos que hace pocos años y cuando se programa haces pruebas con sistemas de 3GHz, varios MB de cache y 2GB de RAM mínimo y todo tira para adelante. Bueno, todo tira hasta cierto punto, tus programas luego se van a estar ejecutando juntos con otras decenas de programas o simplemente se van a estar ejecutando constantemente y vas a perder un gran porcentaje de la capacidad de proceso de cómo lo podrías estar haciendo.</p>
<p>Bueno, y es normal, cosas de la comodidad, <strong>yo el primero</strong>. Ahora te quedas tranquilo con que funcione, en los 80 tenía que funcionar y caber en 64kB de RAM. No digo que se programe peor (seguramente sí xD) pero ya no nos fijamos en muchos detalles que antes eran totalmente necesarios (la de trucos que usaba la gente para poder aprovechar el 100% del hardware del Commodore64) y ahora desperdiciamos por todos lados y al final <strong>sí que pasa factura</strong>. La gente que programe sistemas embebidos lo tiene muy claro aunque casi se va a acabar el asunto también ahí porque ya los procesadores de los móviles/PDAs/cosas_pequeñas tirán mucho.</p>
<p><span id="more-255"></span></p>
<p>Me he encontrado con programas que están al 100% de CPU en idle, con programas que daban su salida en unos 12~15 minutos cuando otro para el mismo propósito lo hacía en aproximadamente 1 segundo (no daré nombres xD), programas en los que notas el &#8216;refresco&#8217; de los elementos cuando lo usas cuando te sobra CPU para hacerlo bien, etc. Hay que intentar evitar marañas de bucles for anidados!</p>
<p>Al final todo pasa por conocer muy bien el lenguaje que usas, haber pasado horas y horas, pensar las cosas antes de hacerlas, incluso un poquito de sentido común, cosa que creo que es difícil de abstraer a veces cuando se programa.</p>
<p>Por ejemplo, en matlab es muy importante reservar el espacio para las variables antes y crear los vectores del tamaño que van a ser al final de las operaciones porque si aumentamos el tamaño de un vector[n], internamente lo que siempre hace es crear un nuevo vector[n+1] y copiar los datos del antiguo.</p>
<p>Hace unos meses me comentó un amigo que en el trabajo tenían un método númerico que disminuyó su tiempo de ejecución en más de un 20% (siendo su tiempo varias horas) al sustituir un resultado de una operación que siempre era el mismo por el valor guardado en una variable! Es de cajón pero hay que caer.</p>
<p>Y ahora vienen algunos ejemplos, por no meterme en un lenguaje tipo C en el que hay muchas posibilidades de hacer las cosas y hay que currarse más los ejemplo iré a algo más sencillo como es hacer scripts cerdos para administrar un máquinas o similares.</p>
<p>Un ejemplo sería un uso poco adecuado de las órdenes <em>cat, grep, ls, awk</em> y similares. Cuando manipulamos algo pequeño no pasa nada pero cuando se trata de varios ficheros logs y son decenas de MB pues la cosa empieza a tomar importancia.</p>
<p>Respecto a <em>grep</em> cuando una persona empieza y se plantea buscar una cadena lo primero que piensa es &#8216;muestro el archivo y luego saco las líneas coincidentes&#8217;:</p>
<p><code># cat tinyproxy.log | grep remote<br />
real    0m55.071s<br />
user    0m24.477s<br />
sys     0m0.727s</code></p>
<p>Luego descubres que en realidad lo puedes hacer &#8216;todo en uno&#8217; y es bastantes más rápido:</p>
<p><code># grep remote tinyproxy.log<br />
real    0m36.024s<br />
user    0m22.550s<br />
sys     0m0.527s</code></p>
<p>Luego, sin querer, entras en el man y te das cuenta de que existen varios tipos: <em>grep</em>, <em>egrep</em> (similar pero no idéntico a grep -E ) y  <em>fgrep</em> (idéntico a grep -F). Así que pruebas:</p>
<p><code># egrep remote tinyproxy.log<br />
real    0m55.122s<br />
user    0m25.029s<br />
sys     0m0.659s</code></p>
<p>Joder, vuelve a ser lento a pesar de no hacer un cat. ¿Por qué? Porque es una función más compleja.</p>
<ul>
<li>grep: soporta expresiones regulares básicas.</li>
<li>fgrep: no soporta expresiones regulares =&gt; el más rápido.</li>
<li>egrep: soporta expresiones regulares avanzadas =&gt; el más lento.</li>
</ul>
<p>Para los curiosos, el nombre grep viene de g/re/p y significa lo que hace tal cual, buscar una expresión regular y hacer print de las coincidencias. En realidad a una escala grande ni siquiera deberíamos usar <em>grep</em> sino <em>sed</em> que es más rápido.</p>
<p>Lo mucha gente desconoce es que hay otra manera de evitar el <em>cat </em>de antes y ganar tiempo, y es que en realidad las concatenaciones siempre están ahí&#8230; así que lo podríamos hacer del siguiente modo:</p>
<p><code># &lt;tinyproxy.log grep remote<br />
real    0m43.931s<br />
user    0m22.338s<br />
sys     0m0.578s</code></p>
<p>Del mismo modo estos conceptos se puede usar en otras órdenes</p>
<p><code># cat tinyproxy.log | wc -l<br />
104265</code></p>
<p>real    0m0.088s<br />
user    0m0.021s<br />
sys     0m0.053s</p>
<p><code># wc -l tinyproxy.log<br />
104265 tinyproxy.log</code></p>
<p>real    0m0.021s<br />
user    0m0.013s<br />
sys     0m0.006s</p>
<p>Y del mismo modo:</p>
<p><code># cat tinyproxy.log | tail -n 200<br />
real    0m0.121s<br />
user    0m0.026s<br />
sys     0m0.056s</code></p>
<p><code># tail -n 200 tinyproxy.log<br />
real    0m0.010s<br />
user    0m0.000s<br />
sys     0m0.003s</code></p>
<p>Cambiando de tercio también solemos usar <em>echo</em> más veces de las que toca. Por ejemplo si tenemos :</p>
<p><code>var="valor_o_resultado_de_una_evaluacion"<br />
command -options `echo $var`</code></p>
<p>en la mayoría de los casos podremos sustituirlo por:</p>
<p><code>var="valor_o_resultado_de_una_evaluacion"<br />
command -options $var</code></p>
<p>Y así mil chorradas. Por cierto, el que sólo se conozca la opción de awk para coger columnas le recomiendo que se mire manules que termina siendo muy útil.</p>
<p>Creo que este post lleva más de 6 meses en drafts y no he añadido nada (de hecho  tampoco tengo ganas), así que aunque es un tema que da mucho de sí ha quedado bastante descafeinado técnicamente, pero ajo y agua!<br/><br/><i>&#8211;<br/>Fuente original en <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNz">http://vierito.es/wordpress</a></i><br/><br/><strong>Similar Posts:</strong>
<ul class="similar-posts">
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMTEvMjUvZGVzY29kaWZpY2FyLXRvbm9zLWR0bWYtdXNhbmRvLW1hdGxhYi8=" rel=\"bookmark\" title=\"November 25, 2009\">Descodificar tonos DTMF usando Matlab</a></li>
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDkvMjUvcG9ydC1rbm9ja2luZy15LWNyeXB0LXBvcnQta25vY2tpbmcv" rel=\"bookmark\" title=\"September 25, 2009\">Port-Knocking y Crypt-Port-Knocking</a></li>
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDgvMTEvMjEvcGFyYS1sb3MtYW1hbnRlcy1kZS14a2NkLWxsZWdhLw==" rel=\"bookmark\" title=\"November 21, 2008\">Para los amantes de XKCD llega&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 5.893 ms --></p>
 <img src="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=255" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://vierito.es/wordpress/2009/08/10/cuestion-de-optimizacion/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Llamando por teléfono con Matlab</title>
		<link>http://vierito.es/wordpress/2009/01/15/llamando-por-telefono-con-matlab/</link>
		<comments>http://vierito.es/wordpress/2009/01/15/llamando-por-telefono-con-matlab/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 00:30:25 +0000</pubDate>
		<dc:creator>vierito5</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[DTMF]]></category>
		<category><![CDATA[Matlab]]></category>
		<category><![CDATA[Octave]]></category>

		<guid isPermaLink="false">http://vierito.es/wordpress/?p=258</guid>
		<description><![CDATA[Mañana tengo examen de laboratorio de tratamiento digital de la señal y cuando ya no tienes ganas de estudiar sólo tienes ganas de hacer el melón. Así que aquí tenéis un script de Matlab al cual le pasas un número telefónico y te genera y reproduce un wav con los tonos DTMF para hacer la [...]]]></description>
			<content:encoded><![CDATA[<p>Mañana tengo examen de laboratorio de tratamiento digital de la señal y cuando ya no tienes ganas de estudiar sólo tienes ganas de hacer el melón. Así que aquí tenéis un script de <a title=\"Matlab\" href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5tYXRod29ya3MuY29tL3Byb2R1Y3RzL21hdGxhYi8=">Matlab</a> al cual le pasas un número telefónico y te genera y reproduce un wav con los tonos <a title=\"DTMF\" href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EVE1G">DTMF</a> para hacer la llamada. Descolgáis el teléfono, lo acercáis a los altavoces y ejecutáis &#8220;ring(numero)&#8221;.</p>
<p>Lo quería hacer en <a title=\"GNU Octave\" href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL29jdGF2ZS8=">Octave</a> (por aquello del software libre y tal) pero es una _censored_ patata pinchada en un palo y me he cansado de sus pejiguerías.</p>
<p>¿En qué se basa esto? A cada número se le asigna una pareja de tonos según la tabla siguiente y se envía la suma de éstos, el nombre es bastante explicativo: Dual Tone Multi Frequency.</p>
<p><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA5LzAxL2R0bWYxLnBuZw=="><img class="aligncenter size-full wp-image-260" title="dtmf1" src="http://vierito.es/wordpress/wp-content/uploads/2009/01/dtmf1.png" alt="dtmf1" width="485" height="189" /></a></p>
<p>En mi portátil no funciona porque mis altavoces están cascadísimos y no reproducen como deberían xDDD En el portátil de <a title=\"el CutreBlog de Rafa\" href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL21vbnN0cnVvZGVsYXNnYWxsZXRhcy5ibG9nc3BvdC5jb20v">Rafa</a> sí que iba.</p>
<p>Aquí está el código:</p>

<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">function</span> y = ring<span style="color: #080;">&#40;</span>x<span style="color: #080;">&#41;</span>
&nbsp;
number = x;
numberstr = <span style="color: #0000FF;">int2str</span><span style="color: #080;">&#40;</span>number<span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #228B22;">% Sampling Frequency</span>
fs = <span style="color: #33f;">8000</span>;
<span style="color: #228B22;">% initializing arrays, 1200 samples</span>
digit = <span style="color: #33f;">0</span>:<span style="color: #33f;">1199</span>;
silence = <span style="color: #0000FF;">zeros</span><span style="color: #080;">&#40;</span><span style="color: #33f;">1</span>,<span style="color: #33f;">1200</span><span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #0000FF;">disp</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'Calculating DTMF tones...'</span><span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #228B22;">% row sinusoids</span>
sin697 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">697</span>*digit/fs<span style="color: #080;">&#41;</span>;
sin770 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">770</span>*digit/fs<span style="color: #080;">&#41;</span>;
sin852 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">852</span>*digit/fs<span style="color: #080;">&#41;</span>;
sin941 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">941</span>*digit/fs<span style="color: #080;">&#41;</span>;
<span style="color: #228B22;">% column sinusoids</span>
sin1209 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">1209</span>*digit/fs<span style="color: #080;">&#41;</span>;
sin1336 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">1336</span>*digit/fs<span style="color: #080;">&#41;</span>;
sin1477 = <span style="color: #0000FF;">sin</span><span style="color: #080;">&#40;</span><span style="color: #33f;">2</span>*<span style="color: #0000FF;">pi</span>*<span style="color: #33f;">1477</span>*digit/fs<span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #228B22;">% numbers</span>
num1 = <span style="color: #080;">&#40;</span>sin1209+sin697<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num2 = <span style="color: #080;">&#40;</span>sin1336+sin697<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num3 = <span style="color: #080;">&#40;</span>sin1477+sin697<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num4 = <span style="color: #080;">&#40;</span>sin1209+sin770<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num5 = <span style="color: #080;">&#40;</span>sin1336+sin770<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num6 = <span style="color: #080;">&#40;</span>sin1477+sin770<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num7 = <span style="color: #080;">&#40;</span>sin1209+sin852<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num8 = <span style="color: #080;">&#40;</span>sin1336+sin852<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num9 = <span style="color: #080;">&#40;</span>sin1477+sin852<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
num0 = <span style="color: #080;">&#40;</span>sin1336+sin941<span style="color: #080;">&#41;</span>/<span style="color: #33f;">2</span>;
<span style="color: #228B22;">% an asterisk would be: (sin1336+sin941)/2);</span>
<span style="color: #228B22;">% a pad would be: (sin1477+sin941)/2);</span>
&nbsp;
<span style="color: #228B22;">% insert a silence in the begining</span>
y = <span style="color: #0000FF;">zeros</span><span style="color: #080;">&#40;</span><span style="color: #33f;">1</span>, <span style="color: #33f;">1200</span><span style="color: #080;">&#41;</span>;
<span style="color: #228B22;">% fill the rest</span>
<span style="color: #0000FF;">for</span> <span style="color: #0000FF;"><span style="color: #33f;">i</span></span> = <span style="color: #33f;">1</span>:<span style="color: #0000FF;">length</span><span style="color: #080;">&#40;</span>numberstr<span style="color: #080;">&#41;</span>
	num = <span style="color: #0000FF;">str2num</span><span style="color: #080;">&#40;</span>numberstr<span style="color: #080;">&#40;</span><span style="color: #0000FF;"><span style="color: #33f;">i</span></span><span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>;
	<span style="color: #0000FF;">switch</span> num
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">0</span>
			dtmf = num0;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">1</span>
			dtmf = num1;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">2</span>
			dtmf = num2;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">3</span>
			dtmf = num3;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">4</span>
			dtmf = num4;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">5</span>
			dtmf = num5;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">6</span>
			dtmf = num6;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">7</span>
			dtmf = num7;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">8</span>
			dtmf = num8;
		<span style="color: #0000FF;">case</span> <span style="color: #33f;">9</span>
			dtmf = num9;
		<span style="color: #0000FF;">otherwise</span>
			<span style="color: #0000FF;">disp</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'O_o'</span><span style="color: #080;">&#41;</span>;
    <span style="color: #0000FF;">end</span>
    <span style="color: #228B22;">% insert the number samples</span>
    y = <span style="color: #080;">&#91;</span>y dtmf<span style="color: #080;">&#93;</span>;
    <span style="color: #228B22;">% insert the silence samples</span>
    y = <span style="color: #080;">&#91;</span>y silence<span style="color: #080;">&#93;</span>;
<span style="color: #0000FF;">end</span>
&nbsp;
<span style="color: #0000FF;">wavwrite</span><span style="color: #080;">&#40;</span>y,fs,<span style="color:#A020F0;">'ring.wav'</span><span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #0000FF;">disp</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'Ringing number:'</span><span style="color: #080;">&#41;</span>;
<span style="color: #0000FF;">disp</span><span style="color: #080;">&#40;</span>numberstr<span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #228B22;">% play it</span>
wavplay<span style="color: #080;">&#40;</span>y,fs<span style="color: #080;">&#41;</span>;
&nbsp;
<span style="color: #0000FF;">disp</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'Happy talking'</span><span style="color: #080;">&#41;</span>;</pre></div></div>

<p><br/><br/><i>&#8211;<br/>Fuente original en <a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNz">http://vierito.es/wordpress</a></i><br/><br/><strong>Similar Posts:</strong>
<ul class="similar-posts">
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMTEvMjUvZGVzY29kaWZpY2FyLXRvbm9zLWR0bWYtdXNhbmRvLW1hdGxhYi8=" rel=\"bookmark\" title=\"November 25, 2009\">Descodificar tonos DTMF usando Matlab</a></li>
<li><a href="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ZpZXJpdG8uZXMvd29yZHByZXNzLzIwMDkvMDgvMTAvY3Vlc3Rpb24tZGUtb3B0aW1pemFjaW9uLw==" rel=\"bookmark\" title=\"August 10, 2009\">Cuestión de optimización</a></li>
</ul>
<p><!-- Similar Posts took 8.885 ms --></p>
 <img src="http://vierito.es/wordpress/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=258" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://vierito.es/wordpress/2009/01/15/llamando-por-telefono-con-matlab/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

