Signal- und Messdatenverarbeitung


Testcodes für Kapitel 18: Parameterschätzung und Cramér-Rao-Grenze

systematische Zusammenstellung von kombinierbaren Programmabschnitten zur Signal- und Messdatenverarbeitung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
#python -m pip install --upgrade numpy
#python -m pip install --upgrade matplotlib
#python -m pip install --upgrade scipy
#pip install --upgrade numpy
#pip install --upgrade matplotlib
#pip install --upgrade scipy
from numpy import *
from numpy.random import *
from numpy.fft import *
from matplotlib.pyplot import *
from scipy.signal import *
from scipy.linalg import *
%Matlab: erfordert die Statistics and Machine Learning Toolbox
%Octave: pkg load statistics
if exist('OCTAVE_VERSION','builtin')~=0
pkg load statistics
end
Signal
N=64
dt=0.1
T0=2.8
tau=5.0
fs=2.6
phi=0.4
np=0.01
amp=10.0
t=arange(0,N)*dt
x=amp*exp(-8*(t-T0)**2/tau**2)*cos(2*pi*fs*t+phi)+normal(0,sqrt(np),N)
plot(t,x)
show()
N=64;
dt=0.1;
T0=2.8;
tau=5.0;
fs=2.6;
phi=0.4;
np=0.01;
amp=10;
t=(0:N-1)*dt;
x=amp*exp(-8*(t-T0).^2/tau^2).*cos(2*pi*fs*t+phi)+normrnd(0,sqrt(np),[1,N]);
plot(t,x)
1. 3-Punkt-Schätzer
X=fft(append(x,zeros(N)))
df=1/float(2*N*dt)
E=abs(X)**2*dt**2
M=argmax(abs(E[0:N]))
print(M)
print(E[M-1:M+2])
Y=log(abs(E))
d=(Y[M-1]-Y[M+1])/(2*(Y[M-1]-2*Y[M]+Y[M+1]))
print(d)
fe1=(M+d)*df
print(fe1,fs)
X=fft([x,zeros(1,N)]);
df=1/(2*N*dt);
E=abs(X).^2*dt^2;
[mx,M]=max(abs(E(1:N)));
M
E(mod(M-2,N)+1:mod(M,N)+1)
Y=log(abs(E));
d=(Y(mod(M-2,N)+1)-Y(mod(M,N)+1))/(2*(Y(mod(M-2,N)+1)-2*Y(M)+Y(mod(M,N)+1)))
fe1=(M-1+d)*df;
[fe1,fs]
2. iterativer, komplexer Fit
fe2=fe1
plot(t,x,t,cos(2*pi*fe2*t),t,sin(2*pi*fe2*t))
show()
for k in range(0,15):
  C=cos(2*pi*fe2*t)
  S=sin(2*pi*fe2*t)
  R2=(sum(C*x)**2+sum(S*x)**2)/float(N**2)
  dR2df=4*pi*(sum(S*x)*sum(t*C*x)-sum(C*x)*sum(t*S*x))/float(N**2)
  d2R2df2=8*pi**2*(sum(S*x)**2-sum(C*x)*sum(t**2*C*x)+sum(C*x)**2-sum(S*x)*sum(t**2*S*x))/float(N**2)
  fe2-=dR2df/d2R2df2

print(fe2,fs)
fe2=fe1;
plot(t,x,t,cos(2*pi*fe2*t),t,sin(2*pi*fe2*t))
for k=1:15
C=cos(2*pi*fe2*t);
S=sin(2*pi*fe2*t);
R2=(sum(C.*x)^2+sum(S.*x)^2)/N^2;
dR2df=4*pi*(sum(S.*x)*sum(t.*C.*x)-sum(C.*x)*sum(t.*S.*x))/N^2;
d2R2df2=8*pi^2*(sum(S.*x)^2-sum(C.*x)*sum(t.^2.*C.*x)+sum(C.*x)^2-sum(S.*x)*sum(t.^2.*S.*x))/N^2;
fe2=fe2-dR2df/d2R2df2;
end
[fe2,fs]
3. iterativer, komplexer Fit, Gewichtung durch Amplitude des Signals
hx=hilbert(x)
g=abs(hx)
fe3=fe1
for k in range(0,15):
  C=cos(2*pi*fe3*t)
  S=sin(2*pi*fe3*t)
  R2=(sum(C*g*x)**2+sum(S*g*x)**2)/float(sum(g)**2)
  dR2df=4*pi*(sum(S*g*x)*sum(t*C*g*x)-sum(C*g*x)*sum(t*S*g*x))/float(sum(g)**2)
  d2R2df2=8*pi**2*(sum(S*g*x)**2-sum(C*g*x)*sum(t**2*C*g*x)+sum(C*g*x)**2-sum(S*g*x)*sum(t**2*S*g*x))/float(sum(g)**2)
  fe3-=dR2df/d2R2df2

