2015-03-04 1 views
0

je suis en train de mettre en œuvre mon propre code pour plomb (parce que je n'ai pas matlab 2014b), voici mon codeimplémenter votre propre fonction plomb dans Matlab

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); 

il est fait en utilisant l'aide de site suivant

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

i ont testé ce code sur suivant signal sinusoïdal simple,

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

mais je me suis erreur

[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 

ÉDITÉ:

je dois changer mon code à ce

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 

est-il correct?

Répondre

1

Il semble que vous ayez besoin d'effectuer des opérations élémentaires. Donc, faites ceci -

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); 
+0

Hahahah wow. Juste à côté de quelques secondes! – rayryeng

+0

@rayryeng Ça arrive les jours de fous! ;) – Divakar

+0

merci mon ami et qu'en est-il du décalage horaire? Qu'est-ce que c'est? Comment puis-je calculer? –

1

Il semble que cette instruction essaie de calculer des opérations élément par élément mais seulement une partie de l'expression le fait. En particulier, f et t sont les deux vecteurs mais vous essayez de les multiplier avec * qui est interprété comme une multiplication matricielle. De plus, il vous manque un opérateur . pour la première puissance de 2 dans l'instruction, mais vous semblez l'avoir fait pour la deuxième puissance de l'instruction 2.

En tant que tel, vous devez modifier les deux déclarations:

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); 
+0

J'utilise aussi une boucle comme celle-ci pour k = 1: longueur (x) partie1 (k) = somme (((x-x_mean). * Cos (2 * pi * f (k) * t)))^2/somme (cos (2 * pi * f (k) * t).^2); partie2 (k) = somme (((x-x_mean). * Sin (2 * pi * f (k) * t)))^2/somme (sin (2 * pi * f (k) * t).^2); PLS = (partie 1 + partie 2)/(variance 2 *); –

+0

point que je n'ai pas compris comment introduire offset? Je voulais dire le décalage horaire –

+0

Cette boucle n'a pas beaucoup de sens. La sortie de chaque expression serait un vecteur, mais vous essayez d'assigner cette sortie à un seul élément dans 'part1'. Stick avec les opérations vectorisées. – rayryeng