www.pudn.com > mimo-code.rar > makepulse.m, change:2003-06-09,size:5929b


function pulse = makepulse(varargin)

%MAKEPULSE Modulation impulse design.
%   H = MAKEPULSE('PropertyName',PropertyValue,...) returns the impulse
%   response of desired modulation impulse. All the impulses are
%   designed to have a unit energy.
%
%   Makepulse Property List
%
%   Shortening     value
%   SymbolTime     value
%   SymbolSamples	 value
%   Shape          {'rrc'} | 'rect'
%   RollOff        0  value  1
%   Echo           'on' | {'off'}
%
%   NOTE: If Shortening = 8 than MAKEPULSE makes the impulse of total
%         length equal to 8 * Samples + 1. One sample is added to
%         ensure symbol symetry and correct sampling. 
%
%   See also MODUL.

%   Copyright 2001-2003 Kamil Anis, anisk@feld.cvut.cz
%   Dept. of Radioelectronics, 
%   Faculty of Electrical Engineering
%   Czech Technical University in Prague
%   $Revision: 2.2 $  $Date: 2003/3/20 11:55:28 $
%   --
%   <additional stuff goes here>

global ECHO SYMB_SAMPLES SYMB_TIME

name = 'MAKEPULSE';
[idt,tag] = iecho(name);

nopts = length(varargin) / 2;
opts = reshape(varargin,[2 nopts])';

ord1 = strmatch('Echo',opts(:,1));
ord2 = strmatch('Shortening',opts(:,1));
ord3 = strmatch('SymbolTime',opts(:,1));
ord4 = strmatch('SymbolSamples',opts(:,1));
ord5 = strmatch('Shape',opts(:,1));
ord6 = strmatch('RollOff',opts(:,1));

% Echo
if ~isempty(ord1) % first check whether local option exists
	value1 = opts{ord1,2};
	switch value1
	case 'on'
		ech = 1;
	case 'off'
		ech = 0;
	otherwise
		disp(' ');
		disp([tag,'Invalid option for Echo property.']);
		disp([idt,'Possible values are ''on''|{''off''}.']);
		disp(' ');
		ech = 0;
	end
else
	if ~isempty(ECHO) % than check whether global option exists
		switch ECHO
		case 'on'
			ech = 1;
		case 'off'
			ech = 0;
		otherwise
			disp(' ');
			disp([tag,'Invalid option for Echo property.']);
			disp([idt,'Possible values are ''on''|{''off''}.']);
			disp(' ');
			ech = 0;
		end
	else % if there are no settings use the defaults
		ech = 0; % default value
	end
end

% Shortening
if isempty(ord2) % there's no such option
	cutoff = 8; % default value
else % there's relevant option
	cutoff = opts{ord2,2};
end

% SymbolTime
if ~isempty(ord3) % first check whether local option exists
	time = opts{ord3,2};
else
	if ~isempty(SYMB_TIME) % than check whether global option exists
		time = SYMB_TIME;
	else % if there are no settings use the defaults
		time = 0.0001; % default value
	end
end

% SymbolSamples
if ~isempty(ord4) % first check whether local option exists
	samples = opts{ord4,2};
else
	if ~isempty(SYMB_SAMPLES) % than check whether global option exists
		samples = SYMB_SAMPLES;
	else % if there are no settings use the defaults
		samples = 4; % default value
	end
end

% Shape
if isempty(ord5) % there's no such option
	shape = 'rrc'; % default value
else % there's relevant option
	shape = opts{ord5,2};
end

% RollOff
if isempty(ord6) % there's no such option
	rolloff = 0.4; % default value
else % there's relevant option
	rolloff = opts{ord6,2};
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BODY BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

switch shape
case 'rect'
  pulse = linspace(1 / sqrt(cutoff * time),...
      1 / sqrt(cutoff * time),samples * cutoff);
    
case 'rrc'
	singul = time / (4 * rolloff);
	tt = linspace(-cutoff * time / 2,...
          cutoff * time / 2,samples * cutoff + 1);
	
	z = find(tt == 0);
	k = find(abs(tt) == singul);
	
	% Checking for singularities...
  if (isempty(z) == 0) & (isempty(k) == 0) % zero & non-zero singularity
      n = [find(tt  -singul),find((tt > -singul) & (tt  0)),...
        find((tt > 0) & (tt  singul)),find(tt > singul)];
      t = tt(n);
          
      pulse(n) = (1 ./ (sqrt(time) .* (1 - (4. * rolloff ./...
        time) .^ 2 .* t .^2))) .* ((sin((1 - rolloff) .* pi .* t ./...
        time) ./ (pi .* t ./ time)) + (4 .* rolloff .*...
        cos((1 + rolloff) .* pi .* t ./ time) ./ pi));

			pulse(z) = (1 / sqrt(time)) * (1 - rolloff + 4 * rolloff / pi);	
			
			pulse(k) = rolloff * ((-2 + pi) * cos(pi / (4 * rolloff)) +...
        (2 + pi) * sin(pi / (4 * rolloff))) / (pi * sqrt(2) *...
        sqrt(time));
  
  elseif (isempty(k) == 0) % non-zero singularity
		n = [find(tt  -singul),find(abs(tt)  singul),find(tt > singul)];
		t = tt(n);
            
		pulse(n) = (1 ./ (sqrt(time) .* (1 - (4 .* rolloff ./...
      time) .^ 2 .* t .^ 2))) .* ((sin((1 - rolloff) .* pi .* t ./...
      time) ./ (pi .* t ./ time)) + (4 .* rolloff .*...
      cos((1 + rolloff) .* pi .* t ./ time) ./ pi));
		
		pulse(k) = rolloff * ((-2 + pi) * cos(pi / (4 * rolloff)) + (2 + pi) *...
      sin(pi / (4 * rolloff))) / (pi * sqrt(2) * sqrt(time));
      
	elseif isempty(z) == 0 % zero singularity
		n = [find(tt  0),find(tt > 0)];
    t = tt(n);
          
		pulse(n) = (1 ./ (sqrt(time) .* (1 - (4 .* rolloff ./...
      time) .^ 2 .* t .^ 2))) .* ((sin((1 - rolloff) .* pi .* t ./...
      time) ./ (pi .* t ./ time)) + (4 .* rolloff .*...
      cos((1 + rolloff) .* pi .* t ./ time) ./ pi));
		
		pulse(z)=(1 / sqrt(time)) * (1 - rolloff + 4 * rolloff / pi);
          
  else % no singularity found
    t = tt;
   
    pulse = (1 ./ (sqrt(time) .* (1 - (4 .* rolloff ./...
      time) .^ 2 .* t .^ 2))) .* ((sin((1 - rolloff) .* pi .* t ./...
      time) ./ (pi .* t ./ time)) + (4 .* rolloff .*...
      cos((1 + rolloff) .* pi .* t ./ time) ./ pi));
	end 
end 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BODY END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if ech	
	str1 = num2str(length(pulse));
	str2 = num2str(rolloff);
	
	disp(' ');
	disp([tag,str1,' samples of ',shape,...
		' impulse generated; roll-off -> ',str2,'.']);
	disp(' ');
end