www.pudn.com > ofdm_matlab.rar > subsamp.m


function Y=subsamp(X,N,ph,avg) 
%SUBSAMP Subsamples the input X by an amount N, using averaging 
%	 Y=subsamp(X,N) 
%	 The samples are subsampled as rows. Thus if X is a matrix 
%	 each row is subsampled. 
%	 If the length of X is not a multiple of N samples then remaining 
%	 samples are ignored. 
% 
%	 Y=subsamp(X,N,ph) 
%	 ph = 0 : This takes the standard averaging of the data when 
%	 	  subsampling the signal. 
%	 ph = 1 : This averages data assuming that it is phase data. This 
%	 	  compensates for phase wrap around. 
% 
%	 Y=subsamp(X,N,ph,avg) 
%	 avg = 0 : This uses standard averaging to calculate the mean data. 
%	 avg = 1 : This uses the stdmean function to do a weighted average 
%		   instead. 
%	 See : ZEROHOLD, STDMEAN 
% 
%	 Copyright (c) July 1997 Eric Lawrey 
 
%Modified: 
%	10/7/97	Started function. This function is finished and tested. 
%	6/8/97	Added the option to use the stdmean function instead of the 
%		standard averaging. Early tests have shown that it does 
%		not improve the performance of the COFDM system. 
 
%	External Functions: 
%	stdmean.m 
 
	X=X(:,1:floor(size(X,2)/N)*N); 
if (size(X,2) > 1)&(N>1), 
 
	if nargin < 4, 
		avg = 0;	%If avg not given set the default 
	elseif nargin < 3, 
		ph = 0;		%Set to the default if no given 
		avg = 0;	%i.e use standard averaging using the mean 
	end 
	if ph == 0, 
		Y = zeros(size(X,1),size(X,2)/N); 
		for k = 1:size(X,1), 
			if avg ==0, 
				Y(k,:)=mean(reshape(X(k,:),N,size(X,2)/N)); 
			else 
				Y(k,:)=stdmean(reshape(X(k,:),N,size(X,2)/N)); 
			end 
		end 
	else 
		Y = zeros(size(X,1),size(X,2)/N); 
		for k = 1:size(X,1), 
%		Y(k,:)=mean(reshape(X(k,:),N,size(X,2)/N)); 
			ang = (reshape(X(k,:),N,size(X,2)/N)*2*pi/360).'; 
			mag = ones(size(ang)); 
			[x,y] = pol2cart(ang,mag); 
			if avg == 0, 
				AvX = mean(x')'; 
				AvY = mean(y')'; 
			else 
				AvX = stdmean(x',(-2))'; 
				AvY = stdmean(y',(-2))'; 
			end 
			[ang,mag] = cart2pol(AvX,AvY); 
			Y(k,:) = (ang.') * 360/(2*pi); 
		end 
	end 
 
else 
		Y=X; 
end