2.3 The RBV and IS Capabilities
2.3.2 Specification of IS Capabilities
2.3.2.1 IT for Supply Chain Activities
El microtonalismo y la abundancia de notas de adorno y melismas son, como hemos dicho, algunas de las características musicales más importantes que definen el cante flamenco. Esto provoca en muchas situaciones dificultades a la hora de discernir cuándo se trata de un vibrato o melisma y cuándo de notas diferentes. Centrándonos en el aspecto computacional, la existencia de esta ornamentación provoca que el número de notas que forman cada secuencia melódica aumente considerablemente, hecho que conlleva un importante incremento de la carga computacional, incremento que se ve reflejado en el aumento del tiempo de ejecución de todos los algoritmos.
Es por esta razón por la que nos hemos planteado la implementación de un algoritmo [17] que ajuste un conjunto de puntos a una curva poligonal escalonada. En nuestro contexto, vamos a ajustar el conjunto de notas que forman la secuencia original a una serie de escalones, cuyo valor será menor que el número original de notas. Para realizar este ajuste, en el algoritmo estudiado se proponen dos alternativas:
• Introducir el máximo error que vamos a permitir en el ajuste, y a partir de ese error minimizar el número de puntos de la función de ajuste. Este problema puede ser resuelto con una complejidad temporal que es lineal respecto al número de datos de la entrada (en nuestro caso, respecto al número de notas que vamos a ajustar). Esta dependencia lineal se representa como O(n).
• Elegir el número máximo de escalones que permitimos, calculando el error mínimo que podemos obtener en ese caso. Se demuestra que se resuelve con un coste temporal O(n2 log(n)),
donde n es el número de datos de la entrada, en nuestro caso, el número de notas que vamos a ajustar.
El primer caso, minimizar el número de puntos dado el máximo error permitido, se puede ver mediante una interpretación geométrica. En la Figura 35 tenemos la nube de puntos que queremos ajustar. El segmento vertical, o ventana, generado alrededor de cada punto indica el valor del máximo error permitido. Por tanto, el objetivo es buscar una curva de segmentos horizontales que atraviese una vez todos esos segmentos.
Figura 35. Interpretación geométrica del problema de ajuste de puntos a una función poligonal.
Para obtener el resultado, vamos haciendo un barrido de izquierda a derecha, almacenando para cada par de puntos consecutivos el valor máximo y mínimo de la región vertical que tienen en común. A continuación, se calcula si el siguiente punto también se puede incluir en dicha región. Cuando lleguemos a un punto que esté fuera de esa ventana, tendremos que introducir un escalón. El código fuente completo se puede consultar en el Anexo, en el archivo ajuste_error.m.
El segundo problema consistía en minimizar el error, usando un número máximo de escalones elegido por el usuario. El algoritmo construye en primer lugar todas los subconjuntos posibles formados por grupos de puntos consecutivos, y calcula el máximo error de cada uno de ellos (entendiendo el error como la diferencia entre el punto más alto y el punto más bajo), como observamos en la Figura 36.
Figura 36. Obtención del error eij para todos los subconjuntos Sij.
Una vez que hemos generado todos los posibles errores para cada subconjunto y los hemos ordenado, realizaremos una búsqueda binaria en ese conjunto de errores. Partiendo de un error cualquiera, calcularemos mediante la función implementada en la primera parte del algoritmo el número mínimo de escalones necesarios para obtener dicho error. Si ese número es menor que el número especificado, podemos encontrar un error más pequeño que también cumpla la especificación. Por el contrario, si el número es mayor que el número de escalones solicitado por el usuario, tendremos que utilizar un error mayor que sí cumpla la condición de número de escalones. De esa forma, iremos realizando una búsqueda binaria en el conjunto de errores, mediante la programación de un bucle que en cada paso irá reduciendo a la mitad la cantidad de valores candidatos. Cuando finalice la ejecución del bucle se habrá obtenido el valor óptimo, el error mínimo que cumple la especificación dada por el número de escalones. El Anexo (véase el archivo ajuste_escalon.m) contiene el código fuente para MATLAB de la implementación de este algoritmo.
En la Figura 37 podemos ver el resultado de ejecutar el algoritmo a una pieza de audio. Hemos utilizado la debla interpretada por Antonio Mairena, y hemos introducido un error máximo de un semitono.
Figura 37. Aplicación del algoritmo de ajuste mediante función escalón.
La secuencia de notas original estaba compuesta por 56 notas. Después de aplicar el algoritmo de ajuste mediante función escalón, hemos pasado a tener 21 escalones. Por tanto, la reducción del número de notas que forman la pieza es bastante significativa.
La utilización de este algoritmo de ajuste a la hora de calcular distancias de similitud va a suponer una importante disminución en el tiempo de ejecución. Para los algoritmos de mayor carga computacional que se han estudiado (distancia de edición y DTW), dicho tiempo depende de la cantidad de datos de entrada. Por tanto, si conseguimos una disminución de ese número de datos (en nuestro caso, el número de notas de cada melodía) usando un ajuste mediante función escalón como el aquí expuesto, obtendremos una
importante disminución del tiempo necesario para calcular el grado de similitud entre dos melodías.