print(fe3,fs)
X=fft(x);
X(1)=0;
for i=2:fix((length(x)+1)/2)
X(i)=-1j*X(i);
end
for i=fix((length(x)+3)/2):fix((length(x)+2)/2)
X(i)=0;
end
for i=fix((length(x)+4)/2):length(x)
X(i)=+1j*X(i);
end
hx=x+1j*ifft(X);
g=abs(hx);
fe3=fe1;
for k=1:15
C=cos(2*pi*fe3*t);
S=sin(2*pi*fe3*t);
R2=(sum(C.*g.*x)^2+sum(S.*g.*x)^2)/sum(g)^2;
dR2df=4*pi*(sum(S.*g.*x)*sum(t.*C.*g.*x)-sum(C.*g.*x)*sum(t.*S.*g.*x))/sum(g)^2;
d2R2df2=8*pi^2*(sum(S.*g.*x)^2-sum(C.*g.*x)*sum(t.^2.*C.*g.*x)+sum(C.*g.*x)^2-sum(S.*g.*x)*sum(t.^2.*S.*g.*x))/sum(g)^2;
fe2=fe2-dR2df/d2R2df2;
end
[fe3,fs]
mehrfache Ausführung für verschieden starkes Rauschen
N=64
dt=0.1
T0=2.8
tau=5.0
fs=2.6
phi=0.4
amp=10.0
t=arange(0,N)*dt
NN=20 # verschiedene Rauschleistungen
MM=1000 # Mittelungen
np=zeros(NN)
m1=zeros(NN)
m2=zeros(NN)
m3=zeros(NN)
s1=zeros(NN)
s2=zeros(NN)
s3=zeros(NN)
np=zeros(NN)
for i in range (0,NN):
  np[i]=exp(i-10);
  for j in range(0,MM):
    x=amp*exp(-8*(t-T0)**2/tau**2)*cos(2*pi*fs*t+phi)+normal(0,sqrt(np[i]),N)
    # 1. 3-Punkt-Schätzer
    X=fft(append(x,zeros(N)))
    df=1/float(2*N*dt)
    E=abs(X)**2*dt**2
    M=argmax(abs(E[0:N]))
    Y=log(abs(E))
    d=(Y[M-1]-Y[M+1])/(2*(Y[M-1]-2*Y[M]+Y[M+1]))
    fe1=(M+d)*df
    # 2. iterativer, komplexer Fit
    fe2=fe1
    for k in range(0,15):
      C=cos(2*pi*fe2*t)
      S=sin(2*pi*fe2*t)
      R2=(sum(C*x)**2+sum(S*x)**2)/float(N**2)
      dR2df=4*pi*(sum(S*x)*sum(t*C*x)-sum(C*x)*sum(t*S*x))/float(N**2)
      d2R2df2=8*pi**2*(sum(S*x)**2-sum(C*x)*sum(t**2*C*x)+sum(C*x)**2-sum(S*x)*sum(t**2*S*x))/float(N**2)
      fe2-=dR2df/d2R2df2
    
    # 3. iterativer, komplexer Fit mit Gewichtung
    hx=hilbert(x)
    g=abs(hx)
    fe3=fe1
    for k in range(0,15):
      C=cos(2*pi*fe3*t)
      S=sin(2*pi*fe3*t)
      R2=(sum(C*g*x)**2+sum(S*g*x)**2)/float(sum(g)**2)
      dR2df=4*pi*(sum(S*g*x)*sum(t*C*g*x)-sum(C*g*x)*sum(t*S*g*x))/float(sum(g)**2)
      d2R2df2=8*pi**2*(sum(S*g*x)**2-sum(C*g*x)*sum(t**2*C*g*x)+sum(C*g*x)**2-sum(S*g*x)*sum(t**2*S*g*x))/float(sum(g)**2)
      fe3-=dR2df/d2R2df2
    
    # Ergebnisse summieren
    m1[i]+=fe1
    m2[i]+=fe2
    m3[i]+=fe3
    s1[i]+=fe1**2
    s2[i]+=fe2**2
    s3[i]+=fe3**2
  
  m1[i]/=MM
  m2[i]/=MM
  m3[i]/=MM
  s1[i]=MM*(s1[i]/MM-m1[i]**2)/(MM-1)
  s2[i]=MM*(s2[i]/MM-m2[i]**2)/(MM-1)
  s3[i]=MM*(s3[i]/MM-m3[i]**2)/(MM-1)
  print(m1[i],s1[i])
  print(m2[i],s2[i])
  print(m3[i],s3[i])

