在matlab中实现自己的plomb函数

时间:2015-03-04 05:44:54

标签: matlab spectrum

我正在尝试为plomb实现我自己的代码(因为我没有matlab 2014b),这是我的代码

function [PLS,f]=plomb(x,t);
diff=t(2)-t(1);
fs=1/diff;
x_mean=mean(x);
variance=var(x);
f=fs*(0:length(x)-1)/length(x);
part1=sum(((x-x_mean).*cos(2*pi*f*t)))^2/sum(cos(2*pi*f*t).^2);
part2=sum(((x-x_mean).*sin(2*pi*f*t)))^2/sum(sin(2*pi*f*t).^2);
PLS=(part1+part2)/(2*variance);

使用以下网站

的帮助完成

http://www.mathworks.com/help/signal/ref/plomb.html?refresh=true

我已经在下面的简单正弦信号上测试了这段代码

>> t=0:0.01:2.93;
>> x=sin(2*pi*10*t);

但我收到了错误

[PLS,f]=plomb(x,t);
Error using  * 
Inner matrix dimensions must agree.

Error in plomb (line 7)
part1=sum(((x-x_mean).*cos(2*pi*f*t)))^2/sum(cos(2*pi*f*t).^2);
 i did not get point,what i am doing incorrectly?thanks in advance

已编辑:

我已将代码更改为此

for k=1:length(x)
part1(k)=sum(((x-x_mean).*cos(2*pi*f(k)*t)))^2/sum(cos(2*pi*f(k)*t).^2);
part2(k)=sum(((x-x_mean).*sin(2*pi*f(k)*t)))^2/sum(sin(2*pi*f(k)*t).^2);
PLS=(part1+part2)/(2*variance);
end

没关系?

2 个答案:

答案 0 :(得分:1)

似乎你需要在那里执行元素操作。所以,这样做 -

part1=sum(((x-x_mean).*cos(2*pi.*f.*t))).^2/sum(cos(2*pi.*f.*t).^2);
part2=sum(((x-x_mean).*sin(2*pi.*f.*t))).^2/sum(sin(2*pi.*f.*t).^2);

答案 1 :(得分:1)

看起来该语句试图逐个元素操作计算,但只有部分表达式正在这样做。特别是,ft都是向量,但您尝试将它们与*相乘,后者被解释为矩阵乘法。另外,你在语句中错过了.运算符的第一个2的幂,但你似乎已经为2语句的第二个幂做了这个。

因此,您需要将两个语句修改为:

part1=sum(((x-x_mean).*cos(2*pi.*f.*t))).^2/sum(cos(2*pi.*f.*t).^2);
part2=sum(((x-x_mean).*sin(2*pi.*f.*t))).^2/sum(sin(2*pi.*f.*t).^2);