function [W] = createWeight(args)
% createWeight -
%
% Syntax: [in_data] = createWeight(in_data)
%
% Inputs:
%    - n  - Weight Order
%    - G0 - Low frequency Gain
%    - G1 - High frequency Gain
%    - Gc - Gain of W at frequency w0
%    - w0 - Frequency at which |W(j w0)| = Gc
%
% Outputs:
%    - W - Generated Weight

    arguments
        args.n  (1,1) double {mustBeInteger, mustBePositive} = 1
        args.G0 (1,1) double {mustBeNumeric, mustBePositive} = 0.1
        args.G1 (1,1) double {mustBeNumeric, mustBePositive} = 10
        args.Gc (1,1) double {mustBeNumeric, mustBePositive} = 1
        args.w0 (1,1) double {mustBeNumeric, mustBePositive} = 1
    end

  mustBeBetween(args.G0, args.Gc, args.G1);

  s = tf('s');

  W = (((1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.G1)^(2/args.n)))*s + (args.G0/args.Gc)^(1/args.n))/((1/args.G1)^(1/args.n)*(1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.G1)^(2/args.n)))*s + (1/args.Gc)^(1/args.n)))^args.n;

  end

  % Custom validation function
  function mustBeBetween(a,b,c)
      if ~((a > b && b > c) || (c > b && b > a))
          eid = 'createWeight:inputError';
          msg = 'Gc should be between G0 and G1.';
          throwAsCaller(MException(eid,msg))
      end
  end
