source: MML/trunk/at/atphysics/intfft.m @ 5

Last change on this file since 5 was 4, checked in by zhangj, 11 years ago

Initial import--MML version from SOLEIL@2013

File size: 1.4 KB
Line 
1function tune = intfft(X,varargin);
2%INTFFT - calculate the tune from interpolated FFT of the trajectory.
3% INTFFT(X) X must be a column vector.
4%  If X is a matrix - each column is treated as
5%  a separate trajectory
6% INTFFT(X,GUESS,DELTA) searches for peaks in the FFT spectrum
7%  only within the range (X-DELTA ... X+DELTA)
8%  The same values of GUESS and DELTA are used for all columns of X
9
10
11[N,L] = size(X);
12if L == 0;
13    tune = NaN;
14   
15    return
16end
17% apply hanning window
18%W = diag(sin(pi*(0:N-1)/(N-1)).^2);
19
20%XFFTABS = abs(fft(W*X));
21XFFTABS = abs(fft(X));
22%Z = zeros(size(XFFTABS));
23if nargin==3
24    GUESS = varargin{1};
25    DELTA = varargin{2};
26%     LR = floor(N*(GUESS-DELTA));
27%     UR = ceil(N*(GUESS+DELTA));
28%     Z(sub2ind(size(XFFTABS),LR,1:length(LR))) = 1;
29%     Z(sub2ind(size(XFFTABS),UR+1,1:length(UR)))= -1;
30   
31   
32    searchrange = floor(N*(GUESS-DELTA)):ceil(N*(GUESS+DELTA));
33   
34    %[psi_k,k] = max(cumsum(Z).*XFFTABS);
35    [psi_k,k] = max(XFFTABS(searchrange,:));
36    k=k+floor(N*(GUESS-DELTA))-1;
37   
38else
39    [psi_k,k] = max(XFFTABS(1:floor(N/2),:));
40end
41
42psi_k_plus  = XFFTABS((k+1)+(0:(L-1))*N);
43psi_k_minus = XFFTABS((k-1)+(0:(L-1))*N);
44
45G = psi_k_plus>psi_k_minus;
46
47k_r = k+G;
48k_l = k-~G;
49
50psi_l = XFFTABS(k_l+(0:(L-1))*N);
51psi_r = XFFTABS(k_r+(0:(L-1))*N);
52
53tune = (k_l-1)/N + atan( psi_r*sin(pi/N)./(psi_l + psi_r*cos(pi/N)))/pi;
Note: See TracBrowser for help on using the repository browser.