semilogx(np,m1,np,m2,np,m3)
show()
loglog(np,s1,np,s2,np,s3,np,64*np*dt/(pi**(5/2.0)*amp**2*tau**3))
show()
N=64;
dt=0.1;
T0=2.8;
tau=5.0;
fs=2.6;
phi=0.4;
amp=10;
t=(0:N-1)*dt;
NN=20; % verschiedene Rauschleistungen
MM=1000; % Mittelungen
np=zeros(1,NN);
m1=zeros(1,NN);
m2=zeros(1,NN);
m3=zeros(1,NN);
s1=zeros(1,NN);
s2=zeros(1,NN);
s3=zeros(1,NN);
np=zeros(1,NN);
for i=1:NN
np(i)=exp(i-11);
for j=1:MM
x=amp*exp(-8*(t-T0).^2/tau^2).*cos(2*pi*fs*t+phi)+normrnd(0,sqrt(np(i)),[1,N]);
% 1. 3-Punkt-Schätzer
X=fft([x,zeros(1,N)]);
df=1/(2*N*dt);
E=abs(X).^2*dt^2;
[mx,M]=max(abs(E(1:N)));
Y=log(abs(E));
d=(Y(mod(M-2,N)+1)-Y(mod(M,N)+1))/(2*(Y(mod(M-2,N)+1)-2*Y(M)+Y(mod(M,N)+1)));
fe1=(M-1+d)*df;
% 2. iterativer, komplexer Fit
fe2=fe1;
for k=1:15
C=cos(2*pi*fe2*t);
S=sin(2*pi*fe2*t);
R2=(sum(C.*x)^2+sum(S.*x)^2)/N;
dR2df=4*pi*(sum(S.*x)*sum(t.*C.*x)-sum(C.*x)*sum(t.*S.*x))/N;
d2R2df2=8*pi^2*(sum(S.*x)^2-sum(C.*x)*sum(t.^2.*C.*x)+sum(C.*x)^2-sum(S.*x)*sum(t.^2.*S.*x))/N;
fe2=fe2-dR2df/d2R2df2;
end
% 3. iterativer, komplexer Fit
X=fft(x);
X(1)=0;
for k=2:fix((length(x)+1)/2)
X(k)=-1j*X(k);
end
for k=fix((length(x)+3)/2):fix((length(x)+2)/2)
X(k)=0;
end
for k=fix((length(x)+4)/2):length(x)
X(k)=+1j*X(k);
end
hx=x+1j*ifft(X);
g=abs(hx);
fe3=fe1;
for k=1:15
C=cos(2*pi*fe3*t);
S=sin(2*pi*fe3*t);
R2=(sum(C.*g.*x)^2+sum(S.*g.*x)^2)/sum(g)^2;
dR2df=4*pi*(sum(S.*g.*x)*sum(t.*C.*g.*x)-sum(C.*g.*x)*sum(t.*S.*g.*x))/sum(g)^2;
d2R2df2=8*pi^2*(sum(S.*g.*x)^2-sum(C.*g.*x)*sum(t.^2.*C.*g.*x)+sum(C.*g.*x)^2-sum(S.*g.*x)*sum(t.^2.*S.*g.*x))/sum(g)^2;
fe3=fe3-dR2df/d2R2df2;
end
% Ergebnisse summieren
m1(i)=m1(i)+fe1;
m2(i)=m2(i)+fe2;
m3(i)=m3(i)+fe3;
s1(i)=s1(i)+fe1^2;
s2(i)=s2(i)+fe2^2;
s3(i)=s3(i)+fe3^2;
end
m1(i)=m1(i)/MM;
m2(i)=m2(i)/MM;
m3(i)=m3(i)/MM;
s1(i)=MM*(s1(i)/MM-m1(i)^2)/(MM-1);
s2(i)=MM*(s2(i)/MM-m2(i)^2)/(MM-1);
s3(i)=MM*(s3(i)/MM-m3(i)^2)/(MM-1);
[m1(i),s1(i)]
[m2(i),s2(i)]
[m3(i),s3(i)]
end
semilogx(np,m1,np,m2,np,m3)
waitforbuttonpress
loglog(np,s1,np,s2,np,s3,np,64*np*dt/(pi^(5/2)*amp^2*tau^3))
Vergleich eines Least-Mean-Square-Schätzers mit einem Maximum-Likelihood-Schätzer eines linearen Trends für Poisson-verteilte Werte
def det2(c11,c12,c21,c22):
  return(c11*c22-c12*c21)

