[已答复] 关于prony算法

[复制链接]
xi_an2006 发表于 2011-11-15 22:15:40
最近一直在搞prony算法,资料是张贤达的《现代信号处理》和束红春的《电力工程信号处理应用》,这两本书都有关于prony扩展算法的内容,甚至有相关步骤,我也根据这些内容自己编了程序。为了测试 在信号x=160*sin(2*pi*f1*t+pi/5)+150*exp(-3*t).*sin(2*pi*f2*t+pi/4);
取时窗10ms 100个数据点,但是分离不出这两信号,后面尽管修改程序自己设定介数p ,增加数据窗长度还是失败,而且有数据稳定性也有问题。
但是用mathwork网站上下的pronytool工具箱还是能比较容易的分离出来的,于是我查看pronytool的原程序,发现工具包里边的算法和上边两本书上的算法是不一样的,好像是根据零极点和滤波脉冲响应什么的,我实在不是太懂。
所以诚心向各位请教。
  1. %% 数据准备
  2. clear;
  3. clc;
  4. format long
  5. % load('1000kV示范工程线路','t','vX0043a')
  6. % x = vX0043a(201:500);
  7. % t = t(201:500); exp_matrix.m (2.04 KB, 下载次数: 22935)
  8. f1 = 49;
  9. f2 = 51;
  10. t=0.0001:0.0001:0.01;
  11. x = 160*sin(2*pi*f1*t+pi/5)+150*exp(-3*t).*sin(2*pi*f2*t+pi/4);
  12. dt = 0.0001;
  13. N = length(x);
  14. pe = floor(N/2);

  15. %% 构造样本矩阵

  16. Re=zeros(pe+1,pe+1);

  17. for i = 2:pe+1
  18.     for j = 1:pe+1
  19.         for n = pe:N-1
  20.         Re(i,j) = Re(i,j)+x(n-j+2)*x(n-i+2);
  21.         end
  22.     end
  23. end

  24. Re(1,:) = [];

  25. %% SVD_TLS确定介数p及a

  26. [U,S,V] = svd(Re);       %%%%%%奇异值分解

  27. % 求p值
  28. % 计算全部奇异值平方和
  29. sum_all = 0;
  30. for i = 1:pe
  31.     sum_all = sum_all+S(i,i)^2;
  32. end

  33. % 归一化比值Ak/A 求p值
  34. sum_k = 0;
  35. k = 1;
  36. while 1 - sqrt(sum_k/sum_all) > 0.0000000000000000001 & i<=pe
  37.     sum_k = sum_k+S(k,k)^2;                      %%%%%%%计算k个奇异值平方和
  38.     k = k+1;
  39. end
  40. p = k-1;

  41. % 求Sp部分
  42. Sp=zeros(p+1,p+1);                        %%%%%%s生成(p+1)X(p+1)维矩阵Sp
  43. for j = 1:p
  44.     for i = 1:(pe+1-p)
  45.        Sp = Sp+S(j)^2*V(i:i+p,j)*V(i:i+p,j)';
  46.     end
  47. end

  48. % SS = zeros(pe,pe+1);
  49. % for i = 1:p
  50. %     SS(i,i) = S(i,i);
  51. % end
  52. % B = U*SS*V;

  53. % 求Sp逆矩阵
  54. inv_Sp=inv(Sp);
  55. if isinf(inv_Sp(1,1)) == 1
  56.     inv_Sp = pinv(Sp);
  57. end

  58. % 求a
  59. a=inv_Sp(2:p+1,1)/inv_Sp(1,1);

  60. %% 求z
  61. y=[1 a'];
  62. z=roots(y);

  63. %% 求x的近似值x_j
  64. %求前p近似值等于测量值 x_j(1:p)
  65. x_j=zeros(N,1);
  66. for i = 1:p
  67.     x_j(i)=x(i);
  68. end

  69. %求x的N-p+1个近似值  x_j(p+1:N)
  70. for n = p+1:N
  71.     for i = 1:p
  72.         x_j(n)=x_j(n)-a(i)*x_j(n-i);
  73.     end
  74. end

  75. %% 画图 x、x_j
  76. hold on;
  77. plot(t,x,'k');
  78. plot(t,x_j,'r');
  79. hold off;

  80. %% 求取 b=inv(H)*Z'*x_j

  81. % 求取N X p维vandermode矩阵Z
  82. Z=zeros(N,p);
  83. for i=1:N
  84.     Z(i,:)=z'.^(i-1);
  85. end

  86. %求取H
  87. H=zeros(p,p);
  88. for i=1:p
  89.     for j=1:p
  90.         m=(conj(z(i))*z(j));
  91.         H(i,j)=(m^N-1)/(m-1);
  92.     end
  93. end

  94. % 求取b
  95. b=inv(H)*Z'*x';

  96. %% 计算振幅Amp 频率Fre 衰减因子Damp 相位 Pha
  97. for i = 1:p
  98.     Amp(i) = abs(b(i));
  99.     Fre(i) = atan(imag(z(i)/real(z(i))))/(2*pi*dt);
  100.     Damp(i) = log(abs(z(i)))*dt;
  101.     Pha(i) = atan(imag(b(i)/real(b(i))));
  102. end
复制代码

xi_an2006 发表于 2011-11-16 00:02:09
是不是算法程序出了问题 求帮忙

cwjy 发表于 2011-11-16 16:40:28
把错误贴出来以便会员解答

xi_an2006 发表于 2011-11-16 17:54:26

回复 3# cwjy 的帖子

可以运行,就是打不到要的效果,分离不出两个频率相近的信号

huanghun0912 发表于 2013-1-14 10:28:47
可以共享一下mathwork网站上下的pronytool工具箱么644682383@qq.com,真心感谢。一同学习。。

yyl_liang 发表于 2013-3-28 10:35:16
大家有prony工具箱的中文说明吗,我分析的时候频率是成对出现的,应该怎样处理啊

ztj7beichen 发表于 2013-4-22 15:22:15
yyl_liang 发表于 2013-3-28 10:35
大家有prony工具箱的中文说明吗,我分析的时候频率是成对出现的,应该怎样处理啊
...

遇到了相同的问题,谁有工具箱的中文说明啊

zhulinyuanchu 发表于 2013-5-16 10:42:24
我在mathworks网站上下了pronytool工具箱,结果用半天不会用 求大神指导下我啊  看英文看不大懂 大神加我qq:765481889

xxxxx2013 发表于 2013-10-28 10:03:28
同求工具箱的中文说明

林飞飞0818 发表于 2015-11-10 16:49:19
yyl_liang 发表于 2013-3-28 10:35
大家有prony工具箱的中文说明吗,我分析的时候频率是成对出现的,应该怎样处理啊
...

请问你的问题是如何解决的啊?

林飞飞0818 发表于 2015-11-13 16:47:03
yyl_liang 发表于 2013-3-28 10:35
大家有prony工具箱的中文说明吗,我分析的时候频率是成对出现的,应该怎样处理啊
...

频率成对出现的问题,而且相位等也是成对的,正负号不同,怎么解释啊

花开无视 发表于 2017-7-13 20:38:17
楼主你好!我检验了你的Re发现结果第一行全是0,请问为什么?谢谢

朱晓峰121212 发表于 2017-11-16 16:20:53
prony工具箱怎么使用呢?有中文说明吗?

123xiaoyuer 发表于 2017-12-13 14:51:03
同样再弄prony,遇到了同样问题

mapex 发表于 2018-1-23 11:05:24
精度上还是差很多啊。怎么提高精度啊。你这个算法流程和步骤应该是没有问题的。

丽红 发表于 2018-11-29 11:40:50
huanghun0912 发表于 2013-1-14 10:28
可以共享一下mathwork网站上下的pronytool工具箱么,真心感谢。一同学习。。

同求  487404058@qq.com  万分感谢

丽红 发表于 2018-12-17 23:14:04
楼主这个程序是工具箱上的,还是书上的呢?

龙渊承影 发表于 2019-4-19 16:01:18
本帖最后由 龙渊承影 于 2019-4-19 16:04 编辑

楼主可不可以分享下下载的Prony工具箱安装包呢?万分感谢!我邮箱:2535713512@qq.com

龙渊承影 发表于 2019-4-19 16:02:43
本帖最后由 龙渊承影 于 2019-4-19 16:03 编辑
丽红 发表于 2018-11-29 11:40
同求    万分感谢

你好,请问你收到了PRONY的安装包了吗?可以分享下咩?感谢~我邮箱:2535713512@qq.com

john.bham 发表于 2019-6-3 02:01:21
你好,请问一下点击Start运行时有没有出现如下bug,如果有的话怎样解决,谢谢!
pronytool
Undefined function or variable 'xlate'.

Error in pronytoolbar (line 24)
mlabel = get(h1(j),xlate('TooltipString'));

Error in pronyanalysistool>pronyanalysistool_OpeningFcn (line 62)
pronytoolbar(hObject,'on');

Error in gui_mainfcn (line 220)
feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:});

