⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdpei.m

📁 分数傅立叶变换的源代码
💻 M
字号:
function Fa=DFPei(f,a)

% Compute discrete fractional Fourier transform
% of order a of vector f according to Pei/Yeh/Tseng

N=length(f); f=f(:);
shft = rem((0:N-1)+fix(N/2),N)+1;

global hn_saved p_saved
if (nargin==2), p = 2; end;
p = min(max(2,p),N-1);

if (length(hn_saved) ~= N | p_saved ~= p),
    hn = make_hn(N,p);
    hn_saved = hn; p_saved = p;
else
    hn = hn_saved;
end;
Fa(shft,1)=hn*(exp(-j*pi/2*a*[0:N-1]).'.*(hn'*f(shft)));

function hn = make_hn(N,p)
even = rem(N,2)==0;
shft = rem((0:N-1)+fix(N/2),N)+1;
% Gauss-Hermite samples
u = (-N/2:(N/2)-1)'/sqrt(N/2/pi);
ex = exp(-u.^2/2); 
hn(:,1) = ex; r = norm(hn(:,1)); hn(:,1) = hn(:,1)/r;
hn(:,2)=2*u.*ex; s = norm(hn(:,2)); hn(:,2) = hn(:,2)/s;
r = s/r;
for k = 3:N+1
     hn(:,k)=2*r*u.*hn(:,k-1)-2*(k-2)*hn(:,k-2);
     s = norm(hn(:,k)); hn(:,k) = hn(:,k)/s;
     r=s/r;
end
if (even), hn(:,N)=[]; else, hn(:,N+1)=[]; end
hn(shft,:) = hn;

% eigenvectors of DFT matrix
E = make_E(N,N/2);

for k = 1:4
 if even % N even
  switch k
   case {1,3}
    indx = k:4:N+1;
    if (rem(N,4) ~= 0 && k==3) || (rem(N,4) == 0 && k==1),
        indx(end) = indx(end)-1;
    end
   case {2,4}
    indx = k:4:N-1;
   end
 else % N odd
   indx = k:4:N;
 end
 hn(:,k:4:N) = orth(E(:,indx)*E(:,indx)'*hn(:,indx));
end

function E = make_E(N,p)
%Returns sorted eigenvectors and eigenvalues of corresponding vectors

%Construct matrix H, use approx order ord

d2 = [1 -2 1]; d_p = 1; s = 0; st = zeros(1,N);
for k = 1:p/2,
    d_p = conv(d2,d_p);
    st([N-k+1:N,1:k+1]) = d_p; st(1) = 0;
    s = s + (-1)^(k-1)*prod(1:(k-1))^2/prod(1:2*k)*2*st;        
end;
% H = circulant + diagonal
col = (0:N-1)'; row = (N:-1:1);
idx = col(:,ones(N,1)) + row(ones(N,1),:);
st = [s(N:-1:2).';s(:)];
H = st(idx)+diag(real(fft(s)));

%Construct transformation matrix V

r = floor(N/2);
even = ~rem(N,2);
V1 = (eye(N-1)+flipud(eye(N-1)))/sqrt(2);
V1(N-r:end,N-r:end) = -V1(N-r:end,N-r:end);
if (even), V1(r,r)=1; end
V = eye(N); V(2:N,2:N) = V1;

% Compute eigenvectors

VHV = V*H*V';
E = zeros(N);
Ev = VHV(1:r+1,1:r+1);           Od = VHV(r+2:N,r+2:N);
[ve,ee]=eig(Ev);                 [vo,eo]=eig(Od); 
%malab eig returns sorted eigenvalues
%if different routine gives unsorted eigvals, then sort first
%[d,inde] = sort(diag(ee));      [d,indo] = sort(diag(eo));
%ve = ve(:,inde');               vo = vo(:,indo');
E(1:r+1,1:r+1) = fliplr(ve);     E(r+2:N,r+2:N) = fliplr(vo);
E = V*E;
%shuffle eigenvectors
ind = [1:r+1;r+2:2*r+2]; ind = ind(:);
if (even), ind([N,N+2])=[]; else ind(N+1)=[]; end
E = E(:,ind');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -