寻找指数衰减正弦曲线的参数(矩阵铅笔法)

时间:2016-01-27 10:47:01

标签: algorithm matlab signal-processing complex-numbers exponential

矩阵笔法是一种算法,可用于找到单个指数衰减正弦曲线'增加了多个这样的信号组成的信号中的参数(频率,幅度,衰减因子和初始相位)。我正在尝试实现该算法。该算法可以在以下链接中找到:

http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=370583http://krein.unica.it/~cornelis/private/IEEE/IEEEAntennasPropagMag_37_48.pdf

为了测试算法,我创建了一个合成信号,由四个指数衰减的正弦曲线组成,如下所示:

fs=2205;
t=0:1/fs:249/fs;
f(1)=80;
f(2)=120;
f(3)=250;
f(4)=560;
a(1)=.4;
a(2)=1;
a(3)=0.89;
a(4)=.65;
d(1)=70;
d(2)=50;
d(3)=90;
d(4)=80;
for i=1:4
    x(i,:)=a(i)*exp(-d(i)*t).*cos(2*pi*f(i)*t);
end
y=x(1,:)+x(2,:)+x(3,:)+x(4,:);

然后我将此信号提供给论文中描述的算法如下:

function [f d] = mpencil(y)

%construct hankel matrix
N = size(y,2);
L1 = ceil(1/3 * N);
L2 = floor(2/3 * N);
L = ceil((L1 + L2) / 2);

fs=2205;
for i=1:1:(N-L)
    Y(i,:)=y(i:(i+L));
end

Y1=Y(:,1:L);
Y2=Y(:,2:(L+1));

[U,S,V] = svd(Y);
D=diag(S);
tol=1e-3;
m=0;
l=length(D);
for i=1:l
    if( abs(D(i)/D(1)) >= tol)
        m=m+1;
    end
end
Ss=S(:,1:m);
Vnew=V(:,1:m);
a=size(Vnew,1);
Vs1=Vnew(1:(a-1),:);
Vs2=Vnew(2:end,:);
Y1=U*Ss*(Vs1');
Y2=U*Ss*(Vs2');
D_fil=(pinv(Y1))*Y2;
z = eig(D_fil);

l=length(z);
for i=1:2:l
    f((i+1)/2)= (angle(z(i))*fs)/(2*pi);
    d((i+1)/2)=-real(z(i))*fs;
end

在上面代码的输出中,我正确地得到了四个组成频率成分,但没有得到它们的衰减因子。如果任何人有此算法的经验或对此可能出现这种差异的原因有所了解,我将非常感谢您的帮助。我曾尝试多次从头开始重写代码,但它没有任何帮助,给出了相同的结果。

任何帮助都将受到高度赞赏。

0 个答案:

没有答案