Análisis de ruido del sensor inercial utilizando la varianza de Allan
Este ejemplo muestra cómo utilizar la varianza de Allan para determinar los parámetros de ruido de un giroscopio MEMS. Estos parámetros se pueden utilizar para modelar el giroscopio en simulación. La medida del giroscopio se modela como:
Los tres parámetros de ruido N (ángulo de caminata aleatoria), K (tasa de caminata aleatoria) y B (inestabilidad de sesgo) se estiman utilizando datos registrados desde un giroscopio estacionario.
Fondo
La varianza de Allan fue desarrollada originalmente por David W. Allan para medir la estabilidad de frecuencia de osciladores de precisión. También se puede utilizar para identificar diversas fuentes de ruido presentes en mediciones de giroscopio estacionario. Considere L muestras de datos de un giroscopio con un tiempo de muestra de . Forme grupos de datos de duraciones , , ..., y obtenga los promedios de la suma de los puntos de datos contenidos en cada grupo a lo largo de la longitud del grupo. La varianza de Allan se define como la varianza de dos muestras de los promedios del grupo de datos en función del tiempo del grupo. Este ejemplo utiliza el estimador de varianza de Allan superpuesto. Esto significa que los grupos calculados se superponen. El estimador funciona mejor que los estimadores no superpuestos para valores mayores de L.
Cálculo de la varianza de Allan
La varianza de Allan se calcula de la siguiente manera:
Registre muestras de giroscopio estacionario L con un período de muestra . Sean las muestras registradas.
% Load logged data from one axis of a three-axis gyroscope. This recording % was done over a six hour period with a 100 Hz sampling rate. load('LoggedSingleAxisGyroscope', 'omega', 'Fs') t0 = 1/Fs;
Para cada muestra, calcule el ángulo de salida :
Para muestras discretas, se puede utilizar la suma acumulada multiplicada por .
theta = cumsum(omega, 1)*t0;
A continuación, calcule la varianza de Allan:
donde y es el promedio del ensemble .
El promedio del ensemble se puede ampliar a:
maxNumM = 100; L = size(theta, 1); maxM = 2.^floor(log2(L/2)); m = logspace(log10(1), log10(maxM), maxNumM).'; m = ceil(m); % m must be an integer. m = unique(m); % Remove duplicates. tau = m*t0; avar = zeros(numel(m), 1); for i = 1:numel(m) mi = m(i); avar(i,:) = sum( ... (theta(1+2*mi:L) - 2*theta(1+mi:L-mi) + theta(1:L-2*mi)).^2, 1); end avar = avar ./ (2*tau.^2 .* (L - 2*m));
Finalmente, la desviación de Allan se utiliza para determinar los parámetros de ruido del giroscopio.
adev = sqrt(avar); figure loglog(tau, adev) title('Allan Deviation') xlabel('\tau'); ylabel('\sigma(\tau)') grid on axis equal
La varianza de Allan también se puede calcular usando la función allanvar
.
[avarFromFunc, tauFromFunc] = allanvar(omega, m, Fs); adevFromFunc = sqrt(avarFromFunc); figure loglog(tau, adev, tauFromFunc, adevFromFunc); title('Allan Deviations') xlabel('\tau') ylabel('\sigma(\tau)') legend('Manual Calculation', 'allanvar Function') grid on axis equal
Identificación de parámetros de ruido
Para obtener los parámetros de ruido para el giroscopio, utilice la siguiente relación entre la varianza de Allan y la densidad espectral de potencia (PSD) bilateral de los parámetros de ruido en el conjunto de datos original . La relación es:
De la ecuación anterior, la varianza de Allan es proporcional a la potencia de ruido total del giroscopio cuando pasa a través de un filtro con una función de transferencia de . Esta función de transferencia surge de las operaciones realizadas para crear y operar sobre los clusters.
Usando esta interpretación de la función de transferencia, el paso banda del filtro depende de . Esto significa que se pueden identificar diferentes parámetros de ruido cambiando el paso banda del filtro o variando .
Paseo aleatorio en ángulo
La caminata aleatoria en ángulo se caracteriza por el espectro de ruido blanco de la salida del giroscopio. El PSD está representado por:
dónde
N = coeficiente de recorrido aleatorio del ángulo
Sustituyendo en la ecuación PSD original y realizando la integración se obtiene:
La ecuación anterior es una línea con una pendiente de -1/2 cuando se traza en un gráfico log-log de versus . El valor de N se puede leer directamente en esta línea en . Las unidades de N son .
% Find the index where the slope of the log-scaled Allan deviation is equal % to the slope specified. slope = -0.5; logtau = log10(tau); logadev = log10(adev); dlogadev = diff(logadev) ./ diff(logtau); [~, i] = min(abs(dlogadev - slope)); % Find the y-intercept of the line. b = logadev(i) - slope*logtau(i); % Determine the angle random walk coefficient from the line. logN = slope*log(1) + b; N = 10^logN % Plot the results. tauN = 1; lineN = N ./ sqrt(tau); figure loglog(tau, adev, tau, lineN, '--', tauN, N, 'o') title('Allan Deviation with Angle Random Walk') xlabel('\tau') ylabel('\sigma(\tau)') legend('\sigma', '\sigma_N') text(tauN, N, 'N') grid on axis equal
N = 0.0126
Calificar paseo aleatorio
La velocidad de caminata aleatoria se caracteriza por el espectro de ruido rojo (ruido browniano) de la salida del giroscopio. El PSD está representado por:
dónde
K = tasa de coeficiente de caminata aleatoria
Sustituyendo en la ecuación PSD original y realizando la integración se obtiene:
La ecuación anterior es una línea con una pendiente de 1/2 cuando se traza en un gráfico log-log de versus . El valor de K se puede leer directamente en esta línea en . Las unidades de K son .
% Find the index where the slope of the log-scaled Allan deviation is equal % to the slope specified. slope = 0.5; logtau = log10(tau); logadev = log10(adev); dlogadev = diff(logadev) ./ diff(logtau); [~, i] = min(abs(dlogadev - slope)); % Find the y-intercept of the line. b = logadev(i) - slope*logtau(i); % Determine the rate random walk coefficient from the line. logK = slope*log10(3) + b; K = 10^logK % Plot the results. tauK = 3; lineK = K .* sqrt(tau/3); figure loglog(tau, adev, tau, lineK, '--', tauK, K, 'o') title('Allan Deviation with Rate Random Walk') xlabel('\tau') ylabel('\sigma(\tau)') legend('\sigma', '\sigma_K') text(tauK, K, 'K') grid on axis equal
K = 9.0679e-05
Inestabilidad del sesgo
La inestabilidad del sesgo se caracteriza por el espectro de ruido rosa (ruido de parpadeo) de la salida del giroscopio. El PSD está representado por:
dónde
B = coeficiente de inestabilidad del sesgo
= frecuencia de corte
Sustituyendo en la ecuación PSD original y realizando la integración se obtiene:
dónde
Ci = función coseno-integral
Cuando es mucho más largo que la inversa de la frecuencia de corte, la ecuación PSD es:
La ecuación anterior es una línea con una pendiente de 0 cuando se traza en un gráfico log-log de versus . El valor de B se puede leer directamente en esta línea con una escala de . Las unidades de B son .
% Find the index where the slope of the log-scaled Allan deviation is equal % to the slope specified. slope = 0; logtau = log10(tau); logadev = log10(adev); dlogadev = diff(logadev) ./ diff(logtau); [~, i] = min(abs(dlogadev - slope)); % Find the y-intercept of the line. b = logadev(i) - slope*logtau(i); % Determine the bias instability coefficient from the line. scfB = sqrt(2*log(2)/pi); logB = b - log10(scfB); B = 10^logB % Plot the results. tauB = tau(i); lineB = B * scfB * ones(size(tau)); figure loglog(tau, adev, tau, lineB, '--', tauB, scfB*B, 'o') title('Allan Deviation with Bias Instability') xlabel('\tau') ylabel('\sigma(\tau)') legend('\sigma', '\sigma_B') text(tauB, scfB*B, '0.664B') grid on axis equal
B = 0.0020
Ahora que se han calculado todos los parámetros de ruido, trace la desviación de Allan con todas las líneas utilizadas para cuantificar los parámetros.
tauParams = [tauN, tauK, tauB]; params = [N, K, scfB*B]; figure loglog(tau, adev, tau, [lineN, lineK, lineB], '--', ... tauParams, params, 'o') title('Allan Deviation with Noise Parameters') xlabel('\tau') ylabel('\sigma(\tau)') legend('$\sigma (rad/s)$', '$\sigma_N ((rad/s)/\sqrt{Hz})$', ... '$\sigma_K ((rad/s)\sqrt{Hz})$', '$\sigma_B (rad/s)$', 'Interpreter', 'latex') text(tauParams, params, {'N', 'K', '0.664B'}) grid on axis equal
Simulación de giroscopio
Utilice el objeto imuSensor
para simular mediciones de giroscopio con los parámetros de ruido identificados anteriormente.
% Simulating the gyroscope measurements takes some time. To avoid this, the % measurements were generated and saved to a MAT-file. By default, this % example uses the MAT-file. To generate the measurements instead, change % this logical variable to true. generateSimulatedData = false; if generateSimulatedData % Set the gyroscope parameters to the noise parameters determined % above. Use single-sided noise to match the parameter scaling and 500 % poles for the bias instability model to match the hardware output. numpoles = 500; gyro = gyroparams('NoiseDensity', N, 'RandomWalk', K, ... 'BiasInstability', B, 'NoiseType', 'single-sided', ... 'BiasInstabilityCoefficients', fractalcoef(numpoles)); omegaSim = helperAllanVarianceExample(L, Fs, gyro); else load('SimulatedSingleAxisGyroscope', 'omegaSim') end
Calcule la desviación de Allan simulada y compárela con los datos registrados.
[avarSim, tauSim] = allanvar(omegaSim, 'octave', Fs); adevSim = sqrt(avarSim); adevSim = mean(adevSim, 2); % Use the mean of the simulations. figure loglog(tau, adev, tauSim, adevSim, '--') title('Allan Deviation of HW and Simulation') xlabel('\tau'); ylabel('\sigma(\tau)') legend('HW', 'SIM') grid on axis equal
El gráfico muestra que el modelo de giroscopio creado a partir del imuSensor
genera mediciones con una desviación de Allan similar a los datos registrados. Las mediciones del modelo contienen un poco menos de ruido ya que los parámetros relacionados con la temperatura y la cuantificación no se configuran usando gyroparams
. El modelo de giroscopio se puede utilizar para generar mediciones utilizando movimientos que no se capturan fácilmente con hardware.
Referencias
Estándar IEEE. Guía de formato de especificación estándar IEEE 647-2006 y procedimiento de prueba para giroscopios láser de un solo eje