Discussion:
How to get magnitude and phase onfo of a given signal
(too old to reply)
Ashwini Deshpande
2009-07-06 10:12:01 UTC
Permalink
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Thanks !
Ashwini
Wayne King
2009-07-06 11:18:01 UTC
Permalink
hi Ashwini, please look at the help for fft
Post by Ashwini Deshpande
doc fft
Hope that helps,
wayne
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Thanks !
Ashwini
Dave Robinson
2009-07-06 11:23:01 UTC
Permalink
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Thanks !
Ashwini
If you know what the frequency of your signal is, as you do in your example, then create a unity amplitude sine wave and a unity amplitude cosine wave of exactly the same frequency but of zero phase. Now take your signal and do a sample by sample multiplication first by the cosine wave you have just synthesized, then accumulate the results - repeat this process for your sine wave. You should get 2 simple numbers out of each multiply accumulate operation. If you do a pythagorean sum on these numbers, it will tell you the amplitude of your signal, and if you take ATAN2 on the Cosine accumulation and the Sine accumulation, this will give you a measure of the phase.
If you don't know the frequency of your signal, then you probably need to resort to using the FFT, if so come back.
Regards
Dave Robinson
Ashwini Deshpande
2009-07-06 12:21:01 UTC
Permalink
Post by Dave Robinson
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Thanks !
Ashwini
If you know what the frequency of your signal is, as you do in your example, then create a unity amplitude sine wave and a unity amplitude cosine wave of exactly the same frequency but of zero phase. Now take your signal and do a sample by sample multiplication first by the cosine wave you have just synthesized, then accumulate the results - repeat this process for your sine wave. You should get 2 simple numbers out of each multiply accumulate operation. If you do a pythagorean sum on these numbers, it will tell you the amplitude of your signal, and if you take ATAN2 on the Cosine accumulation and the Sine accumulation, this will give you a measure of the phase.
If you don't know the frequency of your signal, then you probably need to resort to using the FFT, if so come back.
Regards
Dave Robinson
Thanks for ur reply,
can plz clear me that what do u mean by accumulating result. Is it same as calculating the mean.
Thanks !
Ashwini
Dave Robinson
2009-07-06 16:29:03 UTC
Permalink
Post by Ashwini Deshpande
Thanks for ur reply,
can plz clear me that what do u mean by accumulating result. Is it same as calculating the mean.
Thanks !
Ashwini
When you do the sample by sample multiplication (.*) of the two waveforms, you will end up with a vector of the same length as your (Cos)Sine wave and signal. By accumulate I meant add up all the elements in that vector - yes you are right, it is directly proportional to the mean value of that vector.
Regards
Dave Robinson
TideMan
2009-07-06 20:19:55 UTC
Permalink
Post by Dave Robinson
Post by Ashwini Deshpande
Thanks for ur reply,
can plz clear me that what do u mean by accumulating result. Is it same as calculating the mean.
Thanks !
Ashwini
When you do the sample by sample multiplication (.*) of the two waveforms, you will end up with a vector of the same length as your (Cos)Sine wave and signal. By accumulate I meant add up all the elements in that vector - yes you are right, it is directly proportional to the mean value of that vector.
Regards
Dave Robinson
Another way of doing what Dave suggests is using Matlab's \ facility:
wt=2*pi*4*t;
coef=[cos(wt) sin(wt)]\x;
amp=sqrt(coef(1)^2 + coef(2)^2);
phi=atan2(coef(1),coef(2))*180/pi;
In principle, this is the way tidal constituents are calculated from a
tide gauge record, except that there are not one, but up to 600
frequencies involved.
Ashwini Deshpande
2009-07-07 04:49:02 UTC
Permalink
Post by TideMan
Post by Dave Robinson
When you do the sample by sample multiplication (.*) of the two waveforms, you will end up with a vector of the same length as your (Cos)Sine wave and signal. By accumulate I meant add up all the elements in that vector - yes you are right, it is directly proportional to the mean value of that vector.
Regards
Dave Robinson
wt=2*pi*4*t;
coef=[cos(wt) sin(wt)]\x;
amp=sqrt(coef(1)^2 + coef(2)^2);
phi=atan2(coef(1),coef(2))*180/pi;
In principle, this is the way tidal constituents are calculated from a
tide gauge record, except that there are not one, but up to 600
frequencies involved.
Thanks a lot for ur reply,
My code is as follows:
t=0:0.0001:0.02;
ph=0;
x1=sin(2*pi*100*t);
x2=sin(2*pi*100*t+ph);
plot(t,x1,t,x2);
X1_sq=x1.^2;
X2_sq=x2.^2;
s1=mean(X1_sq);
s2=mean(X2_sq);
amp=sqrt(s1^2+s2^2);
phi=atan2(s2,s1)*180/pi;
when i run this code i get phi value around 45 for any value of ph.
But i suppose to get 0 for ph=0 and so on..... what is wrong in this .. ??
Thanks !
Ashwini
Srikanth
2012-04-24 18:41:07 UTC
Permalink
Post by TideMan
Post by Dave Robinson
Post by Ashwini Deshpande
Thanks for ur reply,
can plz clear me that what do u mean by accumulating result. Is it same as calculating the mean.
Thanks !
Ashwini
When you do the sample by sample multiplication (.*) of the two waveforms, you will end up with a vector of the same length as your (Cos)Sine wave and signal. By accumulate I meant add up all the elements in that vector - yes you are right, it is directly proportional to the mean value of that vector.
Regards
Dave Robinson
wt=2*pi*4*t;
coef=[cos(wt) sin(wt)]\x;
amp=sqrt(coef(1)^2 + coef(2)^2);
phi=atan2(coef(1),coef(2))*180/pi;
In principle, this is the way tidal constituents are calculated from a
tide gauge record, except that there are not one, but up to 600
frequencies involved.
Hello,
I saw your comment and wanted to know if you could provide some insight on how to apply this method to a signal that has more than 1 frequency involved (in my case 3). Will this method provide a good result if the estimate of the frequency w is slightly off (due to experimental error)?
Thanks in advance for your help
-Sri
Ihaveideas
2012-05-30 15:34:09 UTC
Permalink
Dear Dave,
What is the name of the algorithm you have suggested in your comment below, where basically in order to find the magnitude and phase of a signal with a known frequency, you would perform a sample by sample multiplication of the signal and two sine waves (a sine and a cosine). I am interested in pursuing this a bit further. In particular, I am interested in finding the error that results in performing such operations.
Best wishes
Post by Dave Robinson
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Thanks !
Ashwini
If you know what the frequency of your signal is, as you do in your example, then create a unity amplitude sine wave and a unity amplitude cosine wave of exactly the same frequency but of zero phase. Now take your signal and do a sample by sample multiplication first by the cosine wave you have just synthesized, then accumulate the results - repeat this process for your sine wave. You should get 2 simple numbers out of each multiply accumulate operation. If you do a pythagorean sum on these numbers, it will tell you the amplitude of your signal, and if you take ATAN2 on the Cosine accumulation and the Sine accumulation, this will give you a measure of the phase.
If you don't know the frequency of your signal, then you probably need to resort to using the FFT, if so come back.
Regards
Dave Robinson
Rune Allnor
2009-07-06 11:45:28 UTC
Permalink
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
There is no such function.
Some people have suggested FFT, but it only works like
you want it to, under very special cisrcumstances.
For instance:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 8;
f1 = 2/16;
x = sin(2*pi*f1*(0:N-1));
X = fft(x);
plot(abs(X)/N)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
In this case you recognize the amplitude from
the model, as expressed by Euler's relation
sin(x) = 1/2(exp(jx)-exp(-jx)).
However, if you change the frequency slightly,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 8;
f2 = 3/16;
y = sin(2*pi*f2*(0:N-1));
Y = fft(y);
plot(abs(Y)/N)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
you no longer recognize the single sinusodial
in your signal.
Rune
Greg
2009-07-07 04:52:59 UTC
Permalink
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Since you know the frequency, find C from
% x = C(1)*cos(2*pi*4*t)+C(2)*sin(2*pi*4*t);
t = (0:0.01:1)';
x = sin(2*pi*4*t);
W = [cos(2*pi*4*t) sin(2*pi*4*t)];
C = W\x
C =
0.0000
1.0000
Hope this helps.
Greg
Ashwini Deshpande
2009-07-20 08:35:19 UTC
Permalink
Post by Greg
Post by Ashwini Deshpande
Hi,
I have sine wave as follows,
t=0:0.01:1;
x=sin(2*pi*4*t);
if i want to know the magnitude and phase of this signal, what do i do ??
It is something like,
[magnitude, phase] = function(x);
Can anyone tell me that, is there any such library function available in matlab which gives me magnitude and phase information of signal given.
Since you know the frequency, find C from
% x = C(1)*cos(2*pi*4*t)+C(2)*sin(2*pi*4*t);
t = (0:0.01:1)';
x = sin(2*pi*4*t);
W = [cos(2*pi*4*t) sin(2*pi*4*t)];
C = W\x
C =
0.0000
1.0000
Hope this helps.
Greg
Thanks a lot Greg ,,
I got my result...
Ashwini !
11 Replies
3 Views
Permalink to this page
Disable enhanced parsing
Thread Navigation
Ashwini Deshpande2009-07-06 10:12:01 UTC