<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624</link>
    <title>MATLAB Central Newsreader - ratio of fft's</title>
    <description>Feed for thread: ratio of fft's</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2008 by The MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>The MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Tue, 20 May 2008 18:00:25 -0400</pubDate>
      <title>ratio of fft's</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624#433178</link>
      <author>Bruce </author>
      <description>A simple divison, on paper, of two fft's proves that the&lt;br&gt;
ratio of the fourier transform of two sine waves with the&lt;br&gt;
same frequency gives exp(-j*phi) where phi is the phase&lt;br&gt;
shift between the two. Therefore if you take&lt;br&gt;
angle(exp(-j*phi)) you should get phi, which is a constant.&lt;br&gt;
Why in matlab do you not get a constant?? Where do those&lt;br&gt;
spikes come from?&lt;br&gt;
&lt;br&gt;
% start of code. press spacebar to continue shifting.&lt;br&gt;
clear all; close all; clc;&lt;br&gt;
Fs = 4000; % sampling frequency&lt;br&gt;
T = 1/Fs;  % sample time&lt;br&gt;
L = 4000; %length of signal&lt;br&gt;
t = (0:L-1)*T;  % time vector&lt;br&gt;
NFFT = 2^nextpow2(L); % Next power of 2 from length of y&lt;br&gt;
&lt;br&gt;
y1 =  sin(2*pi*10*t).* hamming(length(t))'; &lt;br&gt;
Y1 = fft(y1,NFFT)/L;&lt;br&gt;
f = Fs/2*linspace(0,1,NFFT/2);&lt;br&gt;
loops = 1;&lt;br&gt;
phi = 0;&lt;br&gt;
% y2 = shifted sine wave&lt;br&gt;
y2 =  sin(2*pi*10*t + phi).*hamming(length(t))'; &lt;br&gt;
Y2 = fft(y2,NFFT);&lt;br&gt;
&lt;br&gt;
while(loops &amp;lt; 10000);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phi = loops*pi/360;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y2 =  sin(2*pi*10*t + phi) .* hamming(length(t))'; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(Fs*t,y1); hold on; plot(Fs*t,y2,'g'); hold off;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,2);    ratio = unwrap(angle(Y2./Y1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(ratio); axis([0, length(ratio), -5, 5]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text(500,4, ['degree shift: ',&lt;br&gt;
num2str(rem(rad2deg(phi),360))]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loops = loops + 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pause();&lt;br&gt;
end&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 20 May 2008 18:54:28 -0400</pubDate>
      <title>Re: ratio of fft's</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624#433189</link>
      <author>roberson@ibd.nrc-cnrc.gc.ca (Walter Roberson)</author>
      <description>In article &amp;lt;g0v3jp$27s$1@fred.mathworks.com&amp;gt;,&lt;br&gt;