lfa=[0.0]

def logfactorial(i):
  if i>=len(lfa):
    for j in range(len(lfa),i+1):
      lfa.append(log(j)+lfa[j-1])
  return(lfa[i])

def loglikelihood(cv):
  ls=0.0
  er=False
  for i in range(0,int(N[k])):
    if cv[0,0]+cv[1,0]*t[i]>0:
      ls+=x[i]*log(cv[0,0]+cv[1,0]*t[i])-(cv[0,0]+cv[1,0]*t[i])-logfactorial(x[i])
    else:
      er=True
    
  if er:
    ls=inf
  return(ls)
  

lambda0=10.0
nu=5.0
M=10000
K=8
N=zeros(K)
S1cLMS=zeros(K)
S1dLMS=zeros(K)
S2cLMS=zeros(K)
S2dLMS=zeros(K)
S1cML=zeros(K)
S1dML=zeros(K)
S2cML=zeros(K)
S2dML=zeros(K)
CRLBc=zeros(K)
CRLBd=zeros(K)

for k in range(0,K):
  N[k]=k+3
  print('N=',N[k])
  t=arange(N[k])+1
  I=zeros((2,2))
  for i in range(int(N[k])):
    I[0,0]+=1.0/(lambda0+nu*t[i])
    I[0,1]+=1.0/(lambda0+nu*t[i])*t[i]
    I[1,0]+=1.0/(lambda0+nu*t[i])*t[i]
    I[1,1]+=1.0/(lambda0+nu*t[i])*t[i]**2
  
  Iinv=inv(I)
  CRLBc[k]=Iinv[0,0]
  CRLBd[k]=Iinv[1,1]
  for i in range(M):
    x=poisson(lambda0+nu*t)
    #LMS
    c=2.0*(2*N[k]+1)/float(N[k]*(N[k]-1))*sum(x)-6.0/float(N[k]*(N[k]-1))*sum(t*x)
    d=12.0/float(N[k]*(N[k]**2-1))*sum(t*x)-6.0/float(N[k]*(N[k]-1))*sum(x)
    S1cLMS[k]+=c
    S1dLMS[k]+=d
    S2cLMS[k]+=c**2
    S2dLMS[k]+=d**2
    #ML
    better=True
    while better:
      cold=array([[c],[d]])
      dldc=sum(x/(c+d*t))-float(N[k])
      dldd=sum(t*x/(c+d*t))-float(N[k]*(N[k]+1))/2.0
      dldcc=-sum(x/((c+d*t)**2))
      dldcd=-sum((t*x)/((c+d*t)**2))
      dlddd=-sum((t**2*x)/((c+d*t)**2))
      lp=array([[dldc],[dldd]])
      J=array([[dldcc,dldcd],[dldcd,dlddd]])
      cnew=cold-dot(inv(J),lp)
      if loglikelihood(cnew)>loglikelihood(cold):
        c=cnew[0,0]
        d=cnew[1,0]
        better=True
      else:
        better=False
      
    S1cML[k]+=c
    S1dML[k]+=d
    S2cML[k]+=c**2
    S2dML[k]+=d**2
  

