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

📄 dgt2.m

📁 Matlab时频分析工具箱,希望能对大家有所帮助啊
💻 M
字号:
function [c,Ls]=dgt2(f,g1,p3,p4,p5,p6)%DGT2  2-D Discrete Gabor transform.%   Usage: c=dgt2(f,g,a,M);%          c=dgt2(f,g1,g2,[a1,a2],[M1,M2]);%          c=dgt2(f,g1,g2,[a1,a2],[M1,M2],[L1,L2]);%          [c,Ls]=dgt2(f,g1,g2,[a1,a2],[M1,M2]);%          [c,Ls]=dgt2(f,g1,g2,[a1,a2],[M1,M2],[L1,L2]);%%   Input parameters:%         f       : Input data, matrix.%         g,g1,g2 : Window functions.%         a,a1,a2 : Length of time shifts.%         M,M1,M2 : Number of modulations.%         L1,L2   : Length of transform to do %   Output parameters:%         c       : array of coefficients.%         Ls       : Original size of input matrix.%%   DGT2(f,g,a,M) will calculate a separable two dimensional discrete%   Gabor transformation of the input signal f with respect to the window%   g and parameters a and M.%%   For each dimension, the length of the transform will be the smallest%   possible that is larger than the length of the signal along that dimension.%   f will be appropriately zero-extended.%%   DGT2(f,g,a,M,L) computes a Gabor transform as above, but does%   a transform of length L along each dimension. f will be cut or%   zero-extended to length L before the transform is done.%%   [c,Ls]=DGT2(f,g,a,M) or [c,Ls]=DGT2(f,g,a,M,L) additionally returns%   the length of the input signal f. This is handy for reconstruction:% %                [c,Ls]=dgt2(f,g,a,M);%                fr=idgt2(c,gd,a,Ls);% %   will reconstruct the signal f no matter what the size of f is, provided%   that gd is a dual window of g. %%   DGT2(f,g1,g2,a,M) makes it possible to use a different window along the%   two dimensions. %%   The parameters a, M, L and Ls can also be vectors of length 2.%   In this case the first element will be used for the first dimension%   and the second element will be used for the second dimension. For perfect%   reconstruction, %%   The output c will be have 4 or 5 dimensions. The dimensions index the%   following properties:%      1 - Number of translation along 1st dimension of input.%      2 - Number of channel along 1st dimension  of input%      3 - Number of translation along 2nd dimension of input.%      4 - Number of channel along 2nd dimension  of input%      5 - Plane number, corresponds to 3rd dimension of input. % %   SEE ALSO:  DGT, IDGT2, CANDUAL% 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/>.error(nargchk(4,6,nargin));L=[];% Refuse to do nd-arrays.%if ndims(f)>2%  error('DGT2 does not work for nd-arrays.');%end;if prod(size(p3))>2  % Two windows was specified.  g2=p3;  a=p4;  M=p5;  if nargin==6    L=p6;  end;else  g2=g1;  a=p3;  M=p4;  if nargin==5    L=p5;  end;end;  if size(g1,2)>1  if size(g1,1)>1    error('g1 must be a vector');  else    % g1 was a row vector.    g1=g1(:);  end;end;if size(g2,2)>1  if size(g2,1)>1    error('g2 must be a vector');  else    % g2 was a row vector.    g2=g2(:);  end;end;if prod(size(a))>2 || prod(size(a))==0  error('a must be a scalar or 1x2 vector');end;if prod(size(M))>2 || prod(size(M))==0  error('M must be a scalar or 1x2 vector');end;if length(a)==2  a1=a(1);  a2=a(2);else  a1=a;  a2=a;end;if length(M)==2  M1=M(1);  M2=M(2);else  M1=M;  M2=M;end;assert_squarelat(a1,M1,1,'DGT2');assert_squarelat(a2,M2,1,'DGT2');Lwindow1=size(g1,1);Lwindow2=size(g2,1);Ls(1)=size(f,1);Ls(2)=size(f,2);W=size(f,3);if ndims(f)<2 || ndims(f)>3  error('f must be 2 or 3 dimensional.');end;if ~isempty(L) && (numel(L)>2 || numel(L)==0)  error('L must be a scalar or 1x2 vector');end;if length(L)==2  L1=L(1);  L2=L(2);else  L1=L;  L2=L;end;[b1,N1,L1]=assert_L(Ls(1),Lwindow1,L1,a1,M1,'DGT2');[b2,N2,L2]=assert_L(Ls(2),Lwindow2,L2,a2,M2,'DGT2');% --- Do transform along first dimension ---% Change f to correct shape.[f,fl,Wtemp,wasrow,remembershape]=comp_sigreshape_pre(f,'DWILT2',3);% Zero-extend if neccesary.f=postpad(f,L1);c=comp_dgt(f,g1,a1,M1,L1);% Combine dimensions again.c=reshape(c,M1*N1,Ls(2),W);% Exchange first and second dimension.c=permute(c,[2,1,3]);% --- do transform along second dimension ---% Change f to correct shape.[c,cl,Wtemp,wasrow,remembershape]=comp_sigreshape_pre(c,'DWILT2',3);% Zero-extend if neccesary.c=postpad(c,L2);c=comp_dgt(c,g2,a2,M2,L2);c=comp_sigreshape_post(c,M2*N2,wasrow,remembershape);% Combine dimensions again.c=reshape(c,M2*N2,M1*N1,W);% Exchange first and second dimension.c=permute(c,[2,1,3]);% Reshape to final layout.c=reshape(c,M1,N1,M2,N2,W);

⌨️ 快捷键说明

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