Main Content

이동평균 System Object 만들기

이 예제에서는 이동평균 필터를 구현하는 System Object™를 만드는 방법을 보여줍니다.

소개

System Object는 matlab.System에서 파생되는 MATLAB 클래스입니다. 결과적으로, 모든 System Object는 다음과 같은 표준 메서드를 포함하는 공통된 퍼블릭 인터페이스를 상속합니다.

  • setup — 일반적으로 시뮬레이션을 시작할 때 객체를 초기화함

  • reset — 객체의 내부 상태를 지워 디폴트 초기화-후 상태로 되돌림

  • release — 객체에서 내부적으로 사용되는 모든 리소스(메모리, 하드웨어 또는 OS별 리소스)를 해제함

새로운 종류의 System Object를 만들 때는 동작을 결정하기 위해 위에 있는 모든 메서드에 대한 특정한 구현을 제공해야 합니다.

이 예제에서는 movingAverageFilter System Object를 만들고 사용해 보겠습니다. movingAverageFilter는 앞에서 사용한 WindowLength 입력 샘플의 비가중 평균을 계산하는 System Object입니다. WindowLength는 이동평균 윈도우의 길이입니다. movingAverageFilter는 단정밀도 및 배정밀도 2차원 입력 행렬을 받습니다. 입력 행렬의 각 열은 독립적인 (1차원) 채널로 처리됩니다. 입력값의 첫 번째 차원은 채널의 길이(또는 입력 프레임 크기)를 정의합니다. movingAverageFilter는 시간에 따른 각 입력 채널의 이동평균을 독립적으로 계산합니다.

System Object 파일 만들기

MATLAB 탭에서 새로 만들기 > System Object > 기본을 선택하여 새 System Object 클래스를 만듭니다. MATLAB 편집기에 System Object의 기본 템플릿이 열려 movingAverageFilter System Object를 만드는 동안 과정을 안내해 줍니다.

movingAverageFilter 클래스의 이름을 바꾸고 파일을 movingAverageFilter.m으로 저장합니다. System Object를 사용하려면 MATLAB 경로에 있는 폴더에 System Object를 저장해야 합니다.

편의를 위해 이 예제에서는 완전한 movingAverageFilter System Object 파일이 함께 제공됩니다. 완전한 클래스를 열려면 다음을 입력하십시오.

edit movingAverageFilter.m

속성 추가하기

이 System Object에는 4개의 속성이 필요합니다. 첫째, 퍼블릭 속성 WindowLength를 추가해 이동평균 윈도우의 길이를 제어합니다. 데이터 처리가 시작된 후 알고리즘이 이 상수 값에 의존하므로 이 속성은 조정 불가형으로 정의합니다. 또한 이 속성은 양의 실수형 정수만 받습니다. 입력값이 이러한 조건을 충족하도록 하려면 속성 유효성 검사기를 추가하십시오(속성값 유효성 검사 참조). 이 속성의 디폴트 값을 5로 설정합니다.

properties(Nontunable)
    WindowLength (1,1){mustBeInteger,mustBePositive} = 5
end

둘째, StatepNumChannels라는 두 속성을 추가합니다. 사용자는 둘 중 어떠한 속성에도 액세스하면 안 되므로, Access = private 특성을 사용해야 합니다. State는 이동평균 필터의 상태를 저장합니다. pNumChannels는 입력값의 채널 개수를 저장합니다. 이 속성의 값은 입력값의 열 개수에서 결정됩니다.

properties(Access = private)
    State;
    pNumChannels = -1;
end

마지막으로, FIR 분자 계수를 저장하기 위한 속성이 필요합니다. pCoefficients라는 속성을 추가합니다. 데이터 처리 중에 계수가 바뀌지 않고 System Object의 사용자가 계수에 액세스하기를 원하지 않으므로, 속성 특성을 Nontunable, Access = private으로 설정하십시오.

properties(Access = private, Nontunable)
    pCoefficients
end

간편한 생성을 위해 생성자 추가하기

System Object 생성자는 클래스(이 예제에서는 movingAverageFilter)와 동일한 이름을 갖는 메서드입니다. setProperties 메서드를 사용하여 System Object에 대한 이름-값 쌍 입력값을 허용하도록 System Object 생성자를 구현합니다. 예를 들어, 사용자는 이 생성자에서 다음 구문을 사용하여 System Object의 인스턴스 filter = movingAverageFilter('WindowLength',10)을 만들 수 있습니다. 이외의 용도로는 이 생성자를 사용하지 마십시오. 다른 모든 설정 작업은 setupImpl 메서드에 작성해야 합니다.

methods
    function obj = movingAverageFilter(varargin)
        % Support name-value pair arguments when constructing object
        setProperties(obj,nargin,varargin{:})
    end
end

setupImpl에서 설정하고 초기화하기

setupImpl 메서드는 객체를 설정하고 일회성 초기화 작업을 구현합니다. 이 System Object의 경우, 필터 계수, 상태, 채널 개수를 계산하도록 디폴트 setupImpl 메서드를 수정합니다. 필터 계수는 지정된 WindowLength를 기반으로 계산됩니다. 필터 상태는 0으로 초기화됩니다. (참고로, 입력 채널당 WindowLength-1개의 상태가 있습니다.) 마지막으로, 채널 개수는 입력값의 열 개수에서 결정됩니다.

