2017-03-10 1 views
1

Je suis nouveau à Matlab et débordement de pile pour commencer, donc si je fais quelque chose de mal en dehors des directives, s'il vous plaît don ' hésiter à le signaler. Merci!Matlab Convolution en ce qui concerne la fonction conv() et la fonction length()/size()

J'ai essayé de faire la convolution entre deux fonctions et j'ai eu du mal à essayer de le faire fonctionner.

t=0:.01:10;   
h=exp(-t);   
x=zeros(size(t)); % When I used length(t), I would get an error that says in conv(), A and B must be vectors.  
x(1)=2;   
x(4)=5;   
y=conv(h,x);   
figure; subplot(3,1,1);plot(t,x); % The discrete function would not show (at x=1 and x=4)  
subplot(3,1,2);plot(t,h);   
subplot(3,1,3);plot(t,y(1:length(t))); %Nothing is plotted here when ran 

J'ai commenté mes problèmes avec le code. Je ne comprends pas la différence de length et size dans ce cas et comment cela ferait une différence.

Pour le deuxième commentaire, x=1 doit avoir une amplitude de 2. Alors que x=4 devrait avoir une amplitude de 5. Lorsque tracé, il ne montre rien dans les endroits spécifiés, mais semble brouillé au x=0. Je suppose que c'est la raison pour laquelle l'intrigue alambiquée ne sera pas affichée.

L'énoncé de problème original est donné s'il aide à comprendre ce que je pensais tout au long.

Considérons un signal d'entrée x (t) qui se compose de deux fonctions delta à t = 1 et t = 4 avec des amplitudes A1 = 5 et A2 = 2, respectivement, pour un système linéaire à réponse impulsionnelle h qui est une impulsion exponentielle (h (t) = e^-t). Tracer x (t), h (t) et la sortie du système linéaire y (t) pour t dans la plage de 0 à 10 en utilisant des incréments de 0,01. Utilisez la fonction intégrée MATLAB conv.

Répondre

0

La première question en ce qui concerne size vs length

length donne un scalaire qui est égale à la plus grande dimension de l'entrée. Dans le cas de votre tableau, le size est 1 x N, donc length donne N.

size(t) 
% 1 1001 

length(t) 
% 1001 

Si vous passez un scalaire (N) à ones, zeros, ou une fonction similaire, il va créer une matrice carrée qui est N x N. Cela entraîne l'erreur que vous voyez lorsque vous utilisez conv puisque conv n'accepte pas les entrées de matrice.

size(ones(length(t))) 
% 1001 1001 

Lorsque vous passez un vecteur à ones ou zeros, la sortie sera que la taille donc depuis size retourne un vecteur (comme indiqué ci-dessus), la sortie est de la même taille (et un vecteur) si conv n'a aucun problème

size(ones(size(t))) 
% 1 1001 

Si vous voulez un vecteur, vous devez spécifier explicitement le nombre de lignes et de colonnes.De plus, à mon avis, il est préférable d'utiliser numel au nombre d'éléments dans un vecteur comme il est moins ambigu que length

z = zeros(1, numel(t)); 

La deuxième question concernant la sortie de convolution:

tout d'abord, les impulsions que vous créez sont au premier et au quatrième index de et non aux emplacements où t = 1 et t = 4. Depuis la création t en utilisant un espacement de 0.01, t(1) correspond en fait à t = 0 et t(4) correspond à t = 0.03

Vous voulez plutôt que d'utiliser la valeur de t pour indiquer où mettre vos impulsions

x(t == 1) = 2; 
x(t == 4) = 5; 

Remarque En raison des erreurs de virgule flottante, vous pouvez ne pas avoir exactementt == 1 et t == 4 de sorte que vous pouvez utiliser un petit epsilon à la placeUne fois que nous faisons cette modification, nous obtenons les versions mises à l'échelle et décalées attendues de la fonction d'entrée.

enter image description here