<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-896722407647542490</id><updated>2011-12-30T22:14:15.368+01:00</updated><category term='fotografía'/><category term='OMR'/><category term='Iván López'/><category term='JAVA'/><category term='física'/><category term='software'/><category term='reconocimiento de voz'/><category term='electrónica'/><category term='audio ruidoso'/><category term='desarrollo'/><category term='matemáticas'/><category term='ojos rojos'/><category term='ciencia'/><category term='música'/><category term='texto a voz'/><category term='generador'/><category term='corto'/><title type='text'>I² Blog</title><subtitle type='html'>I² Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-3624638643657359170</id><published>2010-12-22T22:01:00.003+01:00</published><updated>2010-12-22T23:24:42.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='audio ruidoso'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='electrónica'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento de voz'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>API de procesado de audio para JAVA</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A la hora de realizar un prototipo en &lt;i style="color: #b45f06;"&gt;JAVA&lt;/i&gt; sobre un proyecto que me encuentro realizando, me he encontrado con que no hay mucho material disponible escrito para dicho lenguaje de fácil uso para el procesado de señal. Por ello, yo mismo he tenido que programar métodos para realizar funciones que necesitaba de procesado. Mi proyecto versa sobre el &lt;b&gt;tratamiento del audio&lt;/b&gt; por lo que, básicamente, el código escrito está orientado a ello. Muchas de las funciones son muy concretas, pues no quise complicarme escribiendo algo muy genérico pero, otras tantas, sí se pueden usar de forma genérica (también está la opción de modificar según la necesidad).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Podéis descargar la &lt;b style="color: blue;"&gt;API&lt;/b&gt; como fichero con extensión &lt;i&gt;.java&lt;/i&gt; haciendo clic &lt;a href="http://telematica.hostei.com/DAPAPI.java"&gt;aquí&lt;/a&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A continuación presento una descripción breve sobre las funciones incluidas, ya que la clase escrita no está documentada.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Suavizado de Pitch&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La función admite como entrada un vector de números reales en doble precisión representantes de un contorno de frecuencia de pitch en el tiempo (también podría usarse con otros propósitos). Como salida devuelve el mismo contorno suavizado. Este suavizado se basa en umbrales heurísticos supuesto que el contorno de pitch es el logaritmo en base &lt;i&gt;e&lt;/i&gt; de la secuencia de frecuencias de pitch en hertzios. La realización de este método se encuentra motivada por el hecho de que, en muchas ocasiones, durante la detección del pitch a partir del espectro o funciones de autocorrelación, existen armónicos más energéticos que el tono fundamental, lo que se traduce en picos erróneos dentro de la secuencia. Se considera errónea una ráfaga de valores cuando dicha ráfaga es inferior a &lt;i&gt;10&lt;/i&gt; cifras consecutivas y la pendiente generada en su entorno es superior a &lt;i&gt;0.5&lt;/i&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cálculo de la PSD&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Calcula la &lt;i&gt;PSD&lt;/i&gt; (módulo de la &lt;i&gt;FFT&lt;/i&gt; pero no en &lt;i&gt;dB&lt;/i&gt;) entre $0$ y $2\pi$ de una secuencia de muestras dada como un vector de números reales en doble precisión. La secuencia de salida tiene la misma longitud y se calcula según:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;$Y(k) = \left | \sum_{n=0}^{N-1}x(n)e^{-i\frac{2\pi nk}{N}} \right |$&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Filtro de Mediana de Orden 5&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Muy útil para la eliminación de ruido aditivo impulsivo. Realmente puede modificarse en su interior el orden, siempre y cuando este sea impar. La muestra &lt;i&gt;k-ésima&lt;/i&gt; filtrada se obtiene a partir del cálculo de la mediana como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$y(k) = mediana(x(k - (n-1)/2),...,x(k + (n+1)/2))$&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cuantizador Musical&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Aproxima una secuencia de valores de pitch frecuencial dados en forma logarítmica a semitonos de la escala musical. Esto sólo se encuentra habilitado en el rango frecuencial que va del &lt;i&gt;Sol2&lt;/i&gt; al &lt;i&gt;Sol5&lt;/i&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cálculo de la Energía&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Calcula la energía de una secuencia de muestras dadas en un vector de datos reales de doble precisión. Dicha energía se obtiene de la forma:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$E(dB) = 10log_{10}\sum_{n=0}^{N-1}x(n)^{2}$&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Interpolador de Orden 5&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Este interpolador aumenta la resolución en un &lt;i style="color: blue;"&gt;factor 5&lt;/i&gt; de un conjunto de muestras dadas en el formato ya mentado. Este orden de interpolación es inamovible ya que el funcionamiento del método se basa en la inserción de ceros y en la aplicación de un filtro &lt;i&gt;FIR&lt;/i&gt; simétrico especial (cuyos coeficientes sólo son válidos para este orden de interpolación).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Enventanador de Hamming&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Enventana una secuencia de muestras con &lt;i&gt;Hamming&lt;/i&gt;. La función de la ventana de &lt;i&gt;Hamming&lt;/i&gt; es:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$w(n) = a_{0}-a_{1}\cos(\frac{2\pi n}{N-1})$&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cálculo de la Media&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Calcula la media de un vector de datos de entrada como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$\mu = \frac{1}{N}\sum_{n=0}^{N-1}x(n)$&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cálculo de la Varianza&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Calcula la varianza de un vector de datos de entrada como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$\sigma^2 = \frac{1}{N-1}\sum_{n=0}^{N-1}(x(n)-\mu)^2$ &lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Normalizador&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Normaliza un vector de muestras de entrada por el máximo del vector en valor absoluto.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Filtrado&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Método para el filtrado de un vector de datos reales en doble precisión de entrada. Devuelve otro vector del mismo tamaño al que se le ha aplicado un filtrado dados los coeficientes del correspondiente filtro &lt;i&gt;FIR&lt;/i&gt; o &lt;i&gt;IIR&lt;/i&gt;. Dado un filtro de orden&lt;i&gt; (p,q)&lt;/i&gt;, la salida&lt;i&gt; n-ésima&lt;/i&gt; filtrada se obtiene como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$y(n) = b_{0}x(n)+...+b_{q}x(n-q) - a_{1}y(n-1)-...-a_{p}y(n-p)$&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Cálculo de la Autocorrelación&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Dada una secuencia de muestras de entrada, este método calcula su autocorrelación haciendo uso del estimador sesgado, el cual es de uso preferente debido a su inferior varianza, lo que se traduce en una mejor convergencia de las muestras de autocorrelación lejanas. Se devuelve un vector de salida de la misma dimensión que el de entrada, el cual contiene las muestras correspondientes a la parte positiva del eje de abscisas. El estimador sesgado de la autocorrelación para la parte positiva del eje de abscisas se define como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;$r_{x}(k) = \frac{1}{N}\sum_{n=0}^{N-1-k}x(n)x(n+k)$ &lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Análisis LPC&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Se encarga de obtener hasta un total de &lt;i&gt;13&lt;/i&gt; coeficientes del predictor lineal que modela, como un filtro todo-polos, la respuesta del tracto vocal. Estos coeficientes se obtienen a partir de la resolución de las ecuaciones de &lt;i&gt;Yule-Walker&lt;/i&gt; a partir del cálculo de muestras de autocorrelación dado un vector de muestras reales en doble precisión de entrada.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;- Detector de Pico Máximo&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Esta función detecta la presencia de un pico máximo absoluto en una secuencia de valores de entrada. Es la misma función que ya presenté en otra entrada escrita en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;- Remuestreador de Orden 5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;No sólo es un remuestreador de orden &lt;i&gt;5&lt;/i&gt; sino que, únicamente, funciona como remuestreador para pasar de una frecuencia de &lt;i&gt;8kHz &lt;/i&gt;a &lt;i&gt;1.6kHz&lt;/i&gt;. Esto es así ya que, al principio, se aplica un filtrado &lt;i&gt;FIR&lt;/i&gt; de fase lineal cuyos coeficientes son estáticos y almacenados para este propósito. Una vez filtrado el vector de entrada, se selecciona una de cada &lt;i&gt;5&lt;/i&gt; muestras.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-3624638643657359170?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/3624638643657359170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=3624638643657359170' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3624638643657359170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3624638643657359170'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/12/api-de-procesado-de-audio-para-java.html' title='API de procesado de audio para JAVA'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-3820052544756996443</id><published>2010-11-26T17:36:00.001+01:00</published><updated>2010-11-26T17:49:15.434+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='audio ruidoso'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento de voz'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Detector de pitch (II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: small;"&gt;Vuelvo a presentar un nuevo &lt;i&gt;&lt;b&gt;detector de pitch&lt;/b&gt;&lt;/i&gt;, esta vez, &lt;b&gt;basado en autocorrelación&lt;/b&gt;. Dicho detector está programado en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; y está basado en el &lt;i style="color: blue;"&gt;algoritmo SIFT&lt;/i&gt;. Su diagrama de bloques se observa a continuación.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/TO_ctFbEYFI/AAAAAAAAAYU/MInG3sDkmA4/s1600/DiagramaSIFT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/TO_ctFbEYFI/AAAAAAAAAYU/MInG3sDkmA4/s400/DiagramaSIFT.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Primero, el audio de entrada se preprocesa remuestreando desde &lt;i&gt;44100Hz &lt;/i&gt;(asumimos dicha frecuencia de muestreo para el audio de entrada) a &lt;i&gt;8000Hz&lt;/i&gt;, habiendo ponderado previamente ambos canales estéreo para, finalmente, normalizar la señal.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Seguidamente filtramos la señal mediante un &lt;span style="color: blue;"&gt;filtro tipo Butterworth&lt;/span&gt; paso-bajo con frecuencia de corte &lt;i&gt;800Hz&lt;/i&gt; (correspondiente, aproximadamente, a un &lt;i&gt;Sol-5&lt;/i&gt; en la escala musical) para, a continuación, aplicar un &lt;i style="color: blue;"&gt;downsampling&lt;/i&gt; correspondiente a la nueva frecuencia máxima presente en la señal, lo que se traduce, según el &lt;span style="color: blue;"&gt;criterio de Nyquist&lt;/span&gt;, en un remuestreo a &lt;i&gt;1600Hz&lt;/i&gt;. Fragmentamos en tramas el audio filtrado y, para cada trama, aplicamos el proceso descrito a partir de ahora. Se toma el frame y con él se realiza un estudio &lt;b&gt;LPC&lt;/b&gt; (Linear Predictive Coding), con el fin de modelar la respuesta espectral referente al tracto vocal (formantes) mediante un filtro todo-polos. Una vez obtenidos los coeficientes de dicho filtro, se filtra la trama mediante otro filtro &lt;i&gt;FIR&lt;/i&gt; cuyos coeficientes son los anteriores del modelo &lt;b&gt;LPC&lt;/b&gt;. Con ello, intentamos eliminar la información propia del tracto vocal de la señal con el fin de mantener sólo la información de interés: el pitch. Por último se calcula la función autocorrelación de la señal filtrada y se interpola para ganar resolución temporal. El pico máximo detectado a la salida, se corresponderá con el período de pitch deseado.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La función que implementa el anterior proceso toma como datos de entrada el tamaño del frame (en segundos, con un valor típico de &lt;i&gt;40ms&lt;/i&gt;) y el solapamiento (también en segundos, con un valor típico de &lt;i&gt;10ms&lt;/i&gt;) aparte de, claro está, el propio audio cuyo pitch deseamos estimar.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/TO_ilWv5nkI/AAAAAAAAAYc/a1H9iXOR9tk/s1600/SecuenciaPitch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/TO_ilWv5nkI/AAAAAAAAAYc/a1H9iXOR9tk/s400/SecuenciaPitch.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;También se incluye un &lt;b&gt;detector de actividad de voz&lt;/b&gt; basado en &lt;i style="color: blue;"&gt;hangover&lt;/i&gt; con los parámetros por defecto fijados en la función (cambiar si fuera necesario). La salida es la secuencia de pitch, a la que se le ha aplicado el logaritmo neperiano (si se desea obtener la frecuencia en &lt;i&gt;Hz's&lt;/i&gt;, cambiar desde el código o aplicar la exponencial al vector de salida), de tal forma que no se incluyen las estimaciones para las tramas cuyo &lt;i&gt;flag&lt;/i&gt; proporcionado por el detector de voz se corresponda con silencio.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La gráfica adjunta muestra un ejemplo del pitch estimado para la canción Hush de Deep Purple tarareada.&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #cc0000;"&gt;IMPORTANTE:&lt;/b&gt; La función &lt;i&gt;detPico.m&lt;/i&gt; se encuentra en la entrada justamente anterior. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Detector de pitch&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt; % Autor: Iván López Espejo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; pitch = detPitch(x,wsize,sol)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Preprocesado.&lt;/span&gt;&lt;br /&gt;fm1 = 44100;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;fm = 8000;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;x = (x(:,1) + x(:,2))/2;&lt;br /&gt;x = resample(x,fm,fm1)&lt;br /&gt;x = x/max(abs(x));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt; &lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Parámetros del detector de actividad de voz.&lt;/span&gt;&lt;br /&gt;THRESHOLD = 0.01;&lt;br /&gt;MIN_SPEECH_FRAME_HANGOVER = 4;&lt;br /&gt;HANGOVER = 1;&lt;br /&gt;meanEn = 0;&lt;br /&gt;nbSpeechFrame = 0;&lt;br /&gt;ind = 1;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Diseño de filtro paso-bajo Butterworth con frecuencia de corte a 800Hz.&lt;/span&gt;&lt;br /&gt;fc = 800;&lt;br /&gt;Nf = 2; &lt;span style="color: #38761d;"&gt;% Orden del filtro.&lt;/span&gt;&lt;br /&gt;Wn = 2*fc/fm;&lt;br /&gt;[b,a] = butter(Nf,Wn,&lt;span style="color: purple;"&gt;'low'&lt;/span&gt;);&lt;br /&gt;x = filter(b,a,x); &lt;span style="color: #38761d;"&gt;% Filtramos paso-bajo.&lt;/span&gt;&lt;br /&gt;x = resample(x,2*fc,fm); &lt;span style="color: #38761d;"&gt;% Downsampling.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Análisis por frame.&lt;/span&gt;&lt;br /&gt;wsize = round(wsize * 2 * fc);&lt;br /&gt;sol = round(sol * 2 * fc);&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Definimos las constantes de la ventana.&lt;/span&gt;&lt;br /&gt;a0 = 0.53836;&lt;br /&gt;a1 = 0.46164;&lt;br /&gt;Npred = 12; &lt;span style="color: #38761d;"&gt;% Número de coeficientes del predictor lineal.&lt;/span&gt;&lt;br /&gt;b0 = 1;&lt;br /&gt;fint = 5; &lt;span style="color: #38761d;"&gt;% Factor de interpolación.&lt;/span&gt;&lt;br /&gt;pitch = [];&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; m = 1:(wsize-sol-1):length(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; wsize &amp;gt; length(x) - m&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; N = length(x) - m + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; N = wsize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;% Detección de la actividad de voz.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; frameEn = dot(x(m:m+N-1),x(m:m+N-1))/N;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; frameEn - meanEn &amp;gt; THRESHOLD&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VAD(ind) = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nbSpeechFrame = nbSpeechFrame + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if &lt;/span&gt;nbSpeechFrame &amp;gt; MIN_SPEECH_FRAME_HANGOVER&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; hangOver = HANGOVER;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; hangOver == 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; VAD(ind) = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; VAD(ind) = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; hangOver = hangOver - 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1; &lt;span style="color: #38761d;"&gt;% Incremento del contador.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;% Enventanado del frame mediante Hamming.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = 1:N;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; win = a0 - a1*cos(2*pi*n/(N-1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; frame = x(m:m+N-1).*win';&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Método de la autocorrelación para modelado de los coeficientes del&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; % predictor lineal asociado a la trama.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; acoef = lpc(frame,Npred);&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Usamos los anteriores coeficientes como coeficientes de un filtro&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; % FIR.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eps = filter(acoef,b0,frame);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reps = xcorr(eps,&lt;span style="color: purple;"&gt;'biased'&lt;/span&gt;); &lt;span style="color: #38761d;"&gt;% Cómputo de la autocorrelación.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Interpolación para la obtención de mayor resolución temporal.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pm = interp(reps,fint);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pm = Pm(floor(length(Pm)/2):length(Pm));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Detectamos el pico máximo en la función de autocorrelación.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; picomax = detPico(Pm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pause();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; VAD(ind-1) == 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pitch = [pitch (log(2*fc*fint/(picomax-1)))];&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Representamos el resultado.&lt;/span&gt;&lt;br /&gt;plot(pitch,&lt;span style="color: purple;"&gt;'-*r'&lt;/span&gt;)&lt;br /&gt;grid &lt;span style="color: purple;"&gt;on&lt;/span&gt;&lt;br /&gt;xlabel(&lt;span style="color: purple;"&gt;'Evolución temporal'&lt;/span&gt;)&lt;br /&gt;ylabel(&lt;span style="color: purple;"&gt;'Frecuencia de pitch logarítmica'&lt;/span&gt;)&lt;br /&gt;title(&lt;span style="color: purple;"&gt;'PITCH estimado'&lt;/span&gt;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-3820052544756996443?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/3820052544756996443/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=3820052544756996443' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3820052544756996443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3820052544756996443'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/11/detector-de-pitch-ii.html' title='Detector de pitch (II)'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3gUFAGd1YV0/TO_ctFbEYFI/AAAAAAAAAYU/MInG3sDkmA4/s72-c/DiagramaSIFT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-7979338544343955626</id><published>2010-11-01T15:54:00.008+01:00</published><updated>2010-11-01T16:05:59.637+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='audio ruidoso'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='electrónica'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento de voz'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='generador'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Detector de actividad de voz (VAD)</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;En esta entrada se recoge la implementación de un &lt;b&gt;detector de actividad de voz&lt;/b&gt; a través de una red neuronal artificial entrenada mediante &lt;a href="http://es.wikipedia.org/wiki/Propagaci%C3%B3n_hacia_atr%C3%A1s"&gt;propagación hacia atrás&lt;/a&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Este tipo de redes neuronales es ideal para el &lt;i style="color: blue;"&gt;reconocimiento de patrones&lt;/i&gt;, de modo que entrenamos el sistema con vectores de características representativos de pasajes de silencio (ruido de fondo) y pasajes de voz. Para ello caracterizamos una trama de audio mediante 12 coeficientes cepstrales &lt;i&gt;&lt;b&gt;MFCC&lt;/b&gt;&lt;/i&gt; (los primeros 13 coeficientes salvo el primero, ya que este está relacionado con la energía de la trama y en este caso no es representativo) y un coeficiente de &lt;i&gt;entropía&lt;/i&gt;, computada como:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&amp;nbsp;$H = -\sum_{k=1}^N p_{k}\log p_{k}$&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Donde $N$ es el número de muestras del módulo del espectro de la trama en consideración y $p_{k}$ representa el valor &lt;i&gt;k-ésimo&lt;/i&gt; de la función densidad de probabilidad calculada a partir de dicho espectro, definiéndose como:&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;$p_{k} = \frac{S_{k}}{\sum_{j}^N S_{j}}$&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Con $S$ el módulo del espectro de la trama.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La red neuronal que he construido para solventar el problema utiliza tramas de 128 muestras (donde consideramos la señal aproximadamente estacionaria) para un audio muestreado a 8kHz y está diseñada para usar 10 capas ocultas. Dicha red está entrenada con 20 vectores de características representativos de silencio y otros 22 vectores representativos de voz. El resto de parámetros se extrae del código &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; incluido a continuación.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Obsérvese un ejemplo de un fragmento de audio al que se le eliminan los silencios mediante esta implementación de VAD. El funcionamiento es bastante bueno. El programa va consumiendo tramas de 128 muestras a 8kHz, clasificándolas como voz o silencio gracias a la red neuronal previamente entrenada. Recomiendo sacar del código la parte del entrenamiento de la red neuronal, a fin de no estar inicializándola constantemente cada vez que se llame a la función.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TM7P5NK0NGI/AAAAAAAAAYA/TfMRc7duPH8/s1600/Audio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TM7P5NK0NGI/AAAAAAAAAYA/TfMRc7duPH8/s400/Audio.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;Audio de entrada.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TM7P7czKbTI/AAAAAAAAAYE/quGd4tXcEwU/s1600/ASinSilencios.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TM7P7czKbTI/AAAAAAAAAYE/quGd4tXcEwU/s400/ASinSilencios.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Audio de salida con silencios eliminados.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Esta herramienta que he construido está pensada para funcionar previamente a la detección del pitch, a fin de poder eliminar las partes sin voz para no obtener falsas estimaciones.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Se puede ver el código a continuación, así como descargar mi fichero con patrones de entrenamiento haciendo clic &lt;a href="http://telematica.hostei.com/Patrones.mat"&gt;aquí&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Detector de actividad de voz basado en red neuronal&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; [y,sil] = vadet(x,fm)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Remuestreo a 8kHz.&lt;/span&gt;&lt;br /&gt;x = resample(x,8000,fm);&lt;br /&gt;x = x/max(abs(x));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Definición de algunos parámetros.&lt;/span&gt;&lt;br /&gt;N = 128;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Inicialización y entrenamiento de la red neuronal.&lt;/span&gt;&lt;br /&gt;nump = 2; &lt;span style="color: #38761d;"&gt;% Número de clases.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Patrones de entrenamiento.&lt;/span&gt;&lt;br /&gt;load &lt;span style="color: purple;"&gt;Patrones&lt;/span&gt;&lt;br /&gt;P = Patrones;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Salidas.&lt;/span&gt;&lt;br /&gt;T = zeros(2,42);&lt;br /&gt;T(1,21:42) = ones(1,22);&lt;br /&gt;T(2,1:20) = ones(1,20);&lt;br /&gt;S1 = 10; &lt;span style="color: #38761d;"&gt;% Número de capas ocultas.&lt;/span&gt;&lt;br /&gt;S2 = nump; &lt;span style="color: #38761d;"&gt;% Número de capas de salida (= al número de clases).&lt;/span&gt;&lt;br /&gt;[R,Q] = size(P); &lt;br /&gt;epochs = 10000; &lt;span style="color: #38761d;"&gt;% Número de iteraciones.&lt;/span&gt;&lt;br /&gt;goal_err = 5e-5; &lt;span style="color: #38761d;"&gt;% Error objetivo.&lt;/span&gt;&lt;br /&gt;a = 0.7; &lt;span style="color: #38761d;"&gt;% Define el rango de variables aleatorias.&lt;/span&gt;&lt;br /&gt;b = -0.7;&lt;br /&gt;W1 = a + (b-a) * rand(S1,R); &lt;span style="color: #38761d;"&gt;% Pesos entre la entrada y las neuronas ocultas.&lt;/span&gt;&lt;br /&gt;W2 = a + (b-a) * rand(S2,S1); &lt;span style="color: #38761d;"&gt;% Pesos entre las neuronas ocultas y las de salida.&lt;/span&gt;&lt;br /&gt;b1 = a + (b-a) * rand(S1,1); &lt;span style="color: #38761d;"&gt;% Pesos entre la entrada y las neuronas ocultas.&lt;/span&gt;&lt;br /&gt;b2 = a + (b-a) * rand(S2,1); &lt;span style="color: #38761d;"&gt;% Pesos entre las neuronas ocultas y las de salida.&lt;/span&gt;&lt;br /&gt;n1 = W1 * P;&lt;br /&gt;A1 = logsig(n1);&lt;br /&gt;n2 = W2 * A1;&lt;br /&gt;A2 = logsig(n2);&lt;br /&gt;e = A2 - T;&lt;br /&gt;error = 0.5 * mean(mean(e.*e));&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;nntwarn &lt;span style="color: purple;"&gt;off&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; itr = 1:epochs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; error &amp;lt;= goal_err &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; i = 1:Q&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; df1 = dlogsig(n1,A1(:,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; df2 = dlogsig(n2,A2(:,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s2 = -2 * diag(df2) * e(:,i);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s1 = diag(df1)* W2' * s2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; W2 = W2 - 0.1 * s2 * A1(:,i)';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b2 = b2 - 0.1 * s2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; W1 = W1 - 0.1 * s1 * P(:,i)';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b1 = b1 - 0.1 * s1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A1(:,i) = logsig(W1*P(:,i),b1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2(:,i) = logsig(W2*A1(:,i),b2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e = T - A2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error = 0.5 * mean(mean(e.*e));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disp(sprintf(&lt;span style="color: purple;"&gt;'Iteración: %5d mse: %12.6f%'&lt;/span&gt;,itr,error));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mse(itr) = error;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;threshold = 0.9; &lt;span style="color: #38761d;"&gt;% Umbral del sistema (umbral más alto = mayor precisión).&lt;/span&gt;&lt;br /&gt;TrnOutput = real(A2&amp;gt;threshold);&lt;br /&gt;disp(&lt;span style="color: purple;"&gt;'Resultado del entrenamiento: '&lt;/span&gt;)&lt;br /&gt;disp(TrnOutput)&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Inicialización del audio de salida.&lt;/span&gt;&lt;br /&gt;y = [];&lt;br /&gt;sil = [];&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:N:length(x)-N&lt;br /&gt;&amp;nbsp;&amp;nbsp; coefs = calCoeficientes(x(j:j+N-1))';&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; % Clasificamos el frame en voz o silencio.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; n1 = W1 * coefs;&lt;br /&gt;&amp;nbsp;&amp;nbsp; A1 = logsig(n1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; n2 = W2 * A1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; A2test = logsig(n2);&lt;br /&gt;&amp;nbsp;&amp;nbsp; resultado = real(A2test&amp;gt;threshold);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; resultado(1) == 1 &amp;amp;&amp;amp; resultado(2) == 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = [y; x(j:j+N-1)];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sil = [sil; x(j:j+N-1)];&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-7979338544343955626?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/7979338544343955626/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=7979338544343955626' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/7979338544343955626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/7979338544343955626'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/11/detector-de-actividad-de-voz-vad.html' title='Detector de actividad de voz (VAD)'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3gUFAGd1YV0/TM7P5NK0NGI/AAAAAAAAAYA/TfMRc7duPH8/s72-c/Audio.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-2879512609976269582</id><published>2010-10-08T21:31:00.013+02:00</published><updated>2010-10-08T22:07:29.923+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='electrónica'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento de voz'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='generador'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Detector de pitch</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Como pequeña parte de mi &lt;i&gt;Proyecto Fin de Carrera&lt;/i&gt;, en el cual ya estoy sumergido y que desvelaré más adelante, he requerido programar en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; un &lt;b&gt;detector del pitch&lt;/b&gt; para una secuencia de audio de entrada. Con esta herramienta pretendo modelar la secuencia de notas musicales desconocidas contenidas en un audio de entrada.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;El detector de pitch programado en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; se basa en la idea de máxima semejanza espectral.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Se construye en primer lugar una base de datos de espectros ideales de las distintas notas plausibles de detectar mediante convolución de una ventana espectral con un tren de impulsos que simboliza las posiciones del tono fundamental y sus armónicos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/TK93qb7b2wI/AAAAAAAAAXs/SC_r8TjfAig/s1600/EspectroIdeal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/TK93qb7b2wI/AAAAAAAAAXs/SC_r8TjfAig/s1600/EspectroIdeal.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;El usuario entonces podrá controlar como parámetros el tamaño de la ventana y el solapamiento con el entorno, determinando así el tamaño de los fragmentos temporales que aproximaremos como estacionarios en el audio de entrada. A cada uno de estos fragmentos enventanados (mediante &lt;i&gt;hamming&lt;/i&gt; por defecto) se le calcula el módulo de la &lt;i&gt;FFT&lt;/i&gt; y se realiza un producto escalar de vectores entre dicho módulo y cada uno de los espectros ideales de la base de datos. El espectro ideal, tal que multiplicado escalarmente por el módulo de la &lt;i&gt;FFT&lt;/i&gt; del fragmento enventanado del audio de entrada devuelva el máximo valor, será finalmente el correspondiente con la nota detectada, habiéndose minimizado así el error cuadrático:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;$E = ||H(\omega)-G(\omega)||^{2} = ||H(\omega)||^{2} + ||G(\omega)||^{2}-2H(\omega)G(\omega)$&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Donde $H(\omega)$ es el espectro ideal y $G(\omega)$ es el espectro real.&lt;br /&gt;&lt;br /&gt;Se han realizado distintas pruebas y los resultados óptimos se obtienen utilizando un único armónico aparte del tono fundamental en la construcción del espectro ideal. También se han fijado otros parámetros como un umbral energético para establecer si existe nota musical o el fragmento se corresponde con silencio.&lt;br /&gt;&lt;br /&gt;El código para &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; se encuentra a continuación. &lt;span style="color: blue;"&gt;El éxito en las pruebas realizadas es del 100% y su funcionamiento óptimo&lt;/span&gt;. La ayuda se encuentra detallada en la propia función.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota:&lt;/b&gt; He limitado la detección de notas en el rango Sol2 - Sol5 (3 octavas), correspondiente a mi registro vocal (ya se explicará el porqué más adelante).&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #38761d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% DETECTOR DE PITCH&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% y = detectorPitch(x,wsize,sol,fm)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Donde 'x' es el audio mono a analizar de entrada, 'wsize' el tamaño de la&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% ventana o fragmentos en los que se segmentará el audio de entrada (valor&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% típico en el rango 50ms-250ms) dado en segundos, 'sol' el solapamiento&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% entre fragmentos adyacentes también dado en segundos (valor típico en el&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% rango 10ms-50ms) y 'fm' la frecuencia de muestreo del audio de entrada&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% dada en Hz's.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = detectorPitch(x,wsize,sol,fm)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Lo damos en término de muestras.&lt;/span&gt;&lt;br /&gt;wsize = round( wsize * fm );&lt;br /&gt;sol = round( sol * fm );&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Obtención de los espectros ideales de referencia.&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% k = floor((fm/(2*freq)) - 1);&lt;/span&gt;&lt;br /&gt;k = 1;&lt;br /&gt;l = 1;&lt;br /&gt;h = [0.2 0.55 0.8 0.95 1 0.95 0.8 0.55 0.2];&lt;br /&gt;o = 2;&lt;br /&gt;&lt;span style="color: blue;"&gt;for &lt;/span&gt;n = 8:12&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; freq = 440*(2^((o-4) + ((n-10)/12)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vec = zeros(1,fm/2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; for &lt;/span&gt;arm = 1:(k+1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec(round(freq*arm)) = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec = conv(vec,h);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vec = vec(5:length(vec)-4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sideal(l,:) = vec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; l = l + 1; &lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; o = 3:4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; n = 1:12&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; freq = 440*(2^((o-4) + ((n-10)/12)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec = zeros(1,fm/2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; arm = 1:(k+1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec(round(freq*arm)) = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec = conv(vec,h);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vec = vec(5:length(vec)-4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sideal(l,:) = vec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; l = l + 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;o = 5;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; n = 1:8&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; freq = 440*(2^((o-4) + ((n-10)/12)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec = zeros(1,fm/2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; for&lt;/span&gt; arm = 1:(k+1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec(round(freq*arm)) = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vec = conv(vec,h);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vec = vec(5:length(vec)-4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sideal(l,:) = vec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; l = l + 1; &lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Calculamos el espectro de cada trozo enventanando según hamming.&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Definimos las constantes de la ventana.&lt;/span&gt;&lt;br /&gt;a0 = 0.53836;&lt;br /&gt;a1 = 0.46164;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Umbral de detección de nota.&lt;/span&gt;&lt;br /&gt;umbral = 2;&lt;br /&gt;l = 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:(wsize-sol-1):length(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; wsize &amp;gt; length(x) - j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; N = length(x) - j + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; N = wsize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = 1:N;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vent = a0 - a1*cos(2*pi*n/(N-1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trozo = x(j:j+N-1).*vent';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;% Calculamos la FFT del trozo.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spc = abs(fft(trozo,fm));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spc = spc(1:fm/2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spc = spc/max(spc);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; n = 1:1:length(sideal(:,1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vecAux(n) = sum(spc'.*sideal(n,:));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [maxim,pos] = max(vecAux);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y(l) = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; if&lt;/span&gt; maxim &amp;gt; umbral&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y(l) = pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l = l + 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Bloque para devolver la secuencia de notas.&lt;/span&gt;&lt;br /&gt;ind = 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:length(y)-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; if&lt;/span&gt; y(j) ~= y(j+1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y2(ind) = y(j);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;y2(ind) = y(length(y));&lt;br /&gt;vNotas = [&lt;span style="color: purple;"&gt;'Sol2 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol#2'&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La2&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La#2 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Si2&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do#3 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re#3 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Mi3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa#3&lt;/span&gt; &lt;span style="color: purple;"&gt;'&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol3 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol#3'&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La#3 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Si3&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do#4 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re#4 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Mi4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa#4 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol4&lt;/span&gt; &lt;span style="color: purple;"&gt;'&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol#4'&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'La#4 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Si4&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do5&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Do#5 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re5&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Re#5 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Mi5&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa5&amp;nbsp; '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Fa#5 '&lt;/span&gt;;&lt;span style="color: purple;"&gt;'Sol5 '&lt;/span&gt;];&lt;br /&gt;ind = 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:length(y2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; y2(j) ~= 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y3(ind,:) = vNotas(y2(j),:);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Imprimimos la secuencia de notas detectada por pantalla.&lt;/span&gt;&lt;br /&gt;y3&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-2879512609976269582?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/2879512609976269582/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=2879512609976269582' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2879512609976269582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2879512609976269582'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/10/detector-de-pitch.html' title='Detector de pitch'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3gUFAGd1YV0/TK93qb7b2wI/AAAAAAAAAXs/SC_r8TjfAig/s72-c/EspectroIdeal.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-1017183736303338361</id><published>2010-06-14T14:03:00.000+02:00</published><updated>2010-06-14T14:03:56.022+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ojos rojos'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Corrección de ojos rojos</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A veces, cuando realizamos una fotografía con flash, podemos apreciar el indeseado efecto de los &lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;j&lt;span style="color: red;"&gt;o&lt;/span&gt;s rojos&lt;/b&gt;. Esto es debido a que la pupila se encuentra, normalmente, muy dilatada en el momento de realizar la fotografía con flash (ya que esta tiene lugar en un ambiente oscuro y, por tanto, la pupila ha de captar mayor luminosidad para integrar una imagen del entorno correctamente). La luz del flash entonces entra a través de la pupila y se refleja produciendo ese característico color rojo propio de los capilares sanguíneos situados en dicha zona.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Flashes modernos, previo a la realización de la fotografía, emiten un primer destello cuya finalidad es que la pupila se contraiga. Con esta misma premisa, un truco casero previo a la realización de la foto, consistiría en someterse a una fuente intensa de luz durante unos instantes a fin de conseguir la contracción de la pupila.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Si no podemos evitar el efecto, algunas cámaras digitales y programas de retoque fotográfico incluyen alguna funcionalidad para mitigarlo. De esto se trata la presente entrada, en la que desarrollamos un sistema semi-automático para intentar corregir el efecto de los ojos rojos.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A continuación detallamos los pasos de la solución particular propuesta.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Esta solución se encuentra inspirada someramente por el artículo de &lt;i&gt;Jalal &lt;/i&gt;acerca de la detección de ojos. Observé que, ante el color rojo intenso del efecto producido por el flash sobre los ojos, las componentes cromáticas, según el modelo &lt;b&gt;&lt;i&gt;YCbCr&lt;/i&gt;&lt;/b&gt;, presentaban unas características bien diferenciadas y es que, los ojos en la componente &lt;i&gt;Cb &lt;/i&gt;tendían al negro y en la componente &lt;i&gt;Cr&lt;/i&gt; al blanco. A partir de esta idea, tratamos de aislar y localizar los ojos en la imagen. Asistamos paso a paso la solución mediante un ejemplo.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Consideremos la siguiente fotografía de partida:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYTkqtrX0I/AAAAAAAAAS8/pK6vEANTJzs/s1600/i1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYTkqtrX0I/AAAAAAAAAS8/pK6vEANTJzs/s320/i1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Transformando al modelo de color &lt;i&gt;YCbCr&lt;/i&gt;, obtenemos que los canales &lt;i&gt;Cb&lt;/i&gt; y &lt;i&gt;Cr&lt;/i&gt; son, respectivamente:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYT4gxCr8I/AAAAAAAAATE/QlqVUaQl2us/s1600/i2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYT4gxCr8I/AAAAAAAAATE/QlqVUaQl2us/s400/i2.png" width="322" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Si invertimos el canal &lt;i&gt;Cr&lt;/i&gt;, los ojos quedarán también bastante más oscuros que el resto de la imagen, obteniendo:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYUFUSmXQI/AAAAAAAAATM/cNK93ESwmTE/s1600/i3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYUFUSmXQI/AAAAAAAAATM/cNK93ESwmTE/s320/i3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Ahora, si sumamos Cb + Cr’, conseguiremos un contraste tal que los ojos serán mucho más oscuros que el resto de la imagen, de tal modo que obtenemos:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYUUWVq9UI/AAAAAAAAATU/0Yy_PCuzadg/s1600/i4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYUUWVq9UI/AAAAAAAAATU/0Yy_PCuzadg/s320/i4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Aplicando una función de &lt;i&gt;stretching&lt;/i&gt; sobre el anterior resultado conseguimos un mayor contraste entre los ojos y el fondo, obteniendo lo siguiente:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYUiPdQ2hI/AAAAAAAAATc/WBg2u5TLCMs/s1600/i5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYUiPdQ2hI/AAAAAAAAATc/WBg2u5TLCMs/s320/i5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Justamente en este punto entra en juego el primer parámetro de caracterización de la función, y este es el nivel de umbralización de la anterior imagen con &lt;i&gt;stretching&lt;/i&gt;. Para un valor umbral de &lt;i&gt;128&lt;/i&gt;, obtenemos:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYUv2Syk2I/AAAAAAAAATk/pQvWZa_rQqM/s1600/i6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYUv2Syk2I/AAAAAAAAATk/pQvWZa_rQqM/s320/i6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Este parámetro es crítico y su nivel óptimo impredecible, pues es dependiente de la característica aleatoria de cada imagen. Si el valor es demasiado bajo, se tiende a perder potencial información sobre ojos en la imagen y, si es demasiado alto, pueden considerarse otras partes de la imagen como falsos ojos rojos, siendo ambas situaciones indeseables (podría aplicarse un algoritmo de umbralización óptimo como es el método de Otsu para la&amp;nbsp; estimación del umbral tal que se maximice la varianza inter-clase). En la mayoría de los casos, un valor intermedio en un rango con bastante tolerancia debe ser más que suficiente. En el caso que nos ocupa, como se observa, el valor intermedio comentado de 128 (umbral standard) nos proporciona un resultado bastante bueno, pues ya tenemos delimitados nuestros ojos rojos.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Lo único que nos queda ya por hacer es determinar su posición dentro de la imagen. Para tal fin, usaremos proyecciones de histogramas. Para mayor comodidad de análisis con los mismos, invertiremos de nuevo la imagen anterior, a fin de observar los ojos en blanco y quedar estos caracterizados en las proyecciones de histograma como lóbulos de un cierto ancho:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYU8Rx6ueI/AAAAAAAAATs/NdpccraXM0A/s1600/i7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/TBYU8Rx6ueI/AAAAAAAAATs/NdpccraXM0A/s320/i7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A continuación calculamos las proyecciones de histograma, obteniéndose para las proyecciones horizontal y vertical, respectivamente:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYVfjX7QtI/AAAAAAAAAT0/k-hv6enTCr0/s1600/i8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYVfjX7QtI/AAAAAAAAAT0/k-hv6enTCr0/s640/i8.png" width="396" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Se observa en ambas imágenes dos picos, los cuales caracterizan las coordenadas del punto central de cada uno de los ojos. Para no llevar a equívocos, pues ahora precisamos determinar la posición de los picos y el ancho de los lóbulos, suavizamos las proyecciones de histograma mediante una función gaussiana 1-D, en la cual entra en juego el segundo parámetro de la rutina, y este es la varianza de la función. Conseguiremos un mayor suavizado para una mayor varianza (la longitud de la función gaussiana con la que convolucionamos las proyecciones de histograma es constante y es de 11 muestras). Un valor que funciona bien es &lt;i style="color: blue;"&gt;σ^2 = 16&lt;/i&gt;. De hecho, este parámetro es potencialmente extraíble de la función, ya que funciona bien para el valor constante antes comentado, aunque, no obstante, he decidido dejarlo. A continuación se muestran las proyecciones de histograma suavizadas:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYWHlUvvPI/AAAAAAAAAT8/I_9DJnIWjF4/s1600/i9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYWHlUvvPI/AAAAAAAAAT8/I_9DJnIWjF4/s640/i9.png" width="377" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Como es normal, si usamos un valor bajo de varianza, obtendremos un resultado más abrupto, lo cual, nos puede llevar a equívocos a la hora de determinar el número y la posición de los ojos. Por el contrario, si el valor de varianza es excesivamente alto (o lo fuera el del número de muestras de la función gaussiana con la que convolucionamos), podríamos perder información acerca de los picos y, por tanto, del número y posición de los ojos.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Mediante un algoritmo de detección de pendiente, conseguimos contar el número de picos sobre las proyecciones de histograma (lo cual nos revela información acerca del número de ojos y las coordenadas de sus centros). Mediante otro algoritmo de detección de pendiente, conseguimos calcular el número de valles a fin de caracterizar el ancho de los lóbulos (esto nos da información acerca del radio del ojo, tanto horizontal, como vertical). Para el ejemplo que nos ocupa obtenemos los siguientes datos mediante el algoritmo que implementé en MatLab:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Posición de picos Posición de valles&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Proyección Horizontal&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;83, 103&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 71, 93 y 115&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Proyección Vertical&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;114, 242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 102, 127, 230 y 255&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Pero, ahora surge una duda. Normalmente, el número de picos de la proyección horizontal es igual al de la proyección vertical y, estos son iguales al número de ojos rojos en la fotografía. Sin embargo, tenemos &lt;i&gt;N^2 &lt;/i&gt;posibles ojos rojos debido a las combinaciones posibles entre picos de ambas proyecciones (en nuestro caso particular, hasta 4, donde realmente hay 2). Para solventar esta ambigüedad, sumamos todos los niveles de gris de cada uno de los rectángulos cuyos lados quedan definidos por la posición de los valles y cuyos centros por las distintas combinaciones de los picos en la última imagen con la región de los ojos en blanco. Si la combinación de picos no se corresponde con un ojo, la suma de este rectángulo será eminentemente 0. Sin embargo, si se corresponde, la suma será un valor elevado. El punto de corte para considerar si una combinación de picos determina o no el centro geométrico de un ojo, viene definido porque, al menos, el 25% de píxels del rectángulo que comprende al hipotético ojo, sea blanco. Si es así, en la imagen &lt;i&gt;&lt;span style="color: red;"&gt;R&lt;/span&gt;&lt;span style="color: lime;"&gt;G&lt;/span&gt;&lt;span style="color: blue;"&gt;B&lt;/span&gt;&lt;/i&gt; se pinta una cruz con centro el centro geométrico del ojo y cuya longitud de brazos viene determinada por el ancho de los lóbulos (es decir, por la posición de los valles).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Sabido esto, para la anterior imagen obtenemos:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/TBYWrDS6OwI/AAAAAAAAAUE/R3Q_rPxqOvw/s1600/i10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/TBYWrDS6OwI/AAAAAAAAAUE/R3Q_rPxqOvw/s320/i10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Una vez detectada la posición de los ojos rojos, únicamente habremos de corregir su tonalidad. Aquí entra en juego el último de los parámetros. Este parámetro se basa también en establecer un umbral para la imagen Cb + Cr’, de forma que se analiza cada uno de los rectángulos que comprende aun ojo sobre dicha imagen según los valores antes obtenidos de picos y valles. Si el nivel de gris &lt;i&gt;i-ésimo&lt;/i&gt; en el rectángulo que comprende a cada uno de los ojos es menor que el umbral, se considera ojo rojo y se castiga a los niveles RGB con factores 0.10, 0.12 y 0.12, respectivamente (es decir, se tiende a llevar al negro, que sería lo correcto para el color de la pupila). Si es superior el nivel de gris &lt;i&gt;i-ésimo&lt;/i&gt;, se entiende que no forma parte del ojo rojo y, por tanto, se deja intacto.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Este parámetro es muy importante y participa, junto con el primero, de forma directa en la calidad final de la imagen retocada. Si el umbral es muy bajo, corremos el riesgo de no corregir el color rojo de los ojos. Sin embargo, si es muy alto, tenderemos a llevar al negro todo el rectángulo que abarca al ojo.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;El resultado final para un umbral de corrección de 200, resulta ser:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYXAddDSiI/AAAAAAAAAUM/7LFaRmFKBQM/s1600/i11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBYXAddDSiI/AAAAAAAAAUM/7LFaRmFKBQM/s320/i11.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;La forma de utilizar la función implementada en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; es la siguiente y se puede descargar haciendo clic &lt;/span&gt;&lt;a href="http://telematica.hostei.com/OjosRojos.rar" style="font-family: Verdana,sans-serif;"&gt;aquí&lt;/a&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;y = correctorOjosRojos(imagen,nUmb,var,cte)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Donde en &lt;i&gt;y&lt;/i&gt; se obtiene la matriz imagen corregida, siendo imagen la imagen&lt;/span&gt; &lt;span style="font-family: Verdana,sans-serif;"&gt;de entrada con el defecto de los ojos rojos, &lt;i&gt;nUmb&lt;/i&gt; el umbral para&lt;/span&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt; binarización aplicado tras el primer &lt;i&gt;stretching&lt;/i&gt;, &lt;i&gt;var&lt;/i&gt; la varianza de la función gaussiana de suavizado y &lt;i&gt;cte&lt;/i&gt; el punto de corte para consideración de píxel rojo o no durante la corrección final.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-1017183736303338361?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/1017183736303338361/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=1017183736303338361' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/1017183736303338361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/1017183736303338361'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/06/correccion-de-ojos-rojos.html' title='Corrección de ojos rojos'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3gUFAGd1YV0/TBYTkqtrX0I/AAAAAAAAAS8/pK6vEANTJzs/s72-c/i1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-3118355487935401425</id><published>2010-06-14T00:32:00.002+02:00</published><updated>2010-06-14T00:35:42.455+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='OMR'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Reconocimiento automático de partituras</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Mi amigo Jonathan y yo hemos programado un pequeño código que intenta ser un &lt;i&gt;&lt;b&gt;reconocedor automático de partituras&lt;/b&gt;&lt;/i&gt; basado en el procesamiento de la imagen (algo análogo al &lt;i&gt;&lt;b&gt;OCR&lt;/b&gt;&lt;/i&gt; para el reconocimiento de caracteres).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La idea es que una partitura escaneada pueda ser digitalizada para ser interpretada y procesada su información por un computador (por ejemplo, para conseguir una reproducción automática de la misma).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Sólo reconoce partituras sencillas, funcionando del siguiente modo (caracterizamos cada uno de los bloques funcionales):&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Preprocesamiento (OMR.m)&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;En este primer apartado adaptamos la partitura para su tratamiento. Una vez&lt;/span&gt; obtenemos la imagen de la misma, supuesta su entrada con el modelo de color &lt;i&gt;&lt;span style="color: red;"&gt;R&lt;/span&gt;&lt;span style="color: lime;"&gt;G&lt;/span&gt;&lt;span style="color: blue;"&gt;B&lt;/span&gt;&lt;/i&gt;, la transformamos a niveles de gris para seguidamente invertirla. La misión de la inversión es la de un tratamiento más sencillo mediante la contemplación de la información contenida en la partitura como niveles de gris relativamente grandes frente al fondo tendente a nivel cero. Finalmente aplicamos binarización para que los píxels de interés se mantengan en blanco frente al fondo negro.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Corrección de la inclinación (corregirInclinacion.m)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Esta etapa está incluida en el preprocesado de la imagen y como su nombre indica consiste en corregir la inclinación que pueda presentar la imagen de partida. Este paso es de vital importancia dado que los métodos de segmentación y reconocimiento desarrollados no operarían correctamente ante la presencia de este defecto.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;El método seguido para llevar a cabo la corrección de la inclinación se basa principalmente en la &lt;b style="color: #990000;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Transformada_de_Hough" target="_blank"&gt;&lt;i&gt;transformada de Hough&lt;/i&gt;&lt;/a&gt;&lt;/b&gt;. En primer lugar se aplica la &lt;i&gt;transformada de Hough&lt;/i&gt; con una resolución en la componente theta de &lt;i&gt;0.05º&lt;/i&gt;. El espacio de parámetros de salida usado es el polar. La ventaja que aporta (aparte de los problemas que nos evitamos con las líneas verticales) es que obtenemos directamente una aproximación del ángulo de inclinación de la imagen. El porqué de optar por el uso de la transformada de Hough es por las características inherentes de la imagen que vamos a emplear. Dado que estamos ante la imagen de una partitura musical que presenta numerosos pentagramas, los máximos de la &lt;i&gt;transformada de Hough&lt;/i&gt; se corresponderán con las líneas que componen dichos pentagramas. En consecuencia uno de los máximos de la &lt;i&gt;transformada de Hough&lt;/i&gt; nos proporcionará la ecuación de la recta en coordenadas polares asociada a una de las líneas de los pentagramas y a partir de la misma podremos obtener directamente una estimación del ángulo de inclinación. Posteriormente, por si acaso la imagen presenta aún cierta inclinación, se opta por un ajuste de tanteo. Este consiste en aplicar inclinaciones a la imagen en los márgenes de error que tenemos tras aplicar el paso de la &lt;i&gt;transformada de Hough&lt;/i&gt;. La realimentación para determinar si las correcciones que estamos realizando están surtiendo efecto o no (y en definitiva para obtener convergencia hacia la solución) se basan en el estudio de la proyección horizontal del histograma de la imagen resultado.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Segmentación de pentagramas (OMR.m)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A continuación segmentamos la imagen separando pentagramas y título de la partitura. Esto lo logramos con ayuda de la proyección horizontal de histograma. Dado que el fondo es completamente negro, las zonas inter-pentagrama se caracterizarán en la proyección horizontal de histograma por una secuencia continua de ceros por lo que, mediante un algoritmo de búsqueda de ceros basado en comparación con el valor anterior y posterior, establecemos el punto medio entre dos pentagramas para que estos sean separados.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Segmentación de símbolos (segSimb.m)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Ahora, para cada uno de los pentagramas, así como para el título, la función programada en &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; se encarga de segmentar cada uno de los símbolos que componen la línea con la ayuda de la proyección vertical de histograma de cada una de las líneas por separado. En el caso de un pentagrama, en su proyección vertical de histograma se podrá observar un nivel mínimo de continua correspondiente a la contribución de las cinco líneas del pentagrama. Este nivel, que conocemos como el &lt;i&gt;mínimo no-cero&lt;/i&gt;, es detectado para cada uno de los pentagramas individualmente de modo que, con un algoritmo similar al anteriormente presentado para la segmentación de la proyección horizontal de histograma, segmentamos los símbolos de cada una de las líneas detectadas (con la diferencia del uso de un algoritmo de búsqueda del &lt;i&gt;mínimo no-cero&lt;/i&gt; comentado). Estos límites intersimbólicos podrían aprovecharse para la segmentación directa del elemento en la imagen. No obstante, se prefirió realizar una caracterización del símbolo mediante el estudio del contorno de la proyección vertical de histograma del mismo, ya que podemos limitar su extensión mucho más fácilmente respecto de la extensión del símbolo en el interior del pentagrama (comentar en este sentido que la caracterización del símbolo mediante el estudio de seis momentos estadísticos arrojó peores resultados respecto del método finalmente implementado).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Reconocimiento de símbolos (segSimb.m y funClasif.m)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;A continuación se procede a la clasificación de cada uno de los símbolos detectados según el siguiente patrón. Ya hemos dicho que realmente estamos segmentando la proyección de histograma vertical del símbolo. Pues bien, con esta información hacemos lo siguiente:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;- Eliminación de la componente de continua detectada como el &lt;i&gt;mínimo no-cero&lt;/i&gt; anteriormente comentado.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;- Normalización de los valores de la proyección vertical de histograma del símbolo.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;- Obtención de 24 coeficientes del módulo de la &lt;b style="color: #990000;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Transformada_r%C3%A1pida_de_Fourier" target="_blank"&gt;&lt;i&gt;FFT&lt;/i&gt;&lt;/a&gt;&lt;/b&gt; de la proyección vertical de histograma del símbolo.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;- Comparación con cada uno de los patrones base almacenados por clase en la base de datos. La selección de la clase a la cual pertenece el símbolo se realiza en base a la minimización del error lineal calculado como la acumulación de las diferencias en valor absoluto entre cada par de coeficientes de los módulos de las &lt;i&gt;FFT&lt;/i&gt;’s del símbolo en estudio y del patrón de la base de datos con el cual se compara.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;El estudio del símbolo en base a la &lt;i&gt;FFT&lt;/i&gt; se basa, junto con la normalización, en la importancia de caracterizar con un número standard de coeficientes el símbolo, de modo que se contemple la propiedad de la invarianza a la escala.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;La función de &lt;i&gt;&lt;b&gt;&lt;span style="color: #b45f06;"&gt;Mat&lt;/span&gt;&lt;span style="color: #134f5c;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; asume que el símbolo que se estudia se va a encontrar en la base de datos, por lo que se selecciona mediante minimización del error y no se establece ningún umbral necesario tipo tolerancia para poder clasificarse o no.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Otra limitación importante es que la función también asume que el título sólo ocupa la primera línea segmentada mediante la proyección horizontal de histograma. Esto se ha pensado así debido a la forma de segmentar un símbolo dentro de un pentagrama. Recordemos que el símbolo se lleva sobre el nivel cero (eliminación de la componente de continua introducida por las cinco líneas de pentagrama). Pues bien, el programa hace una excepción sobre el cálculo del nivel mínimo de continua para la primera línea ya que, si se selecciona un &lt;i&gt;mínimo no-cero&lt;/i&gt; en la línea del título, podemos perder y distorsionar la información no proveyendo un resultado coherente.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Comentar que sobre los cinco sencillos ejemplos provistos se obtienen unos resultados excelentes con este método de clasificación.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Los símbolos contemplados en la base de datos son los siguientes. Notar que, para mayor precisión en la selección, por cada símbolo se incluyen varias caracterizaciones en función de si este puede aparecer reflejado, invertido (piénsese en una figura como una &lt;i&gt;blanca&lt;/i&gt;)…&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBVX6YT4AYI/AAAAAAAAAS0/VzVuMjYJtoQ/s1600/Figuras.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/TBVX6YT4AYI/AAAAAAAAAS0/VzVuMjYJtoQ/s400/Figuras.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;El reconocimiento de más símbolos aparte de los incluidos en la base de datos sería inmediatamente extensible, pudiendo cubrir con este método partituras de mayor complejidad si fuese necesario.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Como se observa, tampoco se ha incluido el reconocimiento de armaduras por simplicidad (sólo se admiten partituras cuya tonalidad sea de Do mayor o su relativo menor La menor) ni alteraciones accidentales. Por tanto, las partituras que se proporcionan están todas transportadas a la tonalidad de Do mayor.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;Detección de tono (deteccionTono.m)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Una vez tenemos segmentada la imagen y se han reconocido las figuras musicales se procede a la detección de tono donde se requiera. El método seguido para la detección de tono está basado en el uso de la proyección horizontal del histograma. Dado el trozo de la imagen hallamos su proyección horizontal (sobre el eje &lt;i&gt;y&lt;/i&gt;). A continuación se sigue un método en el que se determina tanto la posición de las líneas del pentagrama como las líneas virtuales (se pueden definir 13 líneas desde el Re 7 al Sol 3, 5 visibles y 8 virtuales). Lo que hacemos es recorrer la proyección horizontal hasta determinar las líneas del pentagrama. Como las líneas del pentagrama estarán representadas en blanco y ocuparán todo el trozo de la imagen se corresponderán con máximos. Así determinamos sus posiciones y las distancias de separación entre cada par de líneas. Haciendo un promedio de la separación entre pares de líneas adyacentes visibles podemos obtener una estimación de la separación (aplicando redondeo por estar en un espacio discreto) entre líneas. Con esta separación estimada podemos determinar las posiciones de las 8 líneas virtuales restantes.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Una vez determinadas todas las posiciones vamos recorriendo la proyección del histograma situándonos en las líneas estimadas y en el punto medio de ambas. En cada posición haremos la suma de todos los elementos del histograma en un entorno igual a la mitad de la separación estimada.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Finalmente en aquella posición (de las 26 posibles, líneas y puntos medios entre dos líneas) donde se obtenga una suma mayor se considera que se encuentra la figura musical y en consecuencia podremos establecer.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Los distintos ficheros y partituras de prueba se pueden descargar &lt;/span&gt;&lt;b style="color: #990000;"&gt;&lt;a href="http://telematica.hostei.com/OMR.rar" style="font-family: Verdana,sans-serif;"&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;. El fichero &lt;i&gt;demo.m&lt;/i&gt; ejecuta un ejemplo, obteniéndose el resultado en un fichero de texto con los distintos símbolos reconocidos y las frecuencias auditivas de las notas musicales.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-3118355487935401425?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/3118355487935401425/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=3118355487935401425' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3118355487935401425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3118355487935401425'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/06/reconocimiento-automatico-de-partituras.html' title='Reconocimiento automático de partituras'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3gUFAGd1YV0/TBVX6YT4AYI/AAAAAAAAAS0/VzVuMjYJtoQ/s72-c/Figuras.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-6713208866042644498</id><published>2010-04-20T00:36:00.004+02:00</published><updated>2010-04-23T12:25:36.561+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Limpieza de imágenes biomédicas</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La &lt;i&gt;&lt;b&gt;limpieza de imágenes biomédicas&lt;/b&gt;&lt;/i&gt; consiste en obtener una imagen de la muestra de interés lo más pura posible. Esta imagen, normalmente se obtiene aplicando operaciones matemáticas sencillas, basadas en transformaciones globales, sobre las imágenes obtenidas a través del microscopio con el portaobjetos con y sin muestra.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La función que finalmente he desarrollado es muy sencilla y en ella no se puede controlar ningún parámetro, sino que devuelve un resultado unívoco para las imágenes de entrada. Si la función del parámetro está bien definida, es interesante no pasar por alto su contribución en un problema de índole aleatoria como es este, donde no conocemos las características de las imágenes de entrada (no con total determinismo).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;En primer lugar restamos píxel a píxel el fondo a la imagen de la muestra contaminada con el ruido. Esto lo hacemos así y no a la inversa debido a que la muestra contrasta con el fondo por estar a contraluz, es decir, la muestra es más oscura. Si lo hiciésemos al contrario perderíamos mucha información siendo, en algunos casos, imposible dar una solución medianamente aceptable al problema.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Una vez restadas las imágenes, obtendremos un resultado bastante limpio, como es lógico, aunque con poco contraste. Por ello, le aplicamos &lt;i&gt;stretching&lt;/i&gt;, cuya función de transferencia adjunto en la siguiente figura, así como el código de la función implementada en &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;H(l) = 255(l - mín)/(max - mín)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S8zYrq1B8RI/AAAAAAAAAR8/oxt12iF8zGk/s1600/Graf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S8zYrq1B8RI/AAAAAAAAAR8/oxt12iF8zGk/s320/Graf.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Donde &lt;i style="color: blue;"&gt;max&lt;/i&gt; y &lt;i style="color: blue;"&gt;mín&lt;/i&gt; son los niveles de gris máximo y mínimo presentes en la imagen.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% STRETCHING&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% y = stretch(x)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Donde en 'y' se obtiene la imagen tras aplicar la operación, siendo % 'x' la imagen de entrada.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = stretch(x)&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Algunos parámetros necesarios.&lt;/span&gt;&lt;br /&gt;minimo = double(min(min(x)));&lt;br /&gt;maximo = double(max(max(x)));&lt;br /&gt;filas = length(x(:,1));&lt;br /&gt;columnas = length(x(1,:));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Definición de la función de transferencia y aplicación.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:1:filas&lt;br /&gt;&lt;span style="color: blue;"&gt;for &lt;/span&gt;k = 1:1:columnas&lt;br /&gt;y(j,k) = round((255/(maximo-minimo))*double(x(j,k))-minimo*(255/(maximo-minimo)));&lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Finalmente sólo nos queda invertir los niveles de gris de la imagen resultante a fin de obtener el objeto de interés en negro sobre el fondo blanco. El siguiente código implementa todo el sistema haciendo uso de la función anteriormente descrita. Además, las siguientes figuras recogen algunos resultados obtenidos sobre ejemplos reales.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;% FUNCIÓN PARA LA LIMPIEZA DE IMÁGENES RUIDOSAS&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;function&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; y = Biolimp2(img,fon)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;% Diferencia del fondo y la imagen.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;img2 = fon - img;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;% Stretching del resultado.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;y2 = stretch(img2);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;% Inversión del resultado y muestra por pantalla.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;for &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;j = 1:1:length(y2(:,1))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;for&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; k = 1:1:length(y2(1,:))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;y(j,k) = 255 - y2(j,k);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;end&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;subplot(2,1,1), imshow(img), title(&lt;/span&gt;&lt;span style="color: purple; font-size: x-small;"&gt;'Imagen original'&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;subplot(2,1,2), imshow(y), title(&lt;/span&gt;&lt;span style="color: purple; font-size: x-small;"&gt;'Imagen limpia'&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S8zZHr4Ko8I/AAAAAAAAASE/tbb9TRMsLt4/s1600/Bio23.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S8zZHr4Ko8I/AAAAAAAAASE/tbb9TRMsLt4/s400/Bio23.jpg" width="400" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S8zZOc__R7I/AAAAAAAAASM/QfESSE-o-fg/s1600/Bio22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S8zZOc__R7I/AAAAAAAAASM/QfESSE-o-fg/s400/Bio22.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Pueden existir muchas variantes del anterior método mucho más complejas como, por ejemplo, extraer estadísticamente algún parámetro de la imagen para delimitar el tipo de crecimiento (entre exponencial y logarítmico) de una función de &lt;i&gt;stretching&lt;/i&gt; en forma de &lt;i&gt;S&lt;/i&gt;, que “mejorase” el contraste entre el fondo y la muestra biomédica. No obstante, dado que el análisis final será personal y cualitativo, estas pequeñas diferencias no aportarán nada o prácticamente nada, por lo que pienso que es preferible una función sencilla y eficiente a algo más complejo que será desaprovechado finalmente por el ojo humano (en principio).&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-6713208866042644498?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/6713208866042644498/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=6713208866042644498' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/6713208866042644498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/6713208866042644498'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/04/limpieza-de-imagenes-biomedicas.html' title='Limpieza de imágenes biomédicas'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3gUFAGd1YV0/S8zYrq1B8RI/AAAAAAAAAR8/oxt12iF8zGk/s72-c/Graf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-3483403098336268179</id><published>2010-03-29T02:02:00.000+02:00</published><updated>2010-03-29T02:02:38.057+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='corto'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Perfilador de imágenes</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Un &lt;i&gt;&lt;b&gt;perfilador de imágenes&lt;/b&gt;&lt;/i&gt; se encargaría de conseguir el efecto contrario al deseado cuando se aplica la técnica de suavizado. Para resaltar los bordes de una imagen y así perfilarla, es necesario detectarlos previamente mediante alguna técnica de derivación de la imagen (en mi caso reutilizaré el detector de bordes mediante filtrado lineal gaussiano). Una vez hecho esto, sería suficiente con realizar alguna ponderación sobre la matriz de bordes detectados, sumando el resultado a la imagen original.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La siguiente función para &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; se encarga de ello. Funciona exactamente igual que el detector de fronteras explicado unas entradas más abajo. Sólo se ha incluido una inversión de la imagen filtrada (debido a la característica primitiva del filtrado) y la comentada ponderación y posterior adición.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;A continuación se adjuntan el código y un ejemplo aplicado sobre una fotografía de la ciudad de &lt;i&gt;Brisbane&lt;/i&gt; (&lt;i style="color: #073763;"&gt;Australia&lt;/i&gt;).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Perfilador&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Función para perfilar imágenes (efecto contrario al suavizado).&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Y = perfilador(x,var,dim,f)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Donde en 'Y' se almacena la matriz imagen resultado, siendo 'x' la matriz&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% imagen en niveles de gris de entrada sobre la que queremos aplicar el&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% perfilado. Por otro lado, 'var' es la varianza de la función gaussiana 2-D&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% (a mayor varianza, mayor consideración de figuras como borde (mayor &lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% densidad de bordes)) y 'dim' es el tamaño, en píxels, del área del filtro&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% con el que convolucionaremos (promediaremos). A mayor 'dim',&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% representación de las fronteras como líneas de mayor grosor. Por último,&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% 'f' es el factor de escalado de la imagen de fronteras detectada para&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% ponderar su suma con la imagen original y obtener el efecto deseado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function &lt;/span&gt;y = perfilador(x,var,dim,f)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Algunos parámetros necesarios.&lt;/span&gt;&lt;br /&gt;filas = length(x(:,1));&lt;br /&gt;columnas = length(x(1,:));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Generación de la respuesta espacial del filtro gaussiano.&lt;/span&gt;&lt;br /&gt;H = zeros(dim,dim);&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:1:dim&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; for&lt;/span&gt; k = 1:1:dim&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; H(j,k) = exp(-(( ((j)^2) + ((k)^2) - 2*(round(dim/2))*(j) - 2*(round(dim/2))*(k) + (round(dim/2)^2) + (round(dim/2)^2) )/(2*var)));&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Normalización del volumen del filtro en el dominio espacial.&lt;/span&gt;&lt;br /&gt;k = (1-sum(sum(H)))/(dim^2);&lt;br /&gt;H = H + k;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Representación de la magnitud de la respuesta espacial del filtro.&lt;/span&gt;&lt;br /&gt;surf(H)&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Filtrado mediante convolución en el dominio espacial y representación.&lt;/span&gt;&lt;br /&gt;z = filter2(H,x);&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Inversión del resultado por característica del filtrado.&lt;/span&gt;&lt;br /&gt;z = uint8(255*z);&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:1:filas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:columnas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; z(j,k) = 255 - z(j,k);&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Perfilado de la imagen con la matriz de fronteras detectadas.&lt;/span&gt;&lt;br /&gt;y = f.*z + x;&lt;br /&gt;figure&lt;br /&gt;subplot(2,1,1), imshow(x), title(&lt;span style="color: purple;"&gt;'Imagen original'&lt;/span&gt;);&lt;br /&gt;subplot(2,1,2), imshow(y), title(&lt;span style="color: purple;"&gt;'Imagen perfilada'&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6_s5r6TtFI/AAAAAAAAARs/cNVnAkGMJsA/s1600/Brisbane.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6_s5r6TtFI/AAAAAAAAARs/cNVnAkGMJsA/s400/Brisbane.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;i&gt;Imagen original.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6_s9sg9rxI/AAAAAAAAAR0/3vPUqkWL56M/s1600/BrisbanePerf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6_s9sg9rxI/AAAAAAAAAR0/3vPUqkWL56M/s400/BrisbanePerf.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;i&gt;Imagen perfilada con varianza unidad, dimensión de máscara 5x5 y factor de ponderación 0.2.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-3483403098336268179?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/3483403098336268179/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=3483403098336268179' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3483403098336268179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/3483403098336268179'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/03/perfilador-de-imagenes.html' title='Perfilador de imágenes'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3gUFAGd1YV0/S6_s5r6TtFI/AAAAAAAAARs/cNVnAkGMJsA/s72-c/Brisbane.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-2032424795498264587</id><published>2010-03-26T02:41:00.003+01:00</published><updated>2010-03-28T00:56:10.631+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Detección de fronteras</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Casualmente he logrado hacer un &lt;i&gt;&lt;b&gt;detector de fronteras&lt;/b&gt;&lt;/i&gt; para imágenes en niveles de gris (extensible para imágenes en cualquier otro formato de color como &lt;b&gt;&lt;span style="color: red;"&gt;R&lt;/span&gt;&lt;span style="color: lime;"&gt;G&lt;/span&gt;&lt;span style="color: blue;"&gt;B&lt;/span&gt;&lt;/b&gt;).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;En principio estaba intentando hacer un simple filtro de suavizado (o desenfoque) gaussiano como primer paso para la realización de un &lt;i&gt;filtro de Wiener&lt;/i&gt; de enfoque gaussiano dada una imagen de entrada desenfocada (debido a que el desenfoque producido por una cámara puede ser modelado mediante una función gaussiana).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;No obstante, por error, he logrado realizar un detector de fronteras mediante un simple filtrado con el que se puede controlar tanto la resolución o densidad de bordes como la anchura de los mismos (mediante la parametrización de la varianza y tamaño del bloque espacial convolucionable).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Es una solución muy simple, rápida, eficiente y elegante basada, como digo, en un filtrado. La clave de que esto haya podido ser así, he observado que se asienta sobre la normalización del volumen que encierra el área gaussiana representada en la respuesta espacial del bloque convolucionable. Esta normalización se produce por desplazamiento en altitud de la respuesta espacial del filtro, lo que se traduce en un filtrado pasa-alta con coeficientes negativos y otro pasa-baja con coeficientes positivos. A partir de haber hecho esto (pensado como mero paso para un correcto promediado que no alterase los niveles de gris de la imagen original) pude observar sin más la detección de fronteras.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;A continuación adjunto unos ejemplos y un par de respuestas espaciales de los filtros, así como el código de la función implementada en &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wOJdlHWHI/AAAAAAAAAQk/_YDlVqQWK9o/s1600/Nautilus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wOJdlHWHI/AAAAAAAAAQk/_YDlVqQWK9o/s400/Nautilus.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt;Imagen original 1.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wOZX3LmgI/AAAAAAAAAQs/toVUbiqvY7Y/s1600/Nautilus2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wOZX3LmgI/AAAAAAAAAQs/toVUbiqvY7Y/s400/Nautilus2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt;Fronteras detectadas por filtrado de la imagen 1 (var = 2 dim = 10).&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6wOuuFkcjI/AAAAAAAAAQ0/BM9xTKoRasY/s1600/Amor.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6wOuuFkcjI/AAAAAAAAAQ0/BM9xTKoRasY/s400/Amor.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt; Imagen original 2.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wO7e3n9HI/AAAAAAAAAQ8/ruTXs8T4kW0/s1600/Amor2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wO7e3n9HI/AAAAAAAAAQ8/ruTXs8T4kW0/s400/Amor2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;Fronteras detectadas por filtrado de la imagen 2 (var = 4 dim = 12).&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wPZfjrCtI/AAAAAAAAARE/VuEVxgDEAZs/s1600/RFreq1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wPZfjrCtI/AAAAAAAAARE/VuEVxgDEAZs/s400/RFreq1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Respuesta espacial del filtro aplicado a la imagen 2.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S6wPnuft_JI/AAAAAAAAARM/Y5mJUrb31wg/s1600/%C3%81rbol.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S6wPnuft_JI/AAAAAAAAARM/Y5mJUrb31wg/s400/%C3%81rbol.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;Imagen original 3.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wPu6oJb6I/AAAAAAAAARU/0CPB89zCM94/s1600/%C3%81rbol2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wPu6oJb6I/AAAAAAAAARU/0CPB89zCM94/s400/%C3%81rbol2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;i&gt;Fronteras detectadas por filtrado de la imagen 3 (var = 1 dim = 10).&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S6wQEmZ9wiI/AAAAAAAAARc/RoTj8S5QLRs/s1600/RFreq2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S6wQEmZ9wiI/AAAAAAAAARc/RoTj8S5QLRs/s400/RFreq2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Respuesta espacial del filtro aplicado a la imagen 3.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Detector de fronteras&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Función para la detección de fronteras basada en filtrado gaussiano.&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Y = detBordes(x,var,dim)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Donde en 'Y' se almacena la matriz imagen resultado, siendo 'x' la matriz&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% imagen en niveles de gris de entrada sobre la que queremos aplicar el&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% filtrado. Por otro lado, 'var' es la varianza de la función gaussiana 2-D&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% (a mayor varianza, mayor consideración de figuras como borde (mayor &lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% densidad de bordes)) y 'dim' es el tamaño, en píxels, del área del filtro&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% con el que convolucionaremos (promediaremos). A mayor 'dim',&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% representación de las fronteras como líneas de mayor grosor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = detBordes(x,var,dim)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Generación de la respuesta espacial del filtro gaussiano.&lt;/span&gt;&lt;br /&gt;H = zeros(dim,dim);&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:1:dim&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:dim&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; H(j,k) = exp(-(( ((j)^2) + ((k)^2) - 2*(round(dim/2))*(j) - 2*(round(dim/2))*(k) + (round(dim/2)^2) + (round(dim/2)^2) )/(2*var)));&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Normalización del volumen del filtro en el dominio espacial.&lt;/span&gt;&lt;br /&gt;k = (1-sum(sum(H)))/(dim^2);&lt;br /&gt;H = H + k;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Representación de la magnitud de la respuesta espacial del filtro.&lt;/span&gt;&lt;br /&gt;surf(H)&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Filtrado mediante convolución en el dominio espacial y representación.&lt;/span&gt;&lt;br /&gt;y = filter2(H,x);&lt;br /&gt;figure&lt;br /&gt;subplot(2,1,1), imshow(x), title(&lt;span style="color: purple;"&gt;'Imagen original'&lt;/span&gt;);&lt;br /&gt;subplot(2,1,2), imshow(y), title(&lt;span style="color: purple;"&gt;'Imagen filtrada'&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-2032424795498264587?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/2032424795498264587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=2032424795498264587' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2032424795498264587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2032424795498264587'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/03/deteccion-de-fronteras.html' title='Detección de fronteras'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3gUFAGd1YV0/S6wOJdlHWHI/AAAAAAAAAQk/_YDlVqQWK9o/s72-c/Nautilus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-4066354646275867997</id><published>2010-03-19T04:00:00.000+01:00</published><updated>2010-03-19T04:00:53.904+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fotografía'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Suavizado de bordes en imágenes</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;En este documento explico cómo abordo el planteamiento y construcción de un sistema que he ideado para el suavizado (especialmente de bordes) de imágenes.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;La idea del sistema es bien sencilla y está basada en &lt;i&gt;&lt;b&gt;minimización de gradiente&lt;/b&gt;&lt;/i&gt;. El método se encarga de iterar el siguiente algoritmo:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Para el píxel &lt;i&gt;i-ésimo&lt;/i&gt; de la imagen (con &lt;b&gt;&lt;i&gt;i&lt;/i&gt;&lt;i&gt; = 1,2,...,FxC&lt;/i&gt;&lt;/b&gt;) almacenamos en un vector el valor de las muestras diferenciales calculadas como la diferencia del nivel de gris del píxel &lt;i&gt;i-ésimo&lt;/i&gt; con cada uno de los niveles de gris de los píxels de su vecindad.&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Mediante comparación, para cada uno de los valores del anterior vector construido (en valor absoluto), estudiamos si alguno de ellos excede el valor diferencial máximo impuesto por el parámetro de entrada, donde este valor diferencial máximo se obtiene como:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: black; color: white; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;b&gt;diferencia_máxima = (1 - parámetro)(Niveles - 1)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Donde &lt;i&gt;Niveles&lt;/i&gt; hace referencia al número de niveles de gris de la imagen (por defecto &lt;i&gt;Niveles = 256&lt;/i&gt;) y &lt;i&gt;parámetro&lt;/i&gt; es un valor real en el intervalo &lt;i&gt;[0,1]&lt;/i&gt;, donde &lt;i&gt;0&lt;/i&gt; indicaría suavizado mínimo (ya que establecería la diferencia máxima de niveles de gris entre dos píxels contiguos en &lt;i&gt;255&lt;/i&gt;) y &lt;i&gt;1&lt;/i&gt; haría lo propio referenciando suavizado máximo (ya que no permitiría diferencia de niveles de gris ninguna en la imagen, lo que se traduce en una imagen final de un nivel de gris continuo).&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Si ninguno de los valores del vector, en valor absoluto, excede el diferencial máximo de niveles de gris, se vuelve al &lt;i&gt;paso 1&lt;/i&gt;, hasta completar el recorrido por la imagen. Si alguno sí supera esta cota, calculamos el nuevo valor de gris del píxel, a partir del píxel vecino que provoca la máxima diferencia (&lt;i&gt;gradiente&lt;/i&gt;), de la forma:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: black; color: white; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;b&gt;I(i) = I(i) + signo(diferencia_máxima - gradiente)&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;Donde &lt;i&gt;signo&lt;/i&gt; controla el signo de la resta entre el píxel &lt;i&gt;i-ésimo&lt;/i&gt; y uno de los vecinos.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;b&gt;4. &lt;/b&gt;Una vez se hayan recorrido todos los píxeles de la imagen con este procedimiento, se repetirá el algoritmo tantas veces como sea necesario hasta que en la &lt;i&gt;n-ésima&lt;/i&gt; iteración no se haya producido ningún cambio en la imagen.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;De lo anterior se deduce que el algoritmo ha de ser convergente en un número finito de pasos. No he procedido a su demostración matemática, aunque parece intuitivo que esto sea así. El caso que sí podría poner en peligro la convergencia del método, sería el de una imagen que no tuviese bordes, como se daría en la situación de una imagen continua proyectada sobre una superficie esférica.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;Notar que el concepto de vecindad se basa en un &lt;b&gt;8-entorno&lt;/b&gt;, así como que el comportamiento de la implementación en los bordes pasa por considerar únicamente los píxels reales contiguos (es decir, en el caso de un píxel en una esquina, el entorno estaría compuesto por &lt;i&gt;3 píxels&lt;/i&gt;).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;A continuación adjunto el código &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; y un ejemplo de una fotografía a la que le aplico el sistema con diferentes coeficientes de suavizado. Notar que es mejor usar un coeficiente intermedio (aunque depende del caso) para no falsear en exceso la imagen original y dar un pequeño suavizado.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;% SUAVIZADOR DE BORDES&lt;/span&gt;&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Esta función se encarga de suavizar una imagen (especialmente los bordes)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% mediante minimización de gradiente. Gracias a un parámetro de entrada,&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% controlaremos el máximo valor permitido entre muestras diferenciales.&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Uso de la función:&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% imagen_suavizada = suavizaBordes(x,param)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;%&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Donde x es la imagen constituida por una matriz MxN (en niveles de gris)&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% y param es un parámetro que puede valer entre 0 y 1, donde 0 se&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% corresponde con mínimo suavizado y 1 con máximo suavizado. El resultado&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% se devuelve en forma de matriz en la variable imagen_suavizada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = suavizaBordes(x,param)&lt;br /&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;if &lt;/span&gt;param &amp;lt; 0 || param &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disp(&lt;span style="color: purple;"&gt;'Error: el parámetro de suavizado es un número real entre 0 y 1 inclusives'&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;% Algunos parámetros que usaremos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; grayL = 256;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filas = length(x(:,1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; columnas = length(x(1,:));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr = zeros(1,8);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; check = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; check ~= 0&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Reestablecemos la variable de comprobación de no-modificación&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % para la n-ésima iteración del algoritmo. Si en la presente&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % iteración converge, no habrá modificación ni de la imagen ni de&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % la variable y habremos terminado.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; check = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for &lt;/span&gt;j = 1:1:filas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:columnas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; % Obtención del gradiente en el píxel j-k-ésimo.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if &lt;/span&gt;j &amp;gt; 1 &amp;amp;&amp;amp; k &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j-1,k-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;j &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j-1,k);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/span&gt; j &amp;gt; 1 &amp;amp;&amp;amp; k &amp;lt; columnas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j-1,k+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;k &amp;lt; columnas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j,k+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;j &amp;lt; filas &amp;amp;&amp;amp; k &amp;lt; columnas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j+1,k+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;j &amp;lt; filas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j+1,k);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;j &amp;lt; filas &amp;amp;&amp;amp; k &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j+1,k-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = ind + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/span&gt; k &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr(ind) = y(j,k) - y(j,k-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vAbs = abs(vGr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [maxi,pos] = max(vAbs);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valor = round((1-param) * (grayL-1));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % En caso de que el valor diferencial de muestras exceda el&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % definido por el parámetro de entrada (respecto del peor caso), &lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % indicamos que hemos hecho una modificación en el actual &lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % recorrido por la imagen y establecemos el píxel de tal&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % modo que la diferencia de nivel de gris entre dicho píxel&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % y el vecino, no exceda del valor establecido por el&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % parámetro de suavizado.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; valor &amp;lt; maxi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; check = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; signo = vGr(pos)/abs(vGr(pos));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y(j,k) = y(j,k) + signo * (valor - maxi);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;end&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp; % Reinicialización de variables para un nuevo análisis de píxel.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ind = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vGr = vGr.*0;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; % Pintado de las imágenes original y tratada.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; figure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subplot(2,1,1), imshow(x), title(&lt;span style="color: purple;"&gt;'Imagen original'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subplot(2,1,2), imshow(y), title(&lt;span style="color: purple;"&gt;'Imagen suavizada'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6LoAIdiMOI/AAAAAAAAAQM/JTKy8dp4_QQ/s1600-h/Yo+Original.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S6LoAIdiMOI/AAAAAAAAAQM/JTKy8dp4_QQ/s400/Yo+Original.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;Imagen original algo pixelada.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6LoH7zZdCI/AAAAAAAAAQU/xHAZlNQ3Wqw/s1600-h/Yo+0,8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S6LoH7zZdCI/AAAAAAAAAQU/xHAZlNQ3Wqw/s400/Yo+0,8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;Imagen suavizada con coeficiente 0.8&lt;/i&gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S6LoOSuCnOI/AAAAAAAAAQc/IX5SW76XL30/s1600-h/Yo+0,85.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S6LoOSuCnOI/AAAAAAAAAQc/IX5SW76XL30/s400/Yo+0,85.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;Imagen suavizada con coeficiente 0.85&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-4066354646275867997?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/4066354646275867997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=4066354646275867997' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/4066354646275867997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/4066354646275867997'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/03/suavizado-de-bordes-en-imagenes.html' title='Suavizado de bordes en imágenes'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3gUFAGd1YV0/S6LoAIdiMOI/AAAAAAAAAQM/JTKy8dp4_QQ/s72-c/Yo+Original.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-944985442082640946</id><published>2010-03-03T18:19:00.000+01:00</published><updated>2010-03-03T18:19:44.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Sistema para la Afinación Automática de Sonidos Polifónicos (III)</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Un ejemplo de una burda implementación del sistema en &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;. El primer compendio de código responde al texto central que hay que ejecutar y que usa otras funciones programadas que adjunto justo a continuación.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;span style="color: #38761d;"&gt;% A³ v0.1 : Afinador Automático de Acordes.&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% Autor: Iván López Espejo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;clear;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Generación de un acorde desafinado con armónicos.&lt;/span&gt;&lt;br /&gt;chord = [];&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Definición de frecuencias fundamentales y de la frecuencia de muestreo.&lt;/span&gt;&lt;br /&gt;frec1 = 435;&lt;br /&gt;frec2 = 520;&lt;br /&gt;frec3 = 650;&lt;br /&gt;frecM = 44100;&lt;br /&gt;&lt;span style="color: blue;"&gt;for &lt;/span&gt;j = 1:1:frecM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = cos(2*pi*frec1*j/frecM);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = chord(j) + cos(2*pi*frec2*j/frecM);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = chord(j) + cos(2*pi*frec3*j/frecM);&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Decremento exponencial de la amplitud de los armónicos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = chord(j) + exp(-k)*cos(2*pi*(k+1)*frec1*j/frecM);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = chord(j) + exp(-k)*cos(2*pi*(k+1)*frec2*j/frecM);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chord(j) = chord(j) + exp(-k)*cos(2*pi*(k+1)*frec3*j/frecM);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Calculamos los tonos fundamentales que componen el sonido polifónico.&lt;/span&gt;&lt;br /&gt;spectrum = fft(chord);&lt;br /&gt;vF = estTon(chord);&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Filtramos el acorde de forma que obtenemos tantos espectros como tonos&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% fundamentales haya y afinamos por separado cada uno de ellos.&lt;/span&gt;&lt;br /&gt;sonidoFinal = zeros(1,length(chord));&lt;br /&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:length(vF)&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Espectro filtrado con el k-ésimo tono y sus armónicos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; H = chordFilter(spectrum,vF(k));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Estimamos hacia qué frecuencia debemos afinar con la función lineal&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % clasificadora.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = clasif(vF(k));&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Afinación del espectro con establecimiento de la variable de control&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; % a 0 por proporción del espectro.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; notaAf = afin(H,num,vF(k),0);&lt;br /&gt;&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; % Agregamos los sonidos resultantes afinados en el dominio del tiempo.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sonidoFinal = sonidoFinal + notaAf;&lt;br /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;% Finalmente reproducimos los sonidos polifónicos afinado y desafinado en el dominio del&lt;/span&gt;&lt;br style="color: #38761d;" /&gt;&lt;span style="color: #38761d;"&gt;% tiempo.&lt;/span&gt;&lt;br /&gt;soundsc(chord,frecM)&lt;br /&gt;soundsc(sonidoFinal,frecM)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #38761d; font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Función que se encarga de afinar un determinado conjunto de todo y&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% armónicos mediante desplazamiento del espectro.&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Autor: Iván López Espejo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = afin(nota,num,fA,ToF)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Cálculo de la octava a la que corresponde la frecuencia dada.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;octava = floor(log2(fA/32.7) + 1);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Cálculo de la frecuencia dado el número de nota.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;fN = 440*exp(((octava - 4) + ((num-10)/12))*log(2));&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Parámetro alpha de escalado del tiempo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;alpha = fN/fA;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Espectro de la nota. Si ToF (variable de control) está a 1, al comienzo&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% se proporciona el sonido en el dominio del tiempo, si está a 0, en el&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% dominio de la frecuencia.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; ToF == 1&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spec = fft(nota);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;else&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spec = nota;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Obtención del espectro afinado haciendo uso de la propiedad de escalado&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% temporal de la transformada de Fourier.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;specAf = [];&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:length(spec)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; round(k/alpha) &amp;gt; 0 &amp;amp;&amp;amp; round(k/alpha) &amp;lt; length(spec) + 1&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; specAf(k) = spec(round(k/alpha))*abs(1/alpha);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;specAf = [specAf(1:length(spec)/2) specAf(length(spec)/2:-1:1)];&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Devolución del resultado.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;trans = ifft(specAf);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;sonFin = abs(trans);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:length(trans);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; signo = real(trans(k))/abs(real(trans(k)));&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sonFin(k) = sonFin(k)*signo;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;y = sonFin;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #38761d; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #38761d; font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Función que filtra del espectro todo sonido a excepción del tono&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% fundamental y armónicos asociados de interés.&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Autor: Iván López Espejo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = chordFilter(spec,freq)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Generación del filtro en el dominio del tiempo como la señal a la&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% frecuencia fundamental con una cierta dispersión y sus armónicos&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% audibles.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;tFilter = [];&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;frecM = 44100;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; j = 1:1:frecM&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = cos(2*pi*freq*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = tFilter(j) + cos(2*pi*(freq-1)*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = tFilter(j) + cos(2*pi*(freq+1)*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; for&lt;/span&gt; k = 2:1:ceil(22050/freq)-1&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = tFilter(j) + cos(2*pi*k*freq*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = tFilter(j) + cos(2*pi*k*(freq-1)*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tFilter(j) = tFilter(j) + cos(2*pi*k*(freq+1)*j/frecM);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Filtro en el dominio de la frecuencia (normalizado).&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;fFilter = fft(tFilter);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;fFilter = fFilter/max(fFilter);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Aplicación del filtro sobre el espectro dado.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;y = fFilter.*spec;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Decisor lineal a partir de la transformación logarítmica de la escala&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% musical exponencial.&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Autor: Iván López Espejo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = clasif(freq)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Cálculo de la octava a partir de la frecuencia.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;octava = floor(log2(freq/32.7) + 1);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Cálculo de la nota dentro de la octava a partir de la frecuencia (Do = 1,&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Do# = 2, ... , Si = 12).&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;n = 10 + 12*(log(freq/440) - log(2)*(octava - 4))/log(2);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; n == round(n)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disp(&lt;span style="color: purple;"&gt;'La nota está perfectamente afinada.'&lt;/span&gt;)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 0;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/span&gt; round(n) == 13&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 1;&lt;br /&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/span&gt; round(n) == 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 12;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = round(n);&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue;" /&gt;&lt;span style="color: blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #38761d; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Función auxiliar para la estimación de los tonos fundamentales&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% componentes del sonido polifónico.&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Autor: Iván López Espejo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; y = estTon(x)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Cálculo del espectro del sonido polifónico dado en el dominio del tiempo.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;spectrum = abs(fft(x));&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Nos quedamos con la representación del espectro entre 0 y pi.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;spectrum = spectrum(1:length(spectrum)/2);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Obtenemos los 10 máximos del espectro.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;vM = [];&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 1:1:10&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [maxim,pos] = max(spectrum);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vM(k) = pos;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spectrum(pos) = min(spectrum);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Clasificamos en tonos fundamentales o desechamos armónicos.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;vF(1) = vM(1);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Tolerancia: valor de desviación máximo entre el natural ideal que&lt;/span&gt;&lt;br style="color: #38761d; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% multiplica la frecuencia fundamental y el real.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;epsilon = 0.05;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;mark = 0;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt; k = 2:1:length(vM)&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; for&lt;/span&gt; l = 1:1:k-1&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dv = vM(k)/vM(l);&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;nbsp; if &lt;/span&gt;abs(round(dv) - dv) &amp;gt; epsilon&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mark = mark + 1;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue; font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="color: blue; font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/span&gt;mark == k-1&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vF = [vF vM(k)];&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mark = 0;&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: blue; font-family: Verdana,sans-serif;"&gt;end&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="color: #38761d; font-family: Verdana,sans-serif;"&gt;% Devolución del vector de tonos fundamentales detectados.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;y = vF;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-944985442082640946?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/944985442082640946/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=944985442082640946' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/944985442082640946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/944985442082640946'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/03/sistema-para-la-afinacion-automatica-de_03.html' title='Sistema para la Afinación Automática de Sonidos Polifónicos (III)'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-5024929942784989182</id><published>2010-03-02T01:03:00.014+01:00</published><updated>2010-03-02T17:46:39.629+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Sistema para la Afinación Automática de Sonidos Polifónicos (II)</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como dije, en esta entrada vamos a ver un ejemplo simplificado del sistema. En el caso de querer aplicarlo sobre instrumentos reales habría que realizar un estudio más extenso y a fondo, el cual no voy a hacer por falta de tiempo, presupuesto y apoyo, pero se me ocurriría que podría realizarse con ventanados, pues la característica del timbre del instrumento se encuentra distribuida a lo largo de todo el eje de frecuencias y no sólo se concentra en los tonos y armónicos componentes del sonido polifónico.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Supongamos que tenemos un acorde de &lt;i style="color: blue;"&gt;La menor&lt;/i&gt; construido sobre un &lt;b&gt;&lt;i&gt;La 4&lt;/i&gt;&lt;/b&gt;&lt;b&gt; (La-Do-Mi)&lt;/b&gt;. No obstante, las frecuencias de los tonos fundamentales de las notas componentes del acorde son &lt;i style="color: blue;"&gt;435Hz (para el La a 440Hz), 520Hz (para el Do a 523.25Hz) y 650Hz (para el Mi a 659.26Hz)&lt;/i&gt;, &lt;b&gt;por lo que está desafinado&lt;/b&gt;.&lt;o:p&gt;&lt;/o:p&gt; (idealmente 440Hz), &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;En la siguiente figura se observa un conjunto de 1000 muestras del acorde:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xNKepcVuI/AAAAAAAAAOE/Spn52j_yDpw/s1600-h/Acorde+Desafinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xNKepcVuI/AAAAAAAAAOE/Spn52j_yDpw/s400/Acorde+Desafinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 2.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; 1000 muestras del acorde desafinado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El sonido polifónico está muestreado a 44100Hz (calidad de audio) y está compuesto por, aparte de los tres tonos fundamentales, 20 armónicos cuya amplitud sufre un decaimiento exponencial por cada uno de los tonos fundamentales. A continuación, el bloque &lt;b&gt;&lt;i&gt;Estimador de Tonos Fundamentales&lt;/i&gt;&lt;/b&gt; calcula el módulo de la DFT del acorde entre &lt;i&gt;0&lt;/i&gt; y&lt;/span&gt;&lt;span style="font-size: small;"&gt; &lt;i&gt;pi&lt;/i&gt;. Como se aprecia en la &lt;i&gt;figura 3&lt;/i&gt;, esta etapa implementa un algoritmo de selección de posición de máximos que se correspondan con las frecuencias de los tonos fundamentales. Por simplicidad, cada muestra se refiere a un hertzio, por lo que sobre el eje de abscisas se puede ver directamente la frecuencia fundamental de cada una de las notas componentes del acorde:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4xNiKT2BRI/AAAAAAAAAOM/xEZRu0fKv8k/s1600-h/Espectro+Acorde+Desafinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4xNiKT2BRI/AAAAAAAAAOM/xEZRu0fKv8k/s400/Espectro+Acorde+Desafinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;b&gt;&lt;i&gt;Figura 3.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Espectro del acorde desafinado.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;Por ello, el vector devuelto por el bloque será &lt;b&gt;&lt;i&gt;v = (435,520,650)&lt;/i&gt;&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora, por cada nota detectada, se procederá del siguiente modo. La etapa &lt;b&gt;&lt;i&gt;Filtro&lt;/i&gt;&lt;/b&gt;, conocida la frecuencia fundamental de la nota i-ésima, con &lt;i&gt;i = 1,2,…,M&lt;/i&gt;, siendo en este caso &lt;i&gt;M = 3&lt;/i&gt;, generará el filtro en el dominio del tiempo anteriormente descrito. La siguiente secuencia de figuras recoge 1000 muestras de cada una de las respuestas temporales de los filtros según el vector &lt;b&gt;&lt;i&gt;v&lt;/i&gt;&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xOJhPGDrI/AAAAAAAAAOU/huvqXFqs8uk/s1600-h/Filtro+Tiempo+435.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xOJhPGDrI/AAAAAAAAAOU/huvqXFqs8uk/s400/Filtro+Tiempo+435.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;b&gt;&lt;i&gt;Figura 4.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Respuesta en el dominio temporal del filtro para la nota cuya frecuencia fundamental se sitúa en 435Hz.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xOut-JCLI/AAAAAAAAAOc/coWyN3L9LdY/s1600-h/Filtro+Tiempo+520.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xOut-JCLI/AAAAAAAAAOc/coWyN3L9LdY/s400/Filtro+Tiempo+520.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 5.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Respuesta en el dominio temporal del filtro para la nota cuya frecuencia fundamental se sitúa en 520Hz.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xPTzsAuQI/AAAAAAAAAOk/ucWTNSoRA3k/s1600-h/Filtro+Tiempo+650.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xPTzsAuQI/AAAAAAAAAOk/ucWTNSoRA3k/s400/Filtro+Tiempo+650.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 6.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Respuesta en el dominio temporal del filtro para la nota cuya frecuencia fundamental se sitúa en 650Hz.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para cada uno de los filtros anteriormente generados se calcula el producto de sus respuestas en frecuencia con el espectro del acorde, lo que nos devuelve, en este caso, tres espectros (puesto que &lt;i&gt;M = 3&lt;/i&gt;) que se corresponden con los propios de las notas componentes del sonido polifónico por separado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;“Paralelamente”, el &lt;b&gt;&lt;i&gt;Clasificador Lineal&lt;/i&gt;&lt;/b&gt; hace uso de las frecuencias estimadas de los tonos fundamentales para determinar hacia qué nota debe afinarse cada una de las componentes de la polifonía según lo descrito. Es decir:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xPdRQD4uI/AAAAAAAAAOs/PsxAg42MLqo/s1600-h/12.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xPdRQD4uI/AAAAAAAAAOs/PsxAg42MLqo/s400/12.gif" width="400" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Realizamos una simple clasificación lineal basada en minimización de distancia en el espacio de las notas musicales, por lo que deducimos que las notas componentes son &lt;b&gt;La4-Do5-Mi5&lt;/b&gt;, como se puede extraer de la tabla anteriormente presentada. Las frecuencias reales de las notas son, en consecuencia:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xPpejeJzI/AAAAAAAAAO0/t7Sey2eCtbE/s1600-h/13.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xPpejeJzI/AAAAAAAAAO0/t7Sey2eCtbE/s400/13.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Todos estos datos son recogidos por la etapa &lt;b&gt;&lt;i&gt;Afinador por Desplazamiento de Espectro. &lt;/i&gt;&lt;/b&gt;De este modo, para cada una de las notas componentes del acorde, calculamos el parámetro &lt;i&gt;&lt;b&gt;alpha&lt;/b&gt;&lt;/i&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xP6dwA9kI/AAAAAAAAAO8/sb58Svp7HkM/s1600-h/14.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xP6dwA9kI/AAAAAAAAAO8/sb58Svp7HkM/s400/14.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Estos son los parámetros de escalado temporal motivados por la necesidad de modificar el &lt;i&gt;pitch&lt;/i&gt; de cada una de las notas desafinadas. Pensemos en que el tono fundamental de cada una de las notas componentes de la polifonía se puede aproximar por la función &lt;i style="color: blue;"&gt;cos(2pift)&lt;/i&gt;, por lo que, para conseguir que dicho tono se sitúe ahora a la frecuencia &lt;i style="color: blue;"&gt;f'&lt;/i&gt;, precisaremos de multiplicar el anterior argumento por &lt;i style="color: blue;"&gt;&lt;b&gt;alpha = f'/f&lt;/b&gt;&lt;/i&gt;, de tal modo que &lt;i style="color: blue;"&gt;cos(alpha2pift) = cos(2pif't)&lt;/i&gt;. &lt;/span&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Esta idea la hacemos corresponder con la propiedad de escalado temporal de la transformada de Fourier anteriormente expuesta. A continuación se muestra la secuencia de espectros componentes ya afinados:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xRRR-MAsI/AAAAAAAAAPE/1ZrrWdjXGfs/s1600-h/La+Afinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xRRR-MAsI/AAAAAAAAAPE/1ZrrWdjXGfs/s400/La+Afinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 7.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Espectro del La 4 afinado.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xRv1rAoTI/AAAAAAAAAPM/OaaEiGthghk/s1600-h/Do+Afinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4xRv1rAoTI/AAAAAAAAAPM/OaaEiGthghk/s400/Do+Afinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 8.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Espectro del Do 5 afinado.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4xR-j98niI/AAAAAAAAAPU/Zh0rxSkH_uw/s1600-h/Mi+Afinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4xR-j98niI/AAAAAAAAAPU/Zh0rxSkH_uw/s400/Mi+Afinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 9.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Espectro del Mi 5 afinado.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center" class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La última etapa del diagrama de bloques se encargaría de sumar las transformadas inversas (muestras temporales) de cada uno de los espectros de las notas componentes del acorde, lo que se traduce en el sonido polifónico ya afinado. La siguiente gráfica recoge una comparación entre las primeras 1000 muestras del acorde desafinado (en &lt;b style="color: blue;"&gt;azul&lt;/b&gt;) y las primeras 1000 muestras del acorde ya afinado (en &lt;b style="color: red;"&gt;rojo&lt;/b&gt;). Observar que el filtro introduce una cierta distorsión (sólo sería cuestión de ir &lt;i&gt;"afinando"&lt;/i&gt; el sistema &lt;b&gt;:D&lt;/b&gt;).&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xSoL2gJ-I/AAAAAAAAAPc/7H3xalFBLXY/s1600-h/Acorde+Afinado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4xSoL2gJ-I/AAAAAAAAAPc/7H3xalFBLXY/s400/Acorde+Afinado.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;Figura 10.&lt;/b&gt; Comparación entre acordes afinado y desafinado en el dominio del tiempo.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Podéis descargar el ejemplo comentado a continuación. Notar que por algún problema relacionado con el filtrado o con el desplazamiento de espectro, se introdujo un efecto extraño en el acorde afinado, por lo que para mayor representatividad copié y pegué una secuencia del período más limpio. No obstante, los cortes sí se notan en el ensamblaje, lo que se traduce en un pequeño &lt;i&gt;piqueteo&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;a href="http://telematica.hostei.com/Desafinado.wav" style="color: red;" target="_blank"&gt;ACORDE DESAFINADO&lt;/a&gt; | &lt;a href="http://telematica.hostei.com/Afinado.wav" style="color: red;" target="_blank"&gt;ACORDE AFINADO&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 10pt;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;/div&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-5024929942784989182?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/5024929942784989182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=5024929942784989182' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/5024929942784989182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/5024929942784989182'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/03/sistema-para-la-afinacion-automatica-de.html' title='Sistema para la Afinación Automática de Sonidos Polifónicos (II)'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3gUFAGd1YV0/S4xNKepcVuI/AAAAAAAAAOE/Spn52j_yDpw/s72-c/Acorde+Desafinado.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-5474714723502555961</id><published>2010-02-28T01:37:00.008+01:00</published><updated>2010-11-01T23:45:17.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iván López'/><category scheme='http://www.blogger.com/atom/ns#' term='música'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Sistema para la Afinación Automática de Sonidos Polifónicos (I)</title><content type='html'>&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="font-size: small;"&gt;Este texto recoge la descripción fundamental del procedimiento ideado para la afinación automática (asistida por computador) de sonidos polifónicos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Motivación.&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="font-size: small;"&gt;Todos conocemos de la existencia de plug-in’s y otros softwares de ordenador que nos permiten afinar en tiempo real o por postprocesado una línea melódica, ya sea voz humana u otro instrumento musical como puede ser una guitarra o un violín. No obstante aún no existe un sistema comercial de afinación polifónica. Pensemos en que en un estudio de grabación se recoge como línea de entrada una secuencia de acordes de guitarra. Por algún avatar del destino, algunos de los acordes están desafinados y no podemos volver a grabar dicha secuencia y, sin embargo, queremos respetarla porque su ausencia provocaría un vacío en la pieza musical. La solución radicaría en la afinación asistida por ordenador del acorde o acordes en cuestión. El sistema que se presenta a continuación vendría a auxiliar en caso de que este problema se diese. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="font-size: small;"&gt;Otra utilidad similar podría venir dada por la necesidad de mejora de afinación en una canción u obra que se desea remasterizar. En muchos casos de remasterización de audio, no se dispone de la disgregación de pistas necesarias como para tratar cada línea por separado. El sistema de afinación de una obra en conjunción vendría de nuevo a auxiliar este problema.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Descripción de la solución.&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;La clave de la solución ofertada por este sistema radica en el trabajo realizado en el dominio de la frecuencia ya que, de otro modo, a priori resultaría casi imposible la afinación de polifonía en el dominio del tiempo. Mostraremos una aproximación mediante la generación de un acorde ideal bastante limpio únicamente conformado por los tonos fundamentales y sus respectivos armónicos atenuados exponencialmente. Presentamos a continuación el diagrama de bloques, procediendo seguidamente a su desglose y descripción:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4myiL8s62I/AAAAAAAAAMk/ZZUvrbTEpAg/s1600-h/Diagrama.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4myiL8s62I/AAAAAAAAAMk/ZZUvrbTEpAg/s400/Diagrama.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Figura 1.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Diagrama de bloques del sistema afinador.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;El sonido polifónico desafinado debe ser recogido en primera instancia por el bloque &lt;b&gt;&lt;i&gt;Estimador de Tonos Fundamentales&lt;/i&gt;&lt;/b&gt;. En esta primera etapa se determinan los tonos fundamentales que componen el sonido polifónico mediante el estudio de máximos del espectro. A tal fin, sea el acorde desafinado en el dominio del tiempo el conjunto de &lt;i&gt;N&lt;/i&gt; &lt;/span&gt;&lt;span style="line-height: 115%;"&gt;muestras &lt;i&gt;y(n)&lt;/i&gt;&lt;/span&gt;&lt;span style="line-height: 115%;"&gt;, obtenemos el espectro del mismo mediante la operación de DFT de la forma:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4mzUM3IfaI/AAAAAAAAAMs/Fgu1XMlLPfI/s1600-h/1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3gUFAGd1YV0/S4mzUM3IfaI/AAAAAAAAAMs/Fgu1XMlLPfI/s320/1.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Seguidamente trabajamos con el módulo de la transformada pues, recordemos que la información sonora relevante se encuentra en el módulo del espectro y no en la fase. Por tanto, calculamos las muestras del módulo (suponemos ahora mismo por simplicidad que disponemos también de &lt;i&gt;N&lt;/i&gt;&amp;nbsp;muestras de la DFT) como:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4mzrTh1ZfI/AAAAAAAAAM0/2Pzkvd93Qjo/s1600-h/2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="35" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4mzrTh1ZfI/AAAAAAAAAM0/2Pzkvd93Qjo/s400/2.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez calculado habremos de obtener un conjunto representativo de posiciones de las muestras que son máximos. Estos máximos han de corresponderse con los picos de los tonos y armónicos que conforman el acorde desafinado. Como no sabemos, a priori, el número de tonos fundamentales (o no tenemos porqué saberlo), podemos curarnos en salud tomando las posiciones de un conjunto amplio de máximos aunque, con la experiencia, podremos ir adquiriendo un compromiso que maximice la eficiencia de tal modo que el programa cumpla su cometido a la perfección en el menor tiempo posible.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Mediante un algoritmo de recorrido y comparación entre todas las posiciones de los máximos obtenidos, clasificamos los tonos fundamentales y desechamos los armónicos. El desechado de los armónicos se realiza mediante comparación por cociente entre el potencial armónico y el potencial tono fundamental. De este modo, si uno de los máximos se corresponde con un armónico, el cociente, idealmente, debe ser un número natural &lt;i&gt;&lt;b&gt;n&lt;/b&gt;. &lt;/i&gt;&lt;/span&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Como puede haber cierta desviación, de nuevo, mediante una base de datos estocástica determinaremos el mejor &lt;i&gt;&lt;b&gt;épsilon&lt;/b&gt;&lt;/i&gt; &lt;/span&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;que discierna entre un armónico del que no lo es. En principio, &lt;i&gt;&lt;b&gt;épsilon = 0.05&lt;/b&gt;&lt;/i&gt;, algo más que suficiente.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez estimados todos los tonos fundamentales, la etapa devolverá un vector de tonos fundamentales (los cuales se presuponen desafinados).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="font-size: small;"&gt;A continuación, el bloque &lt;b&gt;&lt;i&gt;Clasificador Lineal&lt;/i&gt;&lt;/b&gt; se encargará, mediante un sistema de decisión lineal, de determinar cuál es el tono fundamental al cual se debe afinar cada uno de los sonidos componentes de la polifonía desafinada. Esto lo hace linealmente adaptando previamente la escala exponencial frecuencial a una función logarítmica. Recordemos que la percepción auditiva del ser humano no es lineal con la frecuencia, sino que la sensación de linealidad proviene del crecimiento exponencial de la frecuencia. Recurriendo a la siguiente expresión:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m0r58iwLI/AAAAAAAAAM8/UABKSROJh_g/s1600-h/3.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m0r58iwLI/AAAAAAAAAM8/UABKSROJh_g/s320/3.gif" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;  &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;Donde log(2) hace referencia al logaritmo neperiano de 2. Nos interesa que la función sólo sea dependiente de &lt;i&gt;&lt;b&gt;n&lt;/b&gt;&lt;/i&gt;, donde &lt;i&gt;&lt;b&gt;n&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;corresponde a la siguiente asociación:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m1Ymr8awI/AAAAAAAAANE/T0OZmSZv0BU/s1600-h/4.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m1Ymr8awI/AAAAAAAAANE/T0OZmSZv0BU/s320/4.gif" width="116" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt; &lt;/span&gt;&lt;span style="line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;Como es lógico, para terminar de caracterizar la nota necesitaremos especificar la octava en la que esta se encuentra, y de ello se encarga la variable o. Podemos dejar expresada la octava, o, en función de la frecuencia como:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m131RvPDI/AAAAAAAAANM/P4OJ_KQz0X4/s1600-h/5.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m131RvPDI/AAAAAAAAANM/P4OJ_KQz0X4/s320/5.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En consecuencia, la función resulta:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m2GkO_sJI/AAAAAAAAANU/XzPtSQeaPRM/s1600-h/6.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m2GkO_sJI/AAAAAAAAANU/XzPtSQeaPRM/s400/6.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La función anterior resulta en un decisor lineal, de modo que, por redondeo, podremos establecer la nota a la cual, respetando la percepción auditiva, se aproxima más la nota desafinada. Se deduce inmediatamente que si n = 1,2,…,12, la nota componente está perfectamente afinada y no será necesario realizar ninguna afinación por desplazamiento de espectro.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El &lt;b&gt;&lt;i&gt;Estimador de Tonos Fundamentales&lt;/i&gt;&lt;/b&gt; enviará el vector de tonos al &lt;b&gt;&lt;i&gt;Clasificador Lineal&lt;/i&gt;&lt;/b&gt;, de tal modo que, por ejemplo, imaginemos que uno de los tonos fundamentales se situase según lo estimado a 450Hz (&lt;/span&gt;&lt;span style="font-size: small;"&gt;f = 450Hz). Aplicando la anterior expresión deducida:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m2wvSI-8I/AAAAAAAAANc/6wrT8aHj8UE/s1600-h/7.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="41" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m2wvSI-8I/AAAAAAAAANc/6wrT8aHj8UE/s400/7.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como 0.3891 &amp;lt; 0.5, n = 10 y, por tanto, se correspondería con un La 4 (a 440Hz). Podemos modificar la tabla decisoria de forma que la afinación no se correspondiese con distancias de medio tono, sino que agrupase armonías concretas, siendo ello mera particularización de lo expuesto. Notar también que consideramos un Do# igual a un Reb, aunque ello no sea estrictamente ortodoxo en la práctica.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; El bloque &lt;b&gt;&lt;i&gt;Filtro&lt;/i&gt;&lt;/b&gt; se encarga de filtrar todo el espectro correspondiente al acorde desafinado de entrada, únicamente respetando las componentes asociadas a cada uno de los tonos, por separado, estimados por el bloque &lt;b&gt;&lt;i&gt;Estimador de Tonos Fundamentales&lt;/i&gt;&lt;/b&gt;. Realizando esta separación, lo que logramos es simplificar el problema, llevándolo posteriormente a una mera afinación de un sonido aislado por desplazamiento del espectro y finalmente sumando todas las muestras afinadas en el dominio del tiempo reconstruyendo la polifonía ya arreglada.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El filtro se genera para cada caso particular según cada una de las frecuencias estimadas. Este filtro no es más que la superposición en el dominio del tiempo del tono fundamental estimado y todos los armónicos audibles con una dispersión de &lt;i&gt;2Hz&lt;/i&gt;, para tratar de no modificar altamente el timbre del instrumento en cuestión. Aplicando la operación de DFT anteriormente descrita, obtenemos la respuesta del filtro en el dominio de la frecuencia, de modo que la convolución en el dominio del tiempo del filtro con el acorde se transforma en el producto de los espectros del filtro y del acorde, seleccionando así una sola nota de las que componen el sonido polifónico:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m3ZCRtyDI/AAAAAAAAANk/hk2ZVBgHrZo/s1600-h/8.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m3ZCRtyDI/AAAAAAAAANk/hk2ZVBgHrZo/s400/8.gif" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;style&gt; &lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Por tanto, este bloque se encargaría de, para cada una de las frecuencias fundamentales estimadas, devolver el espectro de las &lt;b&gt;&lt;i&gt;M&lt;/i&gt;&lt;/b&gt; notas componentes, donde, en consecuencia, &lt;b&gt;&lt;i&gt;i = 1,2,...,M&lt;/i&gt;&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Ahora, con ayuda del &lt;b&gt;&lt;i&gt;Clasificador Lineal&lt;/i&gt;&lt;/b&gt;, el bloque &lt;b&gt;&lt;i&gt;Afinador por Desplazamiento de Espectro&lt;/i&gt;&lt;/b&gt; se encargará de afinar cada una de las notas componentes a partir de los espectros proporcionados por el &lt;b&gt;&lt;i&gt;Filtro&lt;/i&gt;&lt;/b&gt;. Este bloque aprovecha el conocimiento de la frecuencia fundamental estimada y la real o ideal para definir el parámetro &lt;i&gt;&lt;b&gt;alpha = frecuencia ideal/frecuencia estimada&lt;/b&gt;&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Aprovechamos la propiedad de escalado temporal de la transformada de Fourier que nos dice:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m4b0EPRYI/AAAAAAAAANs/zTKbF2q8Zqg/s1600-h/9.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3gUFAGd1YV0/S4m4b0EPRYI/AAAAAAAAANs/zTKbF2q8Zqg/s320/9.gif" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt; &lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;En consecuencia, cada uno de los espectros devueltos por el &lt;b&gt;&lt;i&gt;Filtro&lt;/i&gt;&lt;/b&gt;, &lt;i&gt;&lt;b&gt;Xi(k)&lt;/b&gt;&lt;/i&gt;, lo transformaremos en:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4m5CdaGEhI/AAAAAAAAAN0/yeuRrmuQNp0/s1600-h/10.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_3gUFAGd1YV0/S4m5CdaGEhI/AAAAAAAAAN0/yeuRrmuQNp0/s320/10.gif" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;Donde los índices de muestas &lt;b&gt;&lt;i&gt;k/alpha&lt;/i&gt;&lt;/b&gt; &lt;/span&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-size: small; line-height: 115%;"&gt;se deben redondear al entero más cercano (el prototipo trabaja con una muestra por hertzio, aunque mejoraría mucho su funcionamiento si lo hiciese con una mayor resolución, únicamente escalando los anteriores resultados).&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez afinada la nota i-ésima por desplazamiento de espectro componente del sonido polifónico, esta se pasa ya convertida mediante DFT inversa al bloque &lt;b&gt;&lt;i&gt;Buffer Sumador en el Dominio del Tiempo&lt;/i&gt;&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m5moxPnHI/AAAAAAAAAN8/LD_39e0KNnQ/s1600-h/11.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3gUFAGd1YV0/S4m5moxPnHI/AAAAAAAAAN8/LD_39e0KNnQ/s320/11.gif" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type"&gt;&lt;/meta&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Generator"&gt;&lt;/meta&gt;&lt;meta content="Microsoft Word 12" name="Originator"&gt;&lt;/meta&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;/link&gt;&lt;link href="file:///C:%5CUsers%5CIrene%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;/link&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face	{font-family:"Cambria Math";	panose-1:2 4 5 3 5 4 6 3 2 4;	mso-font-charset:0;	mso-generic-font-family:roman;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1107304683 0 0 159 0;}@font-face	{font-family:Calibri;	panose-1:2 15 5 2 2 2 4 3 2 4;	mso-font-charset:0;	mso-generic-font-family:swiss;	mso-font-pitch:variable;	mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal	{mso-style-unhide:no;	mso-style-qformat:yes;	mso-style-parent:"";	margin-top:0cm;	margin-right:0cm;	margin-bottom:10.0pt;	margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoChpDefault	{mso-style-type:export-only;	mso-default-props:yes;	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:Calibri;	mso-fareast-theme-font:minor-latin;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;	mso-fareast-language:EN-US;}.MsoPapDefault	{mso-style-type:export-only;	margin-bottom:10.0pt;	line-height:115%;}@page Section1	{size:612.0pt 792.0pt;	margin:70.85pt 3.0cm 70.85pt 3.0cm;	mso-header-margin:36.0pt;	mso-footer-margin:36.0pt;	mso-paper-source:0;}div.Section1	{page:Section1;}--&gt;&lt;/style&gt;  &lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Aquí esperan todas las notas componentes hasta que están todas listas, momento en el que son superpuestas para conformar el sonido polifónico ya afinado.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-family: Verdana,sans-serif; line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: small;"&gt;En la próxima entrada colocaré un ejemplo práctico del sistema ideado y presentaré los problemas que aún quedan por solventar. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-5474714723502555961?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/5474714723502555961/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=5474714723502555961' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/5474714723502555961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/5474714723502555961'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/02/sistema-para-la-afinacion-automatica-de.html' title='Sistema para la Afinación Automática de Sonidos Polifónicos (I)'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3gUFAGd1YV0/S4myiL8s62I/AAAAAAAAAMk/ZZUvrbTEpAg/s72-c/Diagrama.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-896722407647542490.post-2314394926688317547</id><published>2010-01-24T21:32:00.002+01:00</published><updated>2010-01-24T21:45:14.899+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento de voz'/><category scheme='http://www.blogger.com/atom/ns#' term='generador'/><category scheme='http://www.blogger.com/atom/ns#' term='texto a voz'/><title type='text'>Conversor de texto a voz</title><content type='html'>&lt;object data="http://d1.scribdassets.com/ScribdViewer.swf" height="600" id="doc_802170567967434" name="doc_802170567967434" style="outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;" type="application/x-shockwave-flash" width="100%"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;&lt;param name="wmode" value="opaque"&gt;&lt;param name="bgcolor" value="#ffffff"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="FlashVars" value="document_id=25723485&amp;access_key=key-2cmvuvx46c9ymptanimf&amp;page=1&amp;viewMode=slideshow"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Mediante la segmentación de difonemas he construido una versión primitiva de un &lt;b&gt;conversor de texto a voz&lt;/b&gt;. Un difonema no es más que la transición entre la parte estable de un fonema y otro contiguo, incluidas las partes estacionarias. Mediante la concatenación de estas secuencias de muestras conseguimos construir frases de voz.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La mayor dificultad radica en la correcta segmentación de los difonemas. Además, es un trabajo complicado que requiere de paciencia y de asistencia en tiempo real de un usuario. Yo he conseguido realizar una aproximación más o menos válida mediante la grabación de difonemas con agregación de vocales iniciales y finales. Mediante un programa que hice, generé todos los difonemas posibles y, estos, junto a la anterior agregación de vocales, fueron grabados con una separación de &lt;i&gt;&lt;b&gt;1 segundo&lt;/b&gt;&lt;/i&gt; con la ayuda de un metrónomo a una frecuencia de muestreo de &lt;i&gt;&lt;b&gt;44100Hz&lt;/b&gt;&lt;/i&gt;, lo que permitió, como se explica en la presentación adjunta, una segmentación programada y asistida por ordenador.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: small;"&gt;Los códigos de &lt;i&gt;&lt;b&gt;&lt;span style="color: #134f5c;"&gt;Mat&lt;/span&gt;&lt;span style="color: #b45f06;"&gt;Lab&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; se pueden ver en la presentación y, a continuación, algunos ejemplos generados con el programa creado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;object height="132" width="353"&gt;&lt;embed src="http://www.goear.com/files/external.swf?file=3b2e996" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="353" height="132"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;i style="font-family: Verdana,sans-serif;"&gt;"Calculadora"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;object height="132" width="353"&gt;&lt;embed src="http://www.goear.com/files/external.swf?file=6419b7f" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="353" height="132"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;i&gt;"Esto es una prueba de una frase más larga"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;object height="132" width="353"&gt;&lt;embed src="http://www.goear.com/files/external.swf?file=5498ba3" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="353" height="132"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;i&gt;"Explícamelo, por favor"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;object height="132" width="353"&gt;&lt;embed src="http://www.goear.com/files/external.swf?file=0d48cfa" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="353" height="132"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: x-small;"&gt;&lt;i&gt;"Impedancia equivalente"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/896722407647542490-2314394926688317547?l=babyroller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyroller.blogspot.com/feeds/2314394926688317547/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=896722407647542490&amp;postID=2314394926688317547' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2314394926688317547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/896722407647542490/posts/default/2314394926688317547'/><link rel='alternate' type='text/html' href='http://babyroller.blogspot.com/2010/01/mediante-la-segmentacion-de-difonemas.html' title='Conversor de texto a voz'/><author><name>Iván López</name><uri>http://www.blogger.com/profile/16857324857548793880</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-oh9BHT8brek/TvcqA6LYTJI/AAAAAAAAAc0/IWkYJ-xkbCs/s220/Logo.png'/></author><thr:total>8</thr:total></entry></feed>
