所有程序代碼和數據已經上傳至Github:
https://github.com/yzmj0986/VariableStep-AllanVariance.git
基於步長可變序列的快速Allan方差算法見文章:Noise Identification and Analysis in MEMS Sensors Using an Optimized Variable Step Allan variance.
目錄導航:
應用背景:
根據誤差特性將傳感器誤差分爲確定性誤差和隨機性誤差,確定性誤差,例如未對準誤差和比例因子不穩定,可以通過轉檯或者溫度試驗進行提前標定,並在傳感器內部進行修正。隨機誤差是指在輸出信號中混合的附加隨機噪聲,通常包括量化噪聲,角度隨機遊走,偏置不穩定性,速率隨機遊走和速率斜坡,可以通過在線補償消除。與功率譜密度(PSD)和自迴歸移動平均(ARMA)模型相比,Allan方差是識別和分析噪聲的最簡單的時域方法,從1998年起IEEE建議使用AV方法來確定光學陀螺儀和MEMS慣性傳感器的誤差。
Allan方差的計算原理:
Allan方差的計算基於整羣抽樣技術。假設以採樣間隔採集MEMS傳感器的信號,首先將N個採樣數據分成K簇,每個簇包括m個採樣數據,簇長度爲m的時間表示爲。那麼典型的Allan方差可以基於均方誤差表示爲:
其中<·>表示求平均操作,通過平均歸一化頻率偏差來計算:
但其實大多數信號都是在相位和頻率偏差的離散值(也就是離散信號),假設θ是相位偏差,平均頻率偏差可以定義爲:
因此,離散時間信號的Allan方差可以改寫爲:
其中,是離散採樣時間, 是n時刻時的相位偏差,且 。離散時間採樣間隔爲。
傳感器隨機誤差建模
下圖爲MEMS傳感器中的主要誤差分類。對於零偏、刻度因子誤差等靜態誤差,可通過卡爾曼濾波、遞歸最小二乘等方法實現在線補償。但在線濾波器無法對具有隨機特性的噪聲進行有效估計,因此應使用Allan方差進行各項隨機誤差辨識,並通過擬合求出各項噪聲的係數,實現對隨機誤差的建模過程。由於Allan方差是MEMS傳感器噪聲穩定性的表徵,因此Allan方差與隨機過程PSD的積分關係爲:
通過替換上式的積分計算可以導出Allan方差作爲典型隨機誤差的時間函數,通過 和的對數圖,能夠清楚表徵MEMS傳感器中的隨機誤差,如下圖所示。其中是Allan方差的平方根,也稱爲Allan標準偏差。
根據每種噪聲的Allan方差及其斜率係數,假設各種誤差來源統計獨立,總的Allan方差可以表示爲各誤差的和:
程序代碼:
%Allan Variance的原始實現,並設置了可變的步長d,實現對求取時間的控制。
%**********author:zytjasper 2018/12/10.************%
%Reference:Noise Identification and Analysis in MEMS Sensors Using an Optimized Variable Step Allan variance
clc;
clear all;
tic;
data = xlsread('data.xlsx');
X = data(1:720000,1)*3600; %讀取數據,以陀螺儀某一軸爲例
Ts = 0.01; %採樣時間
[N,M] = size(X);
N_max = floor(N/3);%(N/3)
T = zeros(N_max,10);
R = zeros(N_max,10);
for d = 1 %設置迭代的步長爲d,當d=1時爲傳統的Allan方差
Allan = zeros(N_max,2);
Cluster_mean = zeros(N,1);
for n = 1:d:N_max %每一簇的簇長
K = floor(N/n);
for k = 1:K
Cluster_mean(k,1) = mean(X((n*(k-1)+1):(n*k),1));
end
Cluster_diff = diff(Cluster_mean(1:K),1);
Allan(n,1) = n*Ts; %Time tau
Allan(n,2) = sum((Cluster_diff.^2))/(2*(K-1));
end
Allan(any(Allan,2)==0,:)=[]
TUP = ceil(N_max/d);
RUP = ceil(N_max/d);
T(1:TUP,d)=Allan(:,1);
R(1:RUP,d)=Allan(:,2);
end
x1 = T(:,1);
y1 = R(:,1);
a= [1 2 3 4 5];%函數擬合過程
a(1:5)=lsqcurvefit(@test,a,x1,y1);
f=a(1)*x1.^(-2)+a(2)*x1.^(-1)+a(3)*x1.^(0)+a(4)*x1.^(1)+a(5)*x1.^(2);
figure(1)=figure('color',[1 1 1]);
loglog(T(:,1),R(:,1),'color',[255/255,215/255,0/255]);
hold on;
loglog(x1, f,'r','LineWidth',1.3);
hold on;
xlabel('Cluster Time (sec)');
ylabel('Allan Deviation (deg/h)');
grid on;
legend(' Step size=1',' Step size=2',' Step size=3',' Fitting Curve')
toc;
test擬合程序:
function f=test(a,x)
f=a(1)*x.^(-2)+a(2)*x.^(-1)+a(3)*x.^(0)+a(4)*x.^(1)+a(5)*x.^(2);
end
運行結果:(別介意標註,紅線應該是擬合曲線)
運行時間會在1K-1.2K秒左右,這是正常範圍,Allan方差的迭代原理就是很慢很慢很慢,我在Reference中做了加速的優化,終稿刊號出來了我就會附上原文的。【2019.11.20更新,文章已經貼出,改變步長後的Allan方差速度有大幅度的提升】
改進思路
給採樣序列m中加入可變步長(等比等差都可以,文中用的是等差),即:
步長可變的Allan方差算法原理示意圖如下:
分別將步長設置爲1,5,10,15,20,25,30,35,40,並將誤差擬合曲線疊加可得到下面的誤差辨識結果:
該方法顯著的減少了誤差建模的計算量,在確保誤差估計精度的同時實現了對傳感器時變穩定性的快速跟蹤。此外該步長可變序列的思路還可以應用在DAVAR方法中,具體過程見論文。
只是一篇普通的EI論文,不足之處歡迎各位學習與指正。