Bruce  &amp;lt;italianasa84@gmail.com&amp;gt; wrote:&lt;br&gt;
&amp;gt;A simple divison, on paper, of two fft's proves that the&lt;br&gt;
&amp;gt;ratio of the fourier transform of two sine waves with the&lt;br&gt;
&amp;gt;same frequency gives exp(-j*phi) where phi is the phase&lt;br&gt;
&amp;gt;shift between the two. Therefore if you take&lt;br&gt;
&amp;gt;angle(exp(-j*phi)) you should get phi, which is a constant.&lt;br&gt;
&amp;gt;Why in matlab do you not get a constant?? Where do those&lt;br&gt;
&amp;gt;spikes come from?&lt;br&gt;
&lt;br&gt;
&amp;gt;% y2 = shifted sine wave&lt;br&gt;
&amp;gt;y2 =  sin(2*pi*10*t + phi).*hamming(length(t))'; &lt;br&gt;
&lt;br&gt;
When you use sin() to construct a sine wave that you submit to&lt;br&gt;
fft, then due to round-off error in the calculation of the sine,&lt;br&gt;
you will likely end up something that does not fft to a simple impulse&lt;br&gt;
in the frequency domain: you will get a phase distortion that&lt;br&gt;
will result in non-zero values at most points in the fft.&lt;br&gt;
The power of that phase distortion is quite small, but it is present&lt;br&gt;
and will have a noticable effect on your calculation.&lt;br&gt;
&lt;br&gt;
If you start by -constructing- an impulse in the frequency domain&lt;br&gt;
and ifft that back to a signal, the difference between the ifft'd&lt;br&gt;
values and the sin() values you calculated will be on the order of&lt;br&gt;
1E-14 to 1E-16. You cannot distinguish the two waveforms&lt;br&gt;
if you plot them on top of each other: the changes are just too small.&lt;br&gt;
&lt;br&gt;
The issue becomes quite prominent if you happen to use sind()&lt;br&gt;
instead of sin(); some day, if I ever get in a fresh supply&lt;br&gt;
of Round Tuits, I may investigate that further and possibly even&lt;br&gt;
file a bug report; when I was experimenting with this a couple of&lt;br&gt;
weeks ago, the sind() differences looked too large to be "reasonable".&lt;br&gt;
-- &lt;br&gt;
&amp;nbsp;&amp;nbsp;"Tired minds don't plan well. Sleep first, plan later."&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Walter Reisch&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 20 May 2008 21:38:32 -0400</pubDate>
      <title>Re: ratio of fft's</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624#433212</link>
      <author>dbd</author>
      <description>On May 20, 11:00 am, "Bruce " &amp;lt;italianas...@gmail.com&amp;gt; wrote:&lt;br&gt;
&amp;gt; A simple divison, on paper, of two fft's proves that the&lt;br&gt;
&amp;gt; ratio of the fourier transform of two sine waves with the&lt;br&gt;
&amp;gt; same frequency gives exp(-j*phi) where phi is the phase&lt;br&gt;
&amp;gt; shift between the two. Therefore if you take&lt;br&gt;
&amp;gt; angle(exp(-j*phi)) you should get phi, which is a constant.&lt;br&gt;
&amp;gt; Why in matlab do you not get a constant?? Where do those&lt;br&gt;
&amp;gt; spikes come from?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; % start of code. press spacebar to continue shifting.&lt;br&gt;
&amp;gt; clear all; close all; clc;&lt;br&gt;
&amp;gt; Fs = 4000; % sampling frequency&lt;br&gt;
&amp;gt; T = 1/Fs;  % sample time&lt;br&gt;
&amp;gt; L = 4000; %length of signal&lt;br&gt;
&amp;gt; t = (0:L-1)*T;  % time vector&lt;br&gt;
&amp;gt; NFFT = 2^nextpow2(L); % Next power of 2 from length of y&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; y1 =  sin(2*pi*10*t).* hamming(length(t))';&lt;br&gt;
&amp;gt; Y1 = fft(y1,NFFT)/L;&lt;br&gt;
&amp;gt; f = Fs/2*linspace(0,1,NFFT/2);&lt;br&gt;
&amp;gt; loops = 1;&lt;br&gt;
&amp;gt; phi = 0;&lt;br&gt;
&amp;gt; % y2 = shifted sine wave&lt;br&gt;
&amp;gt; y2 =  sin(2*pi*10*t + phi).*hamming(length(t))';&lt;br&gt;
&amp;gt; Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; while(loops &amp;lt; 10000);&lt;br&gt;
&amp;gt;     phi = loops*pi/360;&lt;br&gt;
&amp;gt;     y2 =  sin(2*pi*10*t + phi) .* hamming(length(t))';&lt;br&gt;
&amp;gt;     Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;     subplot(1,2,1);&lt;br&gt;
&amp;gt;     plot(Fs*t,y1); hold on; plot(Fs*t,y2,'g'); hold off;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;     subplot(1,2,2);    ratio = unwrap(angle(Y2./Y1));&lt;br&gt;
&amp;gt;     plot(ratio); axis([0, length(ratio), -5, 5]);&lt;br&gt;
&amp;gt;     text(500,4, ['degree shift: ',&lt;br&gt;
&amp;gt; num2str(rem(rad2deg(phi),360))]);&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;     loops = loops + 1;&lt;br&gt;
&amp;gt;     pause();&lt;br&gt;
&amp;gt; end&lt;br&gt;
&lt;br&gt;
If you are going to window the data you must window it properly to get&lt;br&gt;
proper results. That is to get bin centered tones to be bin centered,&lt;br&gt;
etc.&lt;br&gt;
&lt;br&gt;
In the hamming calls use the SFLAG parameter set to 'periodic'. See&lt;br&gt;
the hamming help. The default is not correct for windowing.&lt;br&gt;
&lt;br&gt;
Dale B. Dalrymple&lt;br&gt;
&lt;a href="http://dbdimages.com"&gt;http://dbdimages.com&lt;/a&gt;&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Wed, 21 May 2008 13:43:02 -0400</pubDate>
      <title>Re: ratio of fft's</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624#433334</link>
      <author>Ken Garrard</author>
      <description>dbd &amp;lt;dbd@ieee.org&amp;gt; wrote in message &amp;lt;b6c4d1df-b271-4336-&lt;br&gt;
