[291105]: comp / comp_dgtreal_fb.m Maximize Restore History

Download this file

comp_dgtreal_fb.m    99 lines (66 with data), 2.2 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
function [coef]=comp_dgtreal_fb(f,g,a,M)
%COMP_DGTREAL_FB Filter bank DGT
% Usage: c=comp_dgt_fb(f,g,a,M,boundary);
%
% This is a computational routine. Do not call it directly.
% See help on DGT.
% AUTHOR : Peter L. Søndergaard.
% Calculate the parameters that was not specified.
L=size(f,1);
N=L/a;
gl=length(g);
W=size(f,2); % Number of columns to apply the transform to.
glh=floor(gl/2); % gl-half
M2=floor(M/2)+1;
% Conjugate the window here.
g=conj(fftshift(g));
coef=zeros(M,N,W);
% Replicate g when multiple columns should be transformed.
gw=repmat(g,1,W);
% ----- Handle the first boundary using periodic boundary conditions. ---
for n=0:ceil(glh/a)-1
% Periodic boundary condition.
fpart=[f(L-(glh-n*a)+1:L,:);...
f(1:gl-(glh-n*a),:)];
fg=fpart.*gw;
% Do the sum (decimation in frequency, Poisson summation)
coef(:,n+1,:)=sum(reshape(fg,M,gl/M,W),2);
end;
% ----- Handle the middle case. ---------------------
for n=ceil(glh/a):floor((L-ceil(gl/2))/a)
fg=f(n*a-glh+1:n*a-glh+gl,:).*gw;
% Do the sum (decimation in frequency, Poisson summation)
coef(:,n+1,:)=sum(reshape(fg,M,gl/M,W),2);
end;
% ----- Handle the last boundary using periodic boundary conditions. ---
for n=floor((L-ceil(gl/2))/a)+1:N-1
% Periodic boundary condition.
fpart=[f((n*a-glh)+1:L,:);... % L-n*a+glh elements
f(1:n*a-glh+gl-L,:)]; % gl-L+n*a-glh elements
fg=fpart.*gw;
% Do the sum (decimation in frequency, Poisson summation)
coef(:,n+1,:)=sum(reshape(fg,M,gl/M,W),2);
end;
% --- Shift back again to make it a frequency-invariant system. ---
for n=0:N-1
coef(:,n+1,:)=circshift(coef(:,n+1,:),n*a-glh);
end;
coef=fftreal(coef);
coef=reshape(coef,M2,N,W);
%c=c(1:M2,:);
% Simple code using a lot of circshifts.
% Move f initially so it lines up with the initial fftshift of the
% window
%f=circshift(f,glh);
%for n=0:N-1
% Do the inner product.
%fg=circshift(f,-n*a)(1:gl,:).*gw;
% Periodize it.
%fpp=zeros(M,W);
%for ii=0:gl/M-1
% fpp=fpp+fg(ii*M+1:(ii+1)*M,:);
%end;
% fpp=sum(reshape(fg,M,gl/M,W),2);
% Shift back again.
% coef(:,n+1,:)=circshift(fpp,n*a-glh); %),M,1,W);
%end;