Why this message appears?

clear all;
f1=200;
f2=250;
a1=1;
a2=1.5;
fe=10e3;
temps=0:1/fe:0.02-1/fe;
m1=a1*sin(2*pi*f1*temps);
m2=a2*sin(2*pi*f2*temps);
mt=m1*m2;
Error using *
Inner matrix dimensions must agree.

 Accepted Answer

It appears because you are multiplying two row vector using matrix mulktiplication.
You need to use element-wise array multiplication (using .* instead of *):
mt = m1 .* m2;

10 Comments

if i do that i have a problem with this:
spec_mt=fft(abs(mt.n));
Attempt to reference field of non-structure array.
You have a ‘.n’ that makes no sense in the context of the rest of your code.
Try this instead:
spec_mt=fft(abs(mt));
however for best results, do this:
spec_mt=fft(abs(mt)) / numel(temps);
There is no ‘n’ in the code that you posted. If you defined ‘n’ but you did not post it and it is supposed to be the length of the fft, you need a comma, not a period, between ‘mt’ and ‘n’:
spec_mt=fft(abs(mt,n)) / numel(temps);
Probably you want mt.*n but we would need to see more code to be more certain.
This is the whole code:
clear all;
f1=200;
f2=250;
a1=1;
a2=1.5;
fe=10e3;
temps=0:1/fe:0.02-1/fe;
m1=a1*sin(2*pi*f1*temps);
m2=a2*sin(2*pi*f2*temps);
mt=m1.*m2;
n=length(temps);
freqs=0:fe/n:fe-1/n;
spec_mt=fft(abs(mt.n));
figure(1)
subplot(211),plot(temps,mt);grid;
subplot(212),plot(freqs,spec_mt);grid;
fmod=3e3;
xt=mt.*cos(2*pi*fmod*temps);
spec_xt=fft(abs(xt.n));
figure(2)
plot(freqs,spec_xt);grid;
yt=xt.*cos(2*pi*fmod*temps);
spec_yt=fft(abs(yt.n));
y2=spec_yt;
figure(3)
plot(freqs,y2);grid;
y2(200:n)=zeros(1,n-200+1);
spec_y2=abs(y2);
x2=real(ifft(y2));
figure(5)
subplot(211),plot(temps,mt);grid;
subplot(212),plot(temps,x2);grid;
Star Strider,
If I use the comma an error appears:
too many arguments in "abs".
Try this:
spec_yt=fft(abs(yt))/n;
it works but i got this warning:
Warning: Imaginary parts of complex X and/or Y arguments ignored
the graphs are not what i wanted.
This takes the absolute values of the fft results, so the warning will not appear:
f1=200;
f2=250;
a1=1;
a2=1.5;
fe=10e3;
temps=0:1/fe:0.02-1/fe;
m1=a1*sin(2*pi*f1*temps);
m2=a2*sin(2*pi*f2*temps);
mt=m1.*m2;
n=length(temps);
freqs=0:fe/n:fe-1/n;
spec_mt=fft(abs(mt))/n;
figure(1)
subplot(211),plot(temps,mt);grid;
subplot(212),plot(freqs,abs(spec_mt));grid;
fmod=3e3;
xt=mt.*cos(2*pi*fmod*temps);
spec_xt=fft(abs(xt))/n;
figure(2)
plot(freqs,abs(spec_xt));grid;
yt=xt.*cos(2*pi*fmod*temps);
spec_yt=fft(abs(yt))/n;
y2=abs(spec_yt);
figure(3)
plot(freqs,y2);grid;
y2(200:n)=zeros(1,n-200+1);
spec_y2=abs(y2);
x2=real(ifft(y2));
figure(5)
subplot(211),plot(temps,mt);grid;
subplot(212),plot(temps,x2);grid;
You should probably shift the frequency axes so that ‘0’ is in the centre, or plot a one-sided fft. .
I've figured it out:
spec_mt=fft(mt,n);
plot(freqs,abs(spec_mt));grid;
the comma is between 2 parts of the fft not of the abs.
Thanks for the help.
As always, my pleasure.
I took the ‘n’ out of the fft call entirely. I was not certain where you wanted to put the ‘n’, or what you wanted to do with it. If ‘n’ is the same as the size as the time-domain vector, using it as the size of the fft does not change anything, because the length of the time-domain vector is the default length of the fft for that vector.

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!