function RES=MFDFAScales(START,END,varargin)
% Розраховує масив шкал (ширинb вікон) для використання у методі MF-DFA
% Аргументи:
%   START    - початкова ширина вікна
%   END      - кінцева ширина вікна
%   varargin - змінна кількість аргументів
%              можливі варіанти
%                               'STEP' 'n' - кожна наступна ширина на n більша за попередню
%                               'RATIO' 'r' - кожна наступна ширина в r разів більша за попередню
%                               'nSTEP' 'n' - n ширин, розподілених рівномірно на [START,END]
%                               'nRATIO' 'n' - n ширин, розподілених логарифмічно на [START,END]
% Результат:
%   RES      - вектор-рядок ширин вікон
% Обмеження:
%   1) RES містить лише цілі значення, тому якщо попередня ширина рівна 5,
%      RATIO=1.01 - то наступна буде на 1 більша (6)
%   2) по замовчуванню - 'COUNTRATIO', '100'

% якщо передано менше 3 аргументів - записуємо значення за замовчуванням
if (nargin<3) kindOfElevate='nRATIO'; valueOfElevate=100;
% інакше, якщо існує varargin
else
    [m,n]=size(varargin);
    % якщо varargin має 1 елемент - записуємо значення за замовчуванням
    if (n<2) kindOfElevate='nRATIO'; valueOfElevate=100;
    % якщо varargin має більше 1 елемента - читаємо значення
    else kindOfElevate=varargin{1}; valueOfElevate=str2num(varargin{2});
    end
end

% якщо необхідно збільшувати ширину з певним кроком
if (CmpStr(kindOfElevate,'STEP')==0)
    RES=START; current=START+valueOfElevate; index=2;
    while (current<=END)
        RES(1,index)=current; index=index+1; current=current+valueOfElevate;
    end
% якщо необхідно збільшувати ширину для логарифмічного масштабу
elseif (CmpStr(kindOfElevate,'RATIO')==0)
    RES=START; index=2;
    current=floor(START*valueOfElevate);
    if (current==START) current=START+1; end
    while (current<=END)
        RES(1,index)=current; index=index+1; current=floor(current*valueOfElevate);
        if (current==RES(1,index-1)) current=current+1; end
    end
% при необхідності збільшувати ширину на крок, але мати певну кількість точок
elseif (CmpStr(kindOfElevate,'nSTEP')==0)
    RES=zeros(1,valueOfElevate);
    RES(1,1)=START; stepScale=floor((END-START)/valueOfElevate);
    current=START+stepScale; index=2;
    while (index<=valueOfElevate)
        RES(1,index)=current; index=index+1; current=current+stepScale;
    end
% при необхідності збільшувати ширину для логарифмічного масштабу та мати
% певну кількість точок
else
    k=(END/START)^(1/(valueOfElevate-1));
    RES=zeros(1,valueOfElevate);
    RES(1,1)=START; index=2;
    while (index<valueOfElevate)
        current=floor(RES(1,index-1)*k);
        if (current==RES(1,index-1)) RES(1,index)=RES(1,index-1)+1;
        else RES(1,index)=current;
        end
        k1=( END/RES(1,index) )^( 1/(valueOfElevate-index+1) );
        if (k1>k) k=k1; end
        index=index+1;
    end
    RES(1,index)=END;
end
% у змінній RES - вектор-рядок масштабів вікна

% очищуємо локальні змінні
clear kindOfElevate valueOfElevate m n current index stepScale k k1;