% circonvs2.m
% usage: Y = circconvs2(X,hpp,hpn,hnp,hnn)
% sparse 2D circular convolution
% by a causal anti-causal filter pair
% Performs 2D circular convolution by h on X,
% the result has the same size as X.
% It is assumed that both the row dimension
% and column dimension % of h do not exceed those of X.
% The result is the same as circular convolution by
% h = [hpp,0,...,0,hpn,
% 0,...,0,
% hnp,0...,0,hnn] zero-padded out to the size of X
% S. Allen Broughton - 28 Oct 10
function Y=circconvs2(X,hpp,hpn,hnp,hnn)
[m,n] = size(X);
[u,v] = size(hnn);
Ypp = circconv2(X,hpp);
Ypn = circconv2(X,hpn); Ypn = [Ypn(:,(v+1):n),Ypn(:,1:v)];
Ynp = circconv2(X,hnp); Ynp = [Ynp((u+1):m,:);Ynp(1:u,:)];
Ynn = circconv2(X,hnn); Ynn = [Ynn(:,(v+1):n),Ynn(:,1:v)]; Ynn = [Ynn((u+1):m,:);Ynn(1:u,:)];
Y = Ypp+Ypn+Ynp+Ynn;