Tengo que hacer una correlación cruzada de dos archivos de audio para demostrar que son similares. He tomado la FFT de los dos archivos de audio y tengo sus valores de espectro de potencia en matrices separadas.
¿Cómo debo proceder para correlacionarlos y demostrar que son similares? Hay una mejor manera de hacerlo? Cualquier idea básica me será útil para aprender y aplicarla.
audio
fft
waveform-similarity
cross-correlation
Lorem Ipsum
fuente
fuente
Respuestas:
La correlación cruzada y la convolución están estrechamente relacionadas. En resumen, para hacer convolución con FFTs, usted
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Debe hacer el relleno de cero porque el método FFT es en realidad una correlación cruzada circular , lo que significa que la señal se envuelve en los extremos. Entonces agrega suficientes ceros para deshacerse de la superposición, para simular una señal que es cero al infinito.
Para obtener una correlación cruzada en lugar de una convolución, debe invertir una de las señales antes de realizar la FFT o tomar el complejo conjugado de una de las señales después de la FFT:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
lo que sea más fácil con su hardware / software. Para la autocorrelación (correlación cruzada de una señal consigo misma), es mejor hacer el conjugado complejo, porque solo necesita calcular la FFT una vez.
Si las señales son reales, puede usar FFT reales (RFFT / IRFFT) y ahorrar la mitad de su tiempo de cálculo calculando solo la mitad del espectro.
Además, puede ahorrar tiempo de cálculo rellenando a un tamaño más grande para el que está optimizado el FFT (como un número de 5 para FFTPACK, un número de ~ 13 para FFTW o una potencia de 2 para una implementación de hardware simple).
Aquí hay un ejemplo en Python de correlación FFT en comparación con la correlación de fuerza bruta: https://stackoverflow.com/a/1768140/125507
Esto le dará la función de correlación cruzada, que es una medida de similitud frente a desplazamiento. Para obtener el desplazamiento en el que las ondas están "alineadas" entre sí, habrá un pico en la función de correlación:
El valor x del pico es el desplazamiento, que podría ser negativo o positivo.
Solo he visto esto usado para encontrar el desplazamiento entre dos ondas. Puede obtener una estimación más precisa del desplazamiento (mejor que la resolución de sus muestras) mediante el uso de interpolación parabólica / cuadrática en el pico.
Para obtener un valor de similitud entre -1 y 1 (un valor negativo que indica que una de las señales disminuye a medida que aumenta la otra) necesitaría escalar la amplitud de acuerdo con la longitud de las entradas, la longitud de la FFT, su implementación particular de FFT escala, etc. La autocorrelación de una onda consigo misma le dará el valor de la máxima coincidencia posible.
Tenga en cuenta que esto solo funcionará en ondas que tengan la misma forma. Si se han muestreado en un hardware diferente o se ha agregado algo de ruido, pero de lo contrario todavía tienen la misma forma, esta comparación funcionará, pero si la forma de onda se ha cambiado mediante filtros o cambios de fase, puede sonar igual, pero ganó No se correlacionan también.
fuente
La correlación es una forma de expresar la similitud de dos series de tiempo (muestras de audio en su caso) en un número. Es una adaptación de covarianza que se implementa de la siguiente manera:
La correlación es la versión normalizada de covarianza, que es la covarianza dividida por el producto de las desviaciones estándar de ambas series de tiempo. La correlación producirá un 0 cuando no hay correlación (totalmente no similar) y un 1 para la correlación total (totalmente similar).
Puede imaginar que dos muestras de sonido pueden ser similares pero no están sincronizadas. Ahí es donde entra en juego la correlación cruzada . Usted calcula la correlación entre las series de tiempo donde tiene una de ellas desplazada por una muestra:
Luego busque el valor máximo en la
corr
serie y listo. (o detente si has encontrado una correlación suficiente) Por supuesto, hay algo más. Debe implementar la desviación estándar y debe hacer un poco de gestión de memoria e implementar las cosas de cambio de tiempo. Si todas sus muestras de audio tienen la misma longitud, puede hacerlo sin normalizar la covarianza y seguir adelante y calcular la covarianza cruzada.Una buena relación con su pregunta anterior : el análisis de Fourier es solo una adaptación de la covarianza cruzada. En lugar de cambiar una serie de tiempo y calcular las covarianzas con la otra señal, se calculan las covarianzas entre una señal y varias ondas (co) sinusoidales con diferentes frecuencias. Todo se basa en el mismo principio.
fuente
En el procesamiento de señales, la correlación cruzada (xcorr en MATLAB) es una operación de convolución con una de las dos secuencias invertidas. Dado que la inversión de tiempo corresponde a la conjugación compleja en el dominio de la frecuencia, puede usar el DFT para calcular la correlación cruzada de la siguiente manera:
donde N = tamaño (x) + tamaño (y) - 1 (preferiblemente redondeado a una potencia de 2) es la longitud del DFT.
La multiplicación de DFT es equivalente a una convolución circular en el tiempo. El relleno cero de ambos vectores a la longitud N evita que las componentes desplazadas circularmente de y se superpongan con x, lo que hace que el resultado sea idéntico a la convolución lineal de x y el tiempo invertido y.
Un retraso de 1 es un desplazamiento circular a la derecha de y, mientras que un retraso de -1 es un desplazamiento circular a la izquierda. La correlación cruzada es simplemente la secuencia de productos de puntos para todos los retrasos. Según el pedido estándar de fft, estos estarán en una matriz a la que se puede acceder de la siguiente manera. Los índices del 0 al tamaño (x) -1 son los rezagos positivos. Los índices de tamaño N (y) +1 a N-1 son los rezagos negativos en orden inverso. (En Python se puede acceder convenientemente a los retrasos negativos con índices negativos como R_xy [-1]).
Puede pensar en la x e y con relleno de cero como vectores N-dimensionales. El producto escalar de x e y para un retraso dado es
|x|*|y|*cos(theta)
. Las normas de x e y son constantes para los desplazamientos circulares, por lo que dividirlas deja solo el coseno variable del ángulo theta. Si x e y (para un retraso dado) son ortogonales en el espacio N, la correlación es 0 (es decir, theta = 90 grados). Si son co-lineales, el valor es 1 (correlacionado positivamente) o -1 (correlacionado negativamente, es decir, theta = 180 grados). Esto lleva a la correlación cruzada normalizada a la unidad:Esto puede hacerse imparcial volviendo a calcular las normas solo para las partes superpuestas, pero también puede hacer todo el cálculo en el dominio del tiempo. Además, verá diferentes versiones de normalización. En lugar de normalizarse a la unidad, a veces la correlación cruzada se normaliza por M (sesgada), donde M = max (tamaño (x), tamaño (y)) o M- | m | (una estimación imparcial del retraso de mes).
Para obtener la máxima significación estadística, se debe eliminar la media (sesgo DC) antes de calcular la correlación. Esto se llama covarianza cruzada (xcov en MATLAB):
fuente
2*size (a) + size(b) - 1
o2*size (b) + size (a) - 1
? Pero en cualquier caso, las dos matrices acolchadas son de diferentes tamaños. ¿Cuál es la consecuencia del relleno con demasiados ceros?b
a lo largoa
, con una salida por turno, un solapamiento mínimo de una muestra. Eso producesize(a)
retrasos positivos ysize(b) - 1
retrasos negativos. Usando la transformación inversa del producto de los DFT de punto N, los índices a0
travéssize(a)-1
son los rezagos positivos, y los índices aN-size(b)+1
travésN-1
son los rezagos negativos en orden inverso.Si está utilizando Matlab, pruebe la función de correlación cruzada:
Aquí está la documentación de Matlab:
fuente
Una forma rápida y sencilla de comparar archivos de audio. Tome el archivo de audio, haga una copia, de forma instantánea, péguelos uno al lado del otro, en 2 canales estéreo, invierta la fase en una de las pistas estéreo, alinee ambos archivos al principio en modo zoom, asegúrese de que ambos archivos tienen la misma amplitud al principio, luego reproduzca, si hay silencio total, entonces ambos archivos son idénticos, si hay una diferencia, ¡lo escuchará con bastante claridad!
fuente
Como la mayoría aquí escribió, debería usar la correlación.
Solo tome 2 factores en consideración:
fuente
Para señales no periódicas (el tamaño (y) -1) debe sustraerse del índice de R_xy para obtener el retraso real.
N = tamaño (x) + tamaño (y) - 1;
rezagos = [0, N] - (tamaño (y) - 1);
fuente
La forma más fácil de encontrar la diferencia, IMO, es restar las dos señales de audio en el dominio del tiempo. Si son iguales, el resultado en cada punto de tiempo será cero. Si no son iguales, la diferencia entre ellos se dejará después de la resta y puedes escucharla directamente. Una medida rápida de cuán similares son sería el valor RMS de esta diferencia. Esto se hace a menudo en la mezcla y masterización de audio para escuchar la diferencia de un archivo MP3 vs WAV, por ejemplo. (Invertir la fase de una señal y sumarlas es lo mismo que restar. Este es el método utilizado cuando esto se hace en el software DAW). Deben estar perfectamente alineados en el tiempo para que esto funcione. Si no lo son, podría desarrollar un algoritmo para alinearlos, como detectar los diez picos superiores, calcular el desplazamiento promedio de los picos y cambiar una señal.
Transformarse al dominio de la frecuencia y comparar los espectros de potencia de las señales como usted propone es ignorar cierta información del dominio del tiempo. Por ejemplo, el audio reproducido en reversa tendría el mismo espectro cuando se reproduzca hacia adelante. Por lo tanto, dos señales de audio muy diferentes podrían tener exactamente el mismo espectro.
fuente