a0e3-ba4e3f834342@l17g2000pri.googlegroups.com&amp;gt;...&lt;br&gt;
&amp;gt; On May 20, 11:00 am, "Bruce " &amp;lt;italianas...@gmail.com&amp;gt; &lt;br&gt;
wrote:&lt;br&gt;
&amp;gt; &amp;gt; A simple divison, on paper, of two fft's proves that the&lt;br&gt;
&amp;gt; &amp;gt; ratio of the fourier transform of two sine waves with &lt;br&gt;
the&lt;br&gt;
&amp;gt; &amp;gt; same frequency gives exp(-j*phi) where phi is the phase&lt;br&gt;
&amp;gt; &amp;gt; shift between the two. Therefore if you take&lt;br&gt;
&amp;gt; &amp;gt; angle(exp(-j*phi)) you should get phi, which is a &lt;br&gt;
constant.&lt;br&gt;
&amp;gt; &amp;gt; Why in matlab do you not get a constant?? Where do those&lt;br&gt;
&amp;gt; &amp;gt; spikes come from?&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; % start of code. press spacebar to continue shifting.&lt;br&gt;
&amp;gt; &amp;gt; clear all; close all; clc;&lt;br&gt;
&amp;gt; &amp;gt; Fs = 4000; % sampling frequency&lt;br&gt;
&amp;gt; &amp;gt; T = 1/Fs;  % sample time&lt;br&gt;
&amp;gt; &amp;gt; L = 4000; %length of signal&lt;br&gt;
&amp;gt; &amp;gt; t = (0:L-1)*T;  % time vector&lt;br&gt;
&amp;gt; &amp;gt; NFFT = 2^nextpow2(L); % Next power of 2 from length of y&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; y1 =  sin(2*pi*10*t).* hamming(length(t))';&lt;br&gt;
&amp;gt; &amp;gt; Y1 = fft(y1,NFFT)/L;&lt;br&gt;
&amp;gt; &amp;gt; f = Fs/2*linspace(0,1,NFFT/2);&lt;br&gt;
&amp;gt; &amp;gt; loops = 1;&lt;br&gt;
&amp;gt; &amp;gt; phi = 0;&lt;br&gt;
&amp;gt; &amp;gt; % y2 = shifted sine wave&lt;br&gt;
&amp;gt; &amp;gt; y2 =  sin(2*pi*10*t + phi).*hamming(length(t))';&lt;br&gt;
&amp;gt; &amp;gt; Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; while(loops &amp;lt; 10000);&lt;br&gt;
&amp;gt; &amp;gt;     phi = loops*pi/360;&lt;br&gt;
&amp;gt; &amp;gt;     y2 =  sin(2*pi*10*t + phi) .* hamming(length(t))';&lt;br&gt;
&amp;gt; &amp;gt;     Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt;     subplot(1,2,1);&lt;br&gt;
&amp;gt; &amp;gt;     plot(Fs*t,y1); hold on; plot(Fs*t,y2,'g'); hold off;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt;     subplot(1,2,2);    ratio = unwrap(angle(Y2./Y1));&lt;br&gt;
&amp;gt; &amp;gt;     plot(ratio); axis([0, length(ratio), -5, 5]);&lt;br&gt;
&amp;gt; &amp;gt;     text(500,4, ['degree shift: ',&lt;br&gt;
&amp;gt; &amp;gt; num2str(rem(rad2deg(phi),360))]);&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt;     loops = loops + 1;&lt;br&gt;
&amp;gt; &amp;gt;     pause();&lt;br&gt;
&amp;gt; &amp;gt; end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; If you are going to window the data you must window it &lt;br&gt;
properly to get&lt;br&gt;
&amp;gt; proper results. That is to get bin centered tones to be &lt;br&gt;
bin centered,&lt;br&gt;
&amp;gt; etc.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; In the hamming calls use the SFLAG parameter set to &lt;br&gt;
'periodic'. See&lt;br&gt;
&amp;gt; the hamming help. The default is not correct for &lt;br&gt;
windowing.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Dale B. Dalrymple&lt;br&gt;
&amp;gt; &lt;a href="http://dbdimages.com"&gt;http://dbdimages.com&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Bruce,&lt;br&gt;
&lt;br&gt;
In addition to properly using the window function as Dale &lt;br&gt;
suggests, you need to deal with the truncation effects of &lt;br&gt;
the FFT calculations before taking the ratio of the two &lt;br&gt;
complex vectors to construct a phase vector.  Otherwise the &lt;br&gt;
arc tangent of the ratio of two "noisy" values will produce &lt;br&gt;
the spikes that you observed.  Also do not force the FFT &lt;br&gt;
length to be a power of two.&lt;br&gt;
&lt;br&gt;
Try the modified version of your code below and I think you &lt;br&gt;
will get what you expected; a spike at the appropriate &lt;br&gt;
frequency (positive and negative) and zeros everywhere else.&lt;br&gt;
Without the hamming window the spike should be one sample &lt;br&gt;
wide.&lt;br&gt;
&lt;br&gt;
Regards,&lt;br&gt;
Ken&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
function phaseshift(nloop,usewin)&lt;br&gt;
&lt;br&gt;
if nargin &amp;lt; 1 || isempty(nloop),   nloop = 1000; end&lt;br&gt;
if nargin &amp;lt; 2 || isempty(usewin), usewin = true; end&lt;br&gt;
&lt;br&gt;
Fs = 4000;      % sampling frequency&lt;br&gt;
T = 1/Fs;       % sample time&lt;br&gt;
L = 4000;       % length of signal&lt;br&gt;
t = (0:L-1)*T;  % time vector&lt;br&gt;
&lt;br&gt;
NFFT = L;       % length of FFT&lt;br&gt;
&lt;br&gt;
% window function&lt;br&gt;
if usewin, winy = hamming(length(t),'periodic').';&lt;br&gt;
else       winy = ones(1,length(t));&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% sin wave&lt;br&gt;
y1 = sin(2*pi*10*t) .* winy;&lt;br&gt;
Y1 = fft(y1,NFFT)/L;&lt;br&gt;
Y1 = cplxf(Y1);&lt;br&gt;
&lt;br&gt;
loops = 0;&lt;br&gt;
while(loops &amp;lt; nloop);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phi = loops*pi/360;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y2 = sin(2*pi*10*t + phi) .* winy;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y2 = cplxf(Y2);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warning off MATLAB:divideByZero;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ratio = unwrap(angle(cplxfilt(Y2./Y1)));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warning on MATLAB:divideByZero;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(Fs*t,y1);     hold on;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(Fs*t,y2,'g'); hold off;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stem(ratio*180/pi);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axis([-200, length(ratio)+200, -180, 180]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text(500,100,...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;['degree shift: ',num2str(rem(phi*180/pi,360))]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loops = loops + 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pause(.01);&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
function ff = cplxf(f,threshold)&lt;br&gt;
&lt;br&gt;
error(nargchk(1,2,nargin));&lt;br&gt;
if nargin &amp;lt; 2, threshold = 1e-10; end&lt;br&gt;
&lt;br&gt;
% separate real and imaginary parts of input vector&lt;br&gt;
fr = real(f);&lt;br&gt;
fi = imag(f);&lt;br&gt;
&lt;br&gt;
% find indices of values less than threshold&lt;br&gt;
irz = find(abs(fr)&amp;lt;threshold);&lt;br&gt;
iiz = find(abs(fi)&amp;lt;threshold);&lt;br&gt;
&lt;br&gt;
% set "small" values to zero&lt;br&gt;
fr(irz) = 0;&lt;br&gt;
fi(iiz) = 0;&lt;br&gt;
&lt;br&gt;
% rebuild complex vector&lt;br&gt;
ff = fr + i*fi;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Thu, 22 May 2008 06:18:02 -0400</pubDate>
      <title>Re: ratio of fft's</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169624#433454</link>
      <author>Bruce </author>
      <description>Thanks guys! That was exactly what I was looking for. If&lt;br&gt;
anyone comes across this thread and wants more revised code&lt;br&gt;
(there were just a couple small errors with the previous&lt;br&gt;
post) my revised code is below. Thanks again!!&lt;br&gt;
&lt;br&gt;
clear all; clc; close all;&lt;br&gt;
&lt;br&gt;
Fs = 4000; % sampling frequency&lt;br&gt;
T = 1/Fs; % sample time&lt;br&gt;
L = 4000; % length of signal&lt;br&gt;
t = (0:L-1)*T; % time vector&lt;br&gt;
&lt;br&gt;
NFFT = L; % length of FFT&lt;br&gt;
nloop = 1000;&lt;br&gt;
% window function&lt;br&gt;
% if usewin, &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;winy = hamming(length(t),'periodic').';&lt;br&gt;
% else winy = ones(1,length(t));&lt;br&gt;
% end&lt;br&gt;
&lt;br&gt;
% sin wave&lt;br&gt;
y1 = sin(2*pi*10*t) .* winy;&lt;br&gt;
&lt;br&gt;
Y1 = fft(y1,NFFT)/L;&lt;br&gt;
Y1 = cplxfilt(Y1);&lt;br&gt;
&lt;br&gt;
loops = 0;&lt;br&gt;
while(loops &amp;lt; nloop);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phi = loops*pi/180;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y2 = sin(2*pi*10*t + phi) .* winy;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y2 = fft(y2,NFFT);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y2 = cplxfilt(Y2);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warning off MATLAB:divideByZero;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ratio = unwrap(angle(Y2./Y1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warning on MATLAB:divideByZero;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(Fs*t,y1); hold on;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(Fs*t,y2,'g'); hold off;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subplot(1,2,2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot(ratio*180/pi);  %stem(ratio*180/pi);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axis([-200, length(ratio)+200, -180, 180]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text(500,100,['degree shift:&lt;br&gt;
',num2str(rem(phi*180/pi,360))]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text(500,50,['ratio: ',num2str(ratio(10)*180/pi)]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loops = loops + 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pause(0.05);&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
function ff = cplxfilt(f)&lt;br&gt;
&lt;br&gt;
error(nargchk(1,2,nargin));&lt;br&gt;
if nargin &amp;lt; 2, threshold = 1e-10; end&lt;br&gt;
&lt;br&gt;
% separate real and imaginary parts of input vector&lt;br&gt;
fr = real(f);&lt;br&gt;
fi = imag(f);&lt;br&gt;
&lt;br&gt;
% find indices of values less than threshold&lt;br&gt;
irz = find(abs(fr)&amp;lt;threshold);&lt;br&gt;
iiz = find(abs(fi)&amp;lt;threshold);&lt;br&gt;
% set "small" values to zero&lt;br&gt;
fr(irz) = 0;&lt;br&gt;
fi(iiz) = 0;&lt;br&gt;
&lt;br&gt;
% rebuild complex vector&lt;br&gt;
ff = fr + i*fi;&lt;br&gt;
end&lt;br&gt;
</description>
    </item>
  </channel>
</rss>