plot(N,lambda0*ones(K),'b',N,S1cLMS/float(M),'or',N,S1cML/float(M),'og',N,nu*ones(K),'b',N,S1dLMS/float(M),'or',N,S1dML/float(M),'og')
show()
plot(N,CRLBc,'b',N,M/float(M-1)*(S2cLMS/float(M)-(S1cLMS/float(M))**2),'or',N,M/float(M-1)*(S2cML/float(M)-(S1cML/float(M))**2),'og',\
     N,CRLBd,'b',N,M/float(M-1)*(S2dLMS/float(M)-(S1dLMS/float(M))**2),'or',N,M/float(M-1)*(S2dML/float(M)-(S1dML/float(M))**2),'og')
show()
Matlab:
%nicht im Command Window
lambda0=10.0;
nu=5.0;
M=10000;
K=8;
N=zeros(1,K);
S1cLMS=zeros(1,K);
S1dLMS=zeros(1,K);
S2cLMS=zeros(1,K);
S2dLMS=zeros(1,K);
S1cML=zeros(1,K);
S1dML=zeros(1,K);
S2cML=zeros(1,K);
S2dML=zeros(1,K);
CRLBc=zeros(1,K);
CRLBd=zeros(1,K);
for k=1:K
N(k)=k+2;
N(k)
t=(1:N(k));
I=zeros(2,2);
for i=1:N(k)
I(1,1)=I(1,1)+1.0/(lambda0+nu*t(i));
I(1,2)=I(1,2)+1.0/(lambda0+nu*t(i))*t(i);
I(2,1)=I(2,1)+1.0/(lambda0+nu*t(i))*t(i);
I(2,2)=I(2,2)+1.0/(lambda0+nu*t(i))*t(i).^2;
end
Iinv=inv(I);
CRLBc(k)=Iinv(1,1);
CRLBd(k)=Iinv(2,2);
x=zeros(1,N(k));
for i=1:M
for j=1:N(k)
x(j)=poissrnd(lambda0+nu*t(j));
end
%LMS
c=2.0*(2*N(k)+1)/(N(k)*(N(k)-1))*sum(x)-6.0/(N(k)*(N(k)-1))*sum(t.*x);
d=12.0/(N(k)*(N(k)^2-1))*sum(t.*x)-6.0/(N(k)*(N(k)-1))*sum(x);
S1cLMS(k)=S1cLMS(k)+c;
S1dLMS(k)=S1dLMS(k)+d;
S2cLMS(k)=S2cLMS(k)+c^2;
S2dLMS(k)=S2dLMS(k)+d^2;
%ML
better=true;
while better
cold=[c;d];
dldc=sum(x./(c+d*t))-N(k);
dldd=sum(t.*x./(c+d*t))-(N(k)*(N(k)+1))/2.0;
dldcc=-sum(x./((c+d*t).^2));
dldcd=-sum((t.*x)./((c+d*t).^2));
dlddd=-sum((t.^2.*x)./((c+d*t).^2));
lp=[dldc;dldd];
J=[dldcc dldcd;dldcd dlddd];
cnew=cold-inv(J)*lp;
if loglikelihood(cnew,N(k),t,x)>loglikelihood(cold,N(k),t,x)
c=cnew(1);
d=cnew(2);
better=true;
else
better=false;
end
end
S1cML(k)=S1cML(k)+c;
S1dML(k)=S1dML(k)+d;
S2cML(k)=S2cML(k)+c^2;
S2dML(k)=S2dML(k)+d^2;
end
end
plot(N,lambda0*ones(1,K),'b',N,S1cLMS/M,'or',N,S1cML/M,'og',N,nu*ones(1,K),'b',N,S1dLMS/M,'or',N,S1dML/M,'og')
waitforbuttonpress
%
plot(N,CRLBc,'b',N,M/(M-1)*(S2cLMS/M-(S1cLMS/M).^2),'or',N,M/(M-1)*(S2cML/M-(S1cML/M).^2),'og',
N,CRLBd,'b',N,M/(M-1)*(S2dLMS/M-(S1dLMS/M).^2),'or',N,M/(M-1)*(S2dML/M-(S1dML/M).^2),'og')

function res=det2(c11,c12,c21,c22)
res=c11*c22-c12*c21
end

function res=logfactorial(i)
s=0;
for j=1:i
s=s+log(j);
end
res=s;
end

