<?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; Fourier</title>
	<atom:link href="http://vierito.es/wordpress/tag/fourier/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 24.391 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>
	</channel>
</rss>

