comp_dgt_fb.m
来自「Matlab时频分析工具箱,希望能对大家有所帮助啊」· M 代码 · 共 133 行
M
133 行
function [coef]=comp_dgt_fb(f,g,a,M,boundary)%COMP_DGT_FB Filter bank DGT% Usage: c=comp_dgt_fb(f,g,a,M,boundary);% % This is a computational routine. Do not call it directly.%% The value of boundary can take the following values:%% 0 - Periodic boundary conditions, this is the default.% 1 - Even boundary conditions.% 2 - Zero boundary conditions.% % This program is free software: you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation, either version 3 of the License, or% (at your option) any later version.% % This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% GNU General Public License for more details.% % You should have received a copy of the GNU General Public License% along with this program. If not, see <http://www.gnu.org/licenses/>.% See help on DGT.% Author : Peter Soendergaard.% 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% 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 switch(boundary) case 0 % Periodic boundary condition. fpart=[f(L-(glh-n*a)+1:L,:);... f(1:gl-(glh-n*a),:)]; case 1 % Even boundary condition. case 2 % Zero boundary condition. fpart=[zeros(glh-n*a,W);... f(1:gl-(glh-n*a),:)]; end; 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 switch(boundary) case 0 % 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 case 1 % Even boundary condition. case 2 % Zero boundary condition. fpart=[f((n*a-glh)+1:L,:);... % L-n*a+glh elements zeros(gl-L+n*a-glh,W)]; % gl-L+n*a-glh elements end; 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=fft(coef);% 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?