function res=loglikelihood(cv,N,t,x)
ls=0.0;
er=false;
for i=1:N
if cv(1)+cv(2)*t(i)>0
ls=ls+x(i)*log(cv(1)+cv(2)*t(i))-(cv(1)+cv(2)*t(i))-logfactorial(x(i));
else
er=true;
end
end
if er
ls=Inf;
end
res=ls;
end
Octave:
function res=det2(c11,c12,c21,c22)
res=c11*c22-c12*c21
end

function res=logfactorial(i)
s=0;
for j=1:i
s=s+log(j);
end
res=s;
end

function res=loglikelihood(cv,N,t,x)
ls=0.0;
er=false;
for i=1:N
if cv(1)+cv(2)*t(i)>0
ls=ls+x(i)*log(cv(1)+cv(2)*t(i))-(cv(1)+cv(2)*t(i))-logfactorial(x(i));
else
er=true;
end
end
if er
ls=Inf;
end
res=ls;
end

lambda0=10.0;
nu=5.0;
M=10000;
K=8;
N=zeros(1,K);
S1cLMS=zeros(1,K);
S1dLMS=zeros(1,K);
S2cLMS=zeros(1,K);
S2dLMS=zeros(1,K);
S1cML=zeros(1,K);
S1dML=zeros(1,K);
S2cML=zeros(1,K);
S2dML=zeros(1,K);
CRLBc=zeros(1,K);
CRLBd=zeros(1,K);
for k=1:K
N(k)=k+2;
N(k)
t=(1:N(k));
I=zeros(2,2);
for i=1:N(k)
I(1,1)=I(1,1)+1.0/(lambda0+nu*t(i));
I(1,2)=I(1,2)+1.0/(lambda0+nu*t(i))*t(i);
I(2,1)=I(2,1)+1.0/(lambda0+nu*t(i))*t(i);
I(2,2)=I(2,2)+1.0/(lambda0+nu*t(i))*t(i).^2;
end
Iinv=inv(I);
CRLBc(k)=Iinv(1,1);
CRLBd(k)=Iinv(2,2);
x=zeros(1,N(k));
for i=1:M
for j=1:N(k)
x(j)=poissrnd(lambda0+nu*t(j));
end
%LMS
c=2.0*(2*N(k)+1)/(N(k)*(N(k)-1))*sum(x)-6.0/(N(k)*(N(k)-1))*sum(t.*x);
d=12.0/(N(k)*(N(k)^2-1))*sum(t.*x)-6.0/(N(k)*(N(k)-1))*sum(x);
S1cLMS(k)=S1cLMS(k)+c;
S1dLMS(k)=S1dLMS(k)+d;
S2cLMS(k)=S2cLMS(k)+c^2;
S2dLMS(k)=S2dLMS(k)+d^2;
%ML
better=true;
while better
cold=[c;d];
dldc=sum(x./(c+d*t))-N(k);
dldd=sum(t.*x./(c+d*t))-(N(k)*(N(k)+1))/2.0;
dldcc=-sum(x./((c+d*t).^2));
dldcd=-sum((t.*x)./((c+d*t).^2));
dlddd=-sum((t.^2.*x)./((c+d*t).^2));
lp=[dldc;dldd];
J=[dldcc dldcd;dldcd dlddd];
cnew=cold-inv(J)*lp;
if loglikelihood(cnew,N(k),t,x)>loglikelihood(cold,N(k),t,x)
c=cnew(1);
d=cnew(2);
better=true;
else
better=false;
end
end
S1cML(k)=S1cML(k)+c;
S1dML(k)=S1dML(k)+d;
S2cML(k)=S2cML(k)+c^2;
S2dML(k)=S2dML(k)+d^2;
end
end
plot(N,lambda0*ones(1,K),'b',N,S1cLMS/M,'or',N,S1cML/M,'og',N,nu*ones(1,K),'b',N,S1dLMS/M,'or',N,S1dML/M,'og')
waitforbuttonpress
%
plot(N,CRLBc,'b',N,M/(M-1)*(S2cLMS/M-(S1cLMS/M).^2),'or',N,M/(M-1)*(S2cML/M-(S1cML/M).^2),'og',
N,CRLBd,'b',N,M/(M-1)*(S2dLMS/M-(S1dLMS/M).^2),'or',N,M/(M-1)*(S2dML/M-(S1dML/M).^2),'og')