How do I use a for-loop to do fft and plot the power?
    5 次查看(过去 30 天)
  
       显示 更早的评论
    
Hello,
I have a data set (time and variable Be) and I want to do a fft on one part of the data at a time (1000 years). To do this, I would like to use a for-loop that plots the power of the period for each of the different ffts. How do I do this? I'm new to Matlab but I have tried the code below:
hold on 
for ts=(0:1000:5000)';             % I have data between 0 and 5000 years ago. 
    A=fft(Be);                     % Do FFT on the Be data.
    A(1)=[];
    n=length(A);                     
    power=abs(A(1:floor(n/2))).^2;
    nyquist=1/2;
    freq=(1:n/2)/(n/2)*nyquist;
    period=1./freq;
    plot(period,power);
end
When I do this, I get only one plot. What am I doing wrong?
Thanks!
0 个评论
采纳的回答
  Thorsten
      
      
 2014-12-17
        
      编辑:Thorsten
      
      
 2014-12-17
  
      May be that's because they are the same? I get different curves using random input.
BTW: note that n is always 1000 in your case, so you can compute "period" outside the loop; further, as you have an offset of 350 now, a could start from 0; just be(0) is wrong syntax in Matlab because matrix indices start with 1.
figure; 
be_i_dt = rand(1, 20000);
hAxes = gca;
hold( hAxes, 'on' )
offset = 305;
n = 1000;
n=length(A);                     
nyquist=1/2;
freq=(1:n/2)/(n/2)*nyquist;
period=1./freq;
for a = 1:9
    A = fft(be_i_dt(offset+a*n:offset+(a+1)*n));                 
    A(1)=[];
    power=abs(A(1:floor(n/2))).^2;
    plot(hAxes,period,power)
end
3 个评论
  Thorsten
      
      
 2014-12-17
				Yes, you probably have to few data points. The last value
 offset+(a+1)*n
for the highest a (9 in your case) in your for loop must always be lower or equal to
numel(be_i_dt)
更多回答(2 个)
  David Young
      
 2014-12-16
        
      编辑:David Young
      
 2014-12-16
  
      The variable Be is not changed between iterations, so A will also be the same each time, so each plot will be the same as the previous one. If Be is a vector with all 5000 data points, then you could replace the first line in the loop with
A = fft(Be(ts+1:ts+999));
to select 1000 data points starting from ts.
4 个评论
  Sudharsana Iyengar
      
 2014-12-17
        HI,
Try this and let me know.
     for a= 0:4
    A=fft(Be(a*1000:(a+1)*1000));                 
    A(1)=[];
    n=length(A);                     
    power=abs(A(1:floor(n/2))).^2;
    nyquist=1/2;
    freq=(1:n/2)/(n/2)*nyquist;
    period=1./freq;
    figure()
    plot(period,power)
    end
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Spectral Analysis 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