Error in pronyanalysistool (line 42),

tonywang.cnnj 发表于 2019-7-11 16:15:32
john.bham 发表于 2019-6-3 02:01
你好,请问一下点击Start运行时有没有出现如下bug,如果有的话怎样解决,谢谢!
pronytool
Undefined func ...

我也出现这个错误了,请问你解决了吗

15195978203 发表于 2020-12-1 13:19:47
大佬,这个PRONY的输入参数是采样时间和函数吗?

15195978203 发表于 2020-12-1 13:24:25
x = 160*sin(2*pi*f1*t+pi/5)+150*exp(-3*t).*sin(2*pi*f2*t+pi/4);
dt = 0.0001;
N = length(x);
pe = floor(N/2);
这个PRONY的输入分别是x、dt、N、pe这四个参数吗?我有仿真数据,但是不知道怎么拿PRONY来分析我我的仿真数据,x代表要分析信号的函数、dt代表采样时间、N是代表数据窗的长度、pe是代表取整。如何输入这四个参数对我的仿真数据进行分析呢?我的仿真数据类型是exccel中的数据。

wx_GO7i5EYl 发表于 2021-11-2 00:50:19
%% 数据准备
clear;
clc;
format long
% load('1000kV示范工程线路','t','vX0043a')
% x = vX0043a(201:500);
% t = t(201:500);