setupImpl 메서드와 모든 Impl 메서드의 경우, 이 System Object의 사용자가 이러한 메서드를 직접 호출하지 않으므로 메서드 특성 Access = protected를 설정해야 합니다. 대신, 이 System Object의 백엔드가 다른 사용자 대상 함수를 통해 이러한 메서드를 호출합니다.

function setupImpl(obj,x)
    % Perform one-time calculations, such as computing constants
    obj.pNumChannels = size(x,2);
    obj.pCoefficients = ones(1,obj.WindowLength)/obj.WindowLength;
    obj.State = zeros(obj.WindowLength-1,obj.pNumChannels,'like',x);
end

stepImpl에서 알고리즘 정의하기

이 객체의 알고리즘은 stepImpl 메서드에서 정의합니다. stepImpl의 알고리즘은 이 System Object의 사용자가 명령줄에서 객체를 호출할 때 실행됩니다. 이 예제에서는 filter 함수를 사용하여 출력값을 계산하고 객체의 상태 값을 업데이트하도록 stepImpl을 수정합니다.

function y = stepImpl(obj,u)
    [y,obj.State] = filter(obj.pCoefficients,1,u,obj.State);
end

재설정 및 해제하기

상태 재설정 수식은 resetImpl 메서드에서 정의합니다. 이 예제에서는 상태를 0으로 재설정합니다. 또한 releaseImpl 메서드를 추가해야 합니다. 편집기 툴스트립에서 메서드 삽입 > 리소스 해제를 선택합니다. releaseImpl 메서드가 System Object에 추가됩니다. releaseImpl을 수정하여 채널 개수를 -1로 설정합니다. 이 값은 필터에 새 입력값을 사용할 수 있도록 허용합니다.

function resetImpl(obj)
    % Initialize / reset discrete-state properties
    obj.State(:) = 0;
end
function releaseImpl(obj)
    obj.pNumChannels = -1;
end

입력값의 유효성 검사하기

System Object에 대한 입력값의 유효성을 검사하려면 validateInputsImpl 메서드를 구현해야 합니다. 이 메서드는 초기화할 때와 입력 특성(예: 차원, 데이터형 또는 실수/복소수 여부)이 바뀌는 각 후속 호출 시마다 입력값의 유효성을 검사합니다. 툴스트립에서 메서드 삽입 > 입력값의 유효성 검사를 선택합니다. 새로 삽입된 validateInputsImpl 메서드에서 validateattributes를 호출하여 입력값이 부동소수점 데이터로 구성된 2차원 행렬인지 확인합니다.

function validateInputsImpl(~, u)
    validateattributes(u,{'double','single'}, {'2d',...
        'nonsparse'},'','input');
end

객체 저장 및 불러오기

System Object의 인스턴스를 저장할 때 saveObjectImpl은 어떤 속성 및 상태 값이 MAT 파일에 저장되는지를 정의합니다. System Object 클래스에 대해 saveObjectImpl 메서드를 정의하지 않으면 퍼블릭 속성과 DiscreteState 특성이 있는 속성만 저장됩니다. 메서드 삽입 > MAT 파일에 저장을 선택합니다. 객체가 잠겨 있는 경우 계수와 채널 개수가 저장되도록 saveObjectImpl을 수정합니다.

function s = saveObjectImpl(obj)
    s = saveObjectImpl@matlab.System(obj);
    if isLocked(obj)
        s.pCoefficients = obj.pCoefficients;
        s.pNumChannels = obj.pNumChannels;
    end
end

loadObjectImpl은 저장된 객체를 불러오는 방법을 정의하므로 saveObjectImpl에 동반됩니다. 저장된 객체를 불러올 때 객체는 동일한 잠긴 상태에서 불려옵니다. 메서드 삽입 > MAT 파일에서 불러오기를 선택합니다. 객체가 잠겨 있는 경우 계수와 채널 개수를 불러오도록 loadObjectImpl을 수정합니다.

function loadObjectImpl(obj,s,wasLocked)
    if wasLocked
        obj.pCoefficients = s.pCoefficients;
        obj.pNumChannels = s.pNumChannels;
    end
    loadObjectImpl@matlab.System(obj,s,wasLocked);
end

MATLAB에서 movingAverageFilter 사용하기

System Object를 정의했으므로 MATLAB에서 이 객체를 사용할 수 있습니다. 예를 들어, movingAverageFilter를 사용하여 잡음이 있는 펄스 시퀀스에서 잡음을 제거할 수 있습니다.

movingAverageFilter = movingAverageFilter('WindowLength',10);

t = (1:250)';
signal = randn(250,1);
smoothedSignal = movingAverageFilter(signal);

plot(t,signal,t,smoothedSignal);
legend(["Input","Smoothed input"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Input, Smoothed input.

Simulink에서 사용하도록 System Object 확장하기

Simulink에서 System Object를 사용하려면 Create Moving Average Filter Block with System Object (Simulink) 항목을 참조하십시오.