|
En el primer método en el que se piensa cuando se
trata de calcular la frecuencia fundamental de un
segmento determinado es hacer la FFT al mismo.
A continuación se escoge el máximo de la FFT calculada, y ya se tiene la
frecuencia fundamental del segmento, pero surgen 2
problemas básicos que hay que resolver:
1. Previamente hay que eliminar la componente
continua, porque si no se hace el máximo resulta ser
casi siempre para la componente continua (frecuencia
cero), por lo que no saldría ningún resultado válido.
Otra opción es hacer la búsqueda en un determinado
rango de frecuencias, con lo que también se elimina el
mencionado problema del pico para frecuencia = 0.
2. Si un determinado instrumento tiene algún
armónico con mucha energía, puede ser que la amplitud
del armónico sea superior a la de la frecuencia
fundamental del segmento en cuestión, como ya se
comentó en el primer capítulo, en referencia a las
limitaciones de la conversión. Por lo tanto la
detección fracasaría, dando un resultado erróneo. Una
solución a este problema es hacer un filtrado pasobajo
(la solución tomada en este caso).
Para hacer el algoritmo más rápido, ya que no se pretende una gran
calidad es hacer la FFT del segmento completo, y, en
el dominio de la frecuencia, una vez calculado el
valor absoluto de la transformada, hacer el filtrado
mediante una simple multiplicación componente a
componente . Se han probado varios métodos de
filtrado, lineal, exponencial, logarítmico, etc. El
que mejor resultado ha dado es un filtro lineal que
multiplica la 'continua' (frecuencia 0) por 1 y la
frecuencia Fs/2 por 0 , aunque no tenga sentido desde
el punto de vista de la transformada solamente es para
calcular la frecuencia fundamental (de esta forma es
más rápido, ya que no se va a realizar la transformada
inversa). |
| |
|
Tipos de filtrado usados
Se pueden observar las
gráficas de los distintos tipos de filtrado paso-bajo
usado:
 
|
Segmento a
analizar |
FFT del segmento |

Filtrado lineal paso-bajo |

FFT tras el filtrado |
|
|
|

Filtrado lineal paso-bajo suave |

FFT tras el filtrado |
Basados en
parámetros temporales
Otros posibles
métodos, dejando a parte el dominio de la frecuencia,
se basan en la función de autocorrelación. La
autocorrelación es una función que devuelve un vector,
el cual contiene información sobre lo repetitiva que
es la señal respecto a sí misma, y se calcula de la
mediante la fórmula siguiente:

Siendo R(k) la función de autocorrelación y x el
vector cuya autocorrelación queremos calcular.
Por otro lado, como se ven en la siguiente gráfica, el valor de la
autocorrelación disminuye a medida que aumenta el
valor de k, esto se debe principalmente a una
reducción del número de sumandos que hay a medida que
aumenta k (ver ejemplo del pié de página). Para
solucionar esta limitación existe otra función de
autocorrelación que normaliza el resultado de la
sumatoria anterior al número de sumandos. Esta última
se llama autocorrelación sin desplazamiento o ‘Unbias’,
mientras que la primera se llama autocorrelación
con desplazamiento o ‘Bias’.
A continuación se muestran dos gráficas correspondientes al mismo
segmento para el cual se calculó la fft con sus
correspondientes filtrados paso-bajo, pero ahora
mostrando las dos autocorrelaciones, con y sin
desplazamiento.

Correlación "Bias"

Correlación "Unbias"
Algoritmo
SIFT
Consiste en
utilizar el modelo LPC (Linear Prediction Code) de
producción de voz, que supone que la excitación es un
tren de pulsos (cuerdas vocales, sonido sonoro) o un
ruido blanco (el aire proveniente de los pulmones) que
pasa por un filtro todo-polos (cavidad bucal – ver
gráfica siguiente). Este método de detección de pitch
utiliza ese modelo, por lo que los resultados sólo son
buenos en los casos en que el origen del sonido se
ajuste bien a ese modelo, caso que se da en la voz (el
modelo LPC es un modelo de producción de voz, es
aplicable también para audio aunque los resultados no
son tan satisfactorios como para la voz).

Los pasos a seguir son los siguientes:
• Obtengo el filtro todo-polos (Hz) correspondiente
(Función lpc.m de MATLAB)
• Obtengo la excitación por la siguiente fórmula: S(z)=E(z)/A(z)
=> E(z) = A(z)∙S(z) donde A(z) es el filtro LPC, E(z)
es la excitación y S(z) es el segmento en el dominio
de la transformada Z, todo en el dominio de la
transformada, en el tiempo el producto se convierte en
una convolución por las propiedades de la citada
transformada.
• Aplico un center clip a la señal de excitación para
eliminar el ruido blanco de fondo.
• Calculo la función de autocorrelación de la señal de
excitación calculada. (Se ha usado solamente el caso
de la autocorrelación con desplazamiento porque da
mejores resultados que sin desplazamiento, como se ha
comprobado en las gráficas anteriores).
• Calculo el retardo kmax para el que la función de
autocorrelación es máxima, y se calcula con él la
frecuencia fundamental del segmento que se está
analizando, sabiendo la relación Fpitch=Fs/kmax

•
Determinación del filtro A(z)
Criterio: Minimizar el error cuadrático medio,
calculado éste como ∑e2(n)
Finalmente el valor del filtro es a = -Rx•rx,, siendo a un vector que
contiene los parámetros del filtro todo-polos. |