f1 = 40;
f2 = 60;
t=0.001:0.001:0.05;
x = 160*sin(2*pi*f1*t+pi/5)+150*exp(-3*t).*sin(2*pi*f2*t+pi/4);
dt = 0.001;
N = length(x);
pe = floor(N/2);

%% 构造样本矩阵

Re=zeros(pe+1,pe+1);

for i = 2:pe+1
    for j = 1:pe+1
        for n = pe:N-1
        Re(i,j) = Re(i,j)+x(n-j+2)*x(n-i+2);
        end
    end
end

Re(1,:) = [];

%% SVD_TLS确定介数p及a

[U,S,V] = svd(Re);       %%%%%%奇异值分解

% 求p值
% 计算全部奇异值平方和
sum_all = 0;
for i = 1:pe
    sum_all = sum_all+S(i,i)^2;
end

% 归一化比值Ak/A 求p值
sum_k = 0;
k = 1;
while 1 - sqrt(sum_k/sum_all) > 0.0000000000000000001 & i<=pe
    sum_k = sum_k+S(k,k)^2;                      %%%%%%%计算k个奇异值平方和
    k = k+1;
end
p = k-1;

% 求Sp部分
Sp=zeros(p+1,p+1);                        %%%%%%s生成(p+1)X(p+1)维矩阵Sp
for j = 1:p
    for i = 1:(pe+1-p)
       Sp = Sp+S(j)^2*V(i:i+p,j)*V(i:i+p,j)';
    end
end

% SS = zeros(pe,pe+1);
% for i = 1:p
%     SS(i,i) = S(i,i);
% end
% B = U*SS*V;

% 求Sp逆矩阵
inv_Sp=inv(Sp);
if isinf(inv_Sp(1,1)) == 1
    inv_Sp = pinv(Sp);
end

% 求a
a=inv_Sp(2:p+1,1)/inv_Sp(1,1);

%% 求z
y=[1 a'];
z=roots(y);

%% 求x的近似值x_j
%求前p近似值等于测量值 x_j(1:p)
x_j=zeros(N,1);
for i = 1:p
    x_j(i)=x(i);
end

%求x的N-p+1个近似值  x_j(p+1:N)
for n = p+1:N
    for i = 1:p
        x_j(n)=x_j(n)-a(i)*x_j(n-i);
    end
end

%% 画图 x、x_j
hold on;
plot(t,x,'k');
plot(t,x_j,'r');
hold off;

%% 求取 b=inv(H)*Z'*x_j

% 求取N X p维vandermode矩阵Z
Z=zeros(N,p);
for i=1:N
    Z(i,:)=z'.^(i-1);
end

%求取H
H=zeros(p,p);
for i=1:p
    for j=1:p
        m=(conj(z(i))*z(j));
        H(i,j)=(m^N-1)/(m-1);
    end
end

% 求取b
b=inv(H)*Z'*x';

%% 计算振幅Amp 频率Fre 衰减因子Damp 相位 Pha
for i = 1:p
    Amp(i) = abs(b(i))
    Fre(i) = atan(imag(z(i)/real(z(i))))/(2*pi*dt)
    Damp(i) = log(abs(z(i)))*dt
    Pha(i) = atan(imag(b(i)/real(b(i))))
end



Amp =

  75.435264220318473  75.435264220318459  79.821614453380022  79.821614453380022


Fre =

  60.000000000644370 -60.000000000644370  39.999999999685848 -39.999999999685848


Damp =

   1.0e-05 *

  -0.299999999623960  -0.299999999623960   0.000000000270939   0.000000000270939


Pha =

   0.475722414206541  -0.475722414206541   0.654158664114685  -0.654158664114685

小龙6666 发表于 2021-11-3 04:35:01
鄙人觉得您时间应该从零开始   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表