function [RESX,RESY]=MultiDFAe(ARG,widthBegin,widthEnd,power,step,ratio);
% Модификация метода DFA по статье "Multifractal DFA"
% Построение массивов по методу DFA
% Вход  : ARG - матрица значений для построения DFA (вектор)
%         stepBegin - начальная ширина окна
%         stepEnd   - конечная ширина окна
%         power     - степень, для которой рассчитывать DFA
%         step      - шаг увеличения окна
%         ratio     - коэффициент увеличения окна; если не задан - используется шаг
% Выход : RESX - значения ширины окна
%         RESY - коэффициенты функции для таких значений

% Определяем количество значений в векторе
[m,n]=size(ARG);
% Ищем среднее по всему множеству
AVG=sum(ARG)/n;
% Создаем вектор (множество) накоплений (ШАГ 1)
% Первый элемент - разность между первым исходным и средним
ARG2(1,1)=ARG(1,1)-AVG(1,1);
for j=2:n
    % Каждый следующий - разность между исходным и средним + значение предыдущего накопления
    ARG2(1,j)=ARG2(1,j-1)+(ARG(1,j)-AVG(1,1));
end

% Переменная, используемая в цикле для записи значений для разной ширины окна
globalIndex=1;

% Берем окно начальной ширины
width=widthBegin;
% Пробегаем по окнам всевозможной ширины (ШАГ 2 + ШАГ 3)
while (width<=widthEnd)
    % Обнуляем массив флуктуаций
    F=0;
    % Начальное значение индекса окон
    indexWindow=0;
    % Устанавливаем диапазон индексов элементов для первого окна
    index=1;
    indexEnd=index+width-1;
    % Проходим поочереди по всем окнам
    while indexEnd<=n
        % Переходим к следующему окну
        indexWindow=indexWindow+1;
        % Устанавливаем начальное значение флуктуаций для данного окна
        F(indexWindow)=0;
        % Находим линейный тренд в окне
        [a,b]=MinSquare([index:indexEnd],ARG2(1,index:indexEnd));
        % Для всех элементов окна
        for j=index:indexEnd
            % Удаляем трендовое значение
            T=ARG2(1,j)-(a*j+b);
            % Прибавляем полученное значение к значению функции флуктуации
            F(indexWindow)=F(indexWindow)+T*T;
        end
        % После нахождения всей суммы элементов окна
        % Получаем среднее значение флуктуаций
        F(indexWindow)=F(indexWindow)/width;
        % Перемещаемся к следующему окну
        index=indexEnd+1;
        indexEnd=index+width-1;
    end
    flag=0;
    % Если после прохождения всех окон остались элементы - начинаем с конца массива
    if indexEnd>n
        % Устанавливаем диапазон индексов для первого (с конца) окна
        index=n-width+1;
        indexEnd=n;
        % Получается в 2 раза больше окон
        flag=1;
        % Пока не прошли по всем окнам в обратном порядке
        while index>1
            % Переходим к следующему окну
            indexWindow=indexWindow+1;
            % Устанавливаем начальное значение флуктуаций для данного окна
            F(indexWindow)=0;            
            % Находим линейный тренд в окне
            [a,b]=MinSquare([index:indexEnd],ARG2(1,index:indexEnd));
            % Для всех элементов окна
            for j=index:indexEnd
                % Удаляем трендовое значение
                T=ARG2(1,j)-(a*j+b);
                % Прибавляем полученное значение к значению функции флуктуации
                F(indexWindow)=F(indexWindow)+T*T;
            end
            % После нахождения всей суммы элементов окна
            % Получаем среднее значение флуктуаций
            F(indexWindow)=F(indexWindow)/width;
            % Перемещаемся к следующему окну
            indexEnd=index-1;
            index=index-width+1;
        end
    end
    % Записываем ширину обрабатываемого окна
    RESX(1,globalIndex)=width;
    % Рассчитываем окончательное значение усредненной флуктуации
    if flag==1
        RESY(1,globalIndex)=(sum(F.^(power/2))/indexWindow/2)^(1/power);
    else
        RESY(1,globalIndex)=(sum(F.^(power/2))/indexWindow)^(1/power);
    end;
    % Переходим к окну следующей ширины
    globalIndex=globalIndex+1;
    if nargin==6
        iNew=fix(width*ratio);
        if width==iNew
            width=width+1;
        else
            width=iNew;
        end
    else
        width=width+step;
    end
end