Estoy haciendo el siguiente experimento: http://physlab.lums.edu.pk/images/a/ab/Correlation.pdf
Es básicamente un generador de ruido blanco que pasa por un filtro de paso bajo. Se toman tensiones de muestra y se normalizan, y luego se autocorrelacionan utilizando algunos métodos. Se supone que la autocorrelación que utiliza los datos normalizados comienza con un valor de 1 a 0 de retardo (lo que hace) y luego decae exponencialmente a 0 (lo que no hace). Sin embargo, decae por debajo de 0.
También El coeficiente generado automáticamente para un ajuste exponencial (a*np.exp(-(t/b)) + c) (b debería ser = RC), no coincide con la constante RC del filtro paso bajo (R=10kohm, C=0.5 microF, RC=5ms).
Los métodos que estoy utilizando para la autocorrelación son los siguientes f=lista de valores de tensión con la media restada de cada valor, 100.000 muestras @ 10000 S/s
Utilizando la función Correlación incorporada:
def autocorr(f):
result = np.correlate(f, f, mode='full')
return result[result.size/2:]
autocorr=autocorr(f)
autocorr /= autocorr[autocorr.argmax()]
Usando FastFourierTransform:
N = len(f)
fvi = np.fft.fft(f) #n=2*N)
acf = np.real( np.fft.ifft( fvi * np.conjugate(fvi) )[:N] )
Trazado utilizando el trazado autocor incorporado de python:
import matplotlib.pyplot as plt
plt.acorr(f)
Que se puede ver no cae por debajo de 0. No puedo averiguar el código exacto que se ejecuta con el plt.acorr(f) ya que no soporta la salida de datos.
Aquí está la exponencial ajustada (mostrando claramente la caída por debajo de 0) función de ajuste =
from scipy.optimize import curve_fit
def func(t,a,b,c):
return a*np.exp(-(t/b)) + c
popt, pcov = curve_fit(func, t, acf)
Sin embargo, la constante autogenerada a partir del ajuste exponencial, que debería ser igual al RC (5ms), resulta en realidad 1,043822ms Además, cuando reduzco el RC en un 50%, el coeficiente calculado se reduce en un 33%. También si cambio la frecuencia de muestreo se reduce el coeficiente
¿Existe una forma de producir la autocorrelación de los datos recogidos, que consiste en un decaimiento exponencial a 0 con la constante de decaimiento como el RC del circuito del filtro paso bajo?
He probado varios valores de RC para el LPF, todos caen por debajo de 0, de hecho cuanto más bajo es el RC, más bajo cae por debajo de 0.
¿Podría estar relacionado con una tensión de offset incorrecta del generador de ruido blanco? He cambiado el offset y ha aumentado el valor más bajo al que cae la autocorrelación, pero no estoy seguro de que si lo vuelvo a ajustar se solucione el problema por completo.
Así que para recapitular, 2 cuestiones
-
La autocorrelación no decae a 0, cae por debajo de 0
-
Coeficiente de decaimiento de la curva exponencial ajustado, no es igual a la constante RC del circuito.
Este hilo Autocorrelación del ruido - correlación negativa Parece estar relacionado con el mismo experimento y la misma cuestión (sin respuesta)
**UPDATE 7-3-15:**
Cosas que se han probado: El generador de Ruido Blanco tiene una perilla de umbral para ajustar la frecuencia de umbral. No ha solucionado ninguno de los dos problemas: Ajuste del umbral más alto:
Ajuste del umbral más bajo:
La autocorrelación se ajustó al ruido blanco generado por Python y filtrado a través de circuitos de filtro RC de paso bajo simulados (diferentes valores de RC). Esto produjo resultados correctos. Esto me hace pensar que el código utilizado para la autocorrelación es correcto.
He probado el método FFT y la función de correlación incorporada en python para autocorrelacionar los datos y dan los mismos resultados, confirmando también que el código debería estar bien.
Un generador de señales físicas, que genera ondas cuadradas, se probó a través del A2D y se trazó en función del tiempo. El resultado fue correcto con los tiempos correctos que coinciden con la frecuencia de muestreo. Esto confirma que el A2D funciona correctamente.
Ejemplo de onda cuadrada a través de A2D:
Las ondas cuadradas también se pasaron por 2 circuitos RC de paso bajo. Los valores RC correctos se calcularon utilizando un ajuste exponencial. Esto confirma que los circuitos RC funcionan correctamente y que el código utilizado para ajustar las exponenciales también funciona. Sin embargo, se produjo un decaimiento por debajo de 0
Ejemplo de exponencial ajustada sobre onda cuadrada filtrada:
Hay una compensación de voltaje en el generador de ruido blanco, esto se ajustó varias veces (por encima y por debajo de 0V), no arregló las constantes RC exponenciales ajustadas incorrectamente. Afecta al decaimiento de los datos autocorrelacionados, pero no hasta el punto de poder determinar si es la causa del problema.
Trazado de abajo. B = antes del primer cambio de desplazamiento, A = después del primer cambio de desplazamiento, A2-x = después del segundo cambio de desplazamiento. Los RC se corresponden entre sí, por ejemplo, B1, A1, A2-1 tienen el mismo RC, etc.
He comprobado los espectros de potencia de 2 muestras de ruido no filtrado del generador de ruido blanco con los siguientes resultados:
Por favor, ignore las unidades
Es posible que el ruido que se genera no sea en absoluto ruido blanco. Tendré que comprobarlo con más muestras.
Los datos se ajustan a un ruido blanco autocorrelacionado (exponencial decreciente), el problema es que decae más allá de 0 y luego se recupera y las constantes de decaimiento están aproximadamente a un factor de 10 de los valores RC reales de los filtros de paso bajo por los que se filtra el ruido blanco. Actualmente estoy probando los espectros de potencia del ruido blanco (no filtrado ni normalizado).Todos los gráficos de datos son sólo muestras con unas pocas muestras, he corrido más, a muchos para incluir. Gracias a User:Floris para las sugerencias sobre lo que debe mirar.
**UPDATE 7-15-15:**
Pues resulta que el problema está en el generador de ruido blanco. Un problema muy extraño.
Añadí un circuito seguidor de tensión antes del circuito RC (para aumentar la corriente disponible) y los resultados mejoraron notablemente. No estoy seguro de si esto es la solución final, ya que hay algunos problemas extraños con el seguidor de voltaje, añadiendo ganancia de voltaje por alguna razón. Probé con otra fuente de ruido blanco antes de usar el seguidor de voltaje y pude lograr una precisión de ~ 90% comparando el valor RC ajustado exponencialmente con el valor RC teórico y ahora puedo igualar eso con el generador de ruido blanco original y el circuito seguidor de voltaje.
Ejemplo de una colección de 10 conjuntos de muestras @ RC=5ms:
En comparación con la fuente de ruido blanco "de trabajo":
Actualizaré con una respuesta final cuando sepa exactamente qué está pasando y por qué está ocurriendo el problema. Si alguien tiene alguna sugerencia también, muy apreciado.
1 votos
Te recomiendo que empieces por generar algunos sintético ruido blanco para convencerse de que el procesamiento de la señal es correcto. Si lo es, el hecho de que veas una correlación negativa sugiere alguna estructura "no blanca" en tu señal. Este puede ser real... Por cierto, una pregunta muy bien escrita.
0 votos
Lo siento si esto parece estúpido, pero ¿cómo podría generar ruido blanco sintético?
0 votos
¿Esto explicaría también la constante de decaimiento errónea que se genera con el ajuste exponencial?
0 votos
Generación de ruido blanco - ver dsp.stackexchange.com/questions/8418/ para un ejemplo y una discusión
0 votos
Para el ajuste de la curva, yo utilizaría un ajuste de la línea recta al logaritmo de los datos, y daría menos peso a los puntos posteriores (que tienen más ruido). Por supuesto, dado que los datos son negativos, ya se sabe que el ajuste será problemático "por ahí". Tenga en cuenta también que los valores de R y C suelen ser inexactos. Puede ser que la constante de decaimiento real sea precisa y sus componentes no.
1 votos
Un comentario más - en la línea
autocorr=autocorr(f)
se sobrescribe la definición de la función. Realmente quieres usar nombres diferentes para las variables y las funciones...0 votos
Gracias por la aportación. Miraré la generación de ruido y el ajuste de la línea recta al logaritmo de los datos. ¿Por qué los valores de las componentes R y C no serían precisos, sé que tendrían una pequeña incertidumbre, pero no tanta como la diferencia entre la constante de decaimiento generada y el RC teórico de 5ms?
0 votos
Gracias por la información sobre la sobreescritura de la definición de la función, en realidad soy nuevo en python, (viniendo de matlab), así que estoy tratando de acostumbrarme a la sintaxis etc
0 votos
Ya lo veo... pero también pasaría lo mismo en matlab (puede que te avise, pero acabarías sobrescribiendo la definición en cualquiera de los dos entornos). Los condensadores son notoriamente inexactos a menos que compres uno de alta precisión. Mira la marca del condensador y comprueba con este gráfico
0 votos
Estoy usando 2 condensadores electrolíticos (2 de 1 microF en serie para dar 0,5 microF). Cuando dices un ajuste de línea recta al logaritmo de los datos, ¿te refieres al logaritmo de los datos de autocorrelación o a los datos brutos?
0 votos
La electrolítica es muy inexacta. Me refiero a la línea recta a log(autocorr). Tienes que mantenerte alejado de los puntos negativos (de hecho, puede que tengas que acumular tus datos con una longitud de correlación más alta en menos bins para asegurarte de que los puntos son positivos).
0 votos
Además, al trabajar con frecuencias, hay que tener cuidado con los factores de $2\pi$ ... no estoy seguro de si eso juega aquí, pero su factor 5 (y la incertidumbre en los condensadores) podría ser 6,283...