Main Content

System object와 MATLAB 함수

System object와 MATLAB 함수

대부분의 System object는 대응되는 MATLAB® 함수가 있습니다. 간단한 일회성 계산에는 MATLAB 함수를 사용하십시오. 그러나 컴포넌트가 많은 시스템을 설계하고 시뮬레이션해야 하는 경우에는 System object를 사용하십시오. 계산을 수행하는 데 내부 상태 관리가 필요하거나, 시간에 따라 입력값이 변경되거나, 대량의 데이터 스트림 처리가 필요한 경우에도 System object를 사용하는 것이 적합합니다.

MATLAB 함수만 사용하여 다양한 실행 단계와 내부 상태를 갖는 동적 시스템을 빌드하려면 복잡한 프로그래밍이 필요합니다. 시스템을 초기화하고 데이터의 유효성을 검사하며 내부 상태를 관리하고 시스템을 재설정 및 종료하기 위한 코드가 필요할 수 있습니다. System object는 실행 중에 이러한 여러 가지 관리 작업을 자동으로 수행합니다. 프로그램에서 System object를 다른 MATLAB 함수와 결합하여 코드를 간소화하고 효율을 높일 수 있습니다.

MATLAB 함수 코드만 사용하여 오디오 데이터 처리하기

이 예제에서는 MATLAB 함수만 사용하여 오디오 데이터를 읽는 코드를 작성하는 방법을 보여줍니다.

이 코드는 파일에서 오디오 데이터를 읽어 들여 필터링한 다음 필터링된 오디오 데이터를 재생합니다. 오디오 데이터는 프레임 단위로 읽혀집니다. 이 코드는 다음 예제의 System object 코드와 동일한 결과를 생성하므로 두 접근 방식을 비교해 볼 수 있습니다.

소스 오디오 파일을 찾습니다.

fname = 'speech_dft_8kHz.wav';

소스 파일에서 총 샘플 개수와 샘플링 레이트를 얻습니다.

audioInfo = audioinfo(fname);
maxSamples = audioInfo.TotalSamples;
fs = audioInfo.SampleRate;

사용할 필터를 정의합니다.

b = fir1(160,.15);

필터 상태를 초기화합니다.

z = zeros(1,numel(b)-1);

한 번에 처리할 오디오 데이터의 양을 정의하고 while 루프 인덱스를 초기화합니다.

frameSize = 1024;
nIdx = 1;

오디오 데이터를 처리하도록 while 루프를 정의합니다.

while nIdx <= maxSamples(1)-frameSize+1
    audio = audioread(fname,[nIdx nIdx+frameSize-1]);
    [y,z] = filter(b,1,audio,z);
    sound(y,fs);
    nIdx = nIdx+frameSize;
end  

이 루프는 명시적인 인덱싱 및 상태 관리를 사용하는데, 이는 번거롭고 실수하기 쉬운 접근 방식일 수 있습니다. 크기와 데이터형 등, 상태에 대해 자세히 알고 있어야 합니다. 이 MATLAB 전용 코드의 또 다른 문제는 sound 함수가 실시간으로 실행되도록 설계되지 않았다는 점입니다. 그 결과로 생성되는 오디오는 고르지 못하고 거의 들리지 않습니다.

System object를 사용하여 오디오 데이터 처리하기

이 예제에서는 오디오 데이터를 읽기 위해 System object 코드를 작성하는 방법을 보여줍니다.

이 코드는 DSP System Toolbox™의 System object를 사용하여 파일에서 오디오 데이터를 읽어 들이고 필터링한 다음, 필터링된 오디오 데이터를 재생합니다. 이 코드는 앞서 소개한 MATLAB 코드와 동일한 결과를 생성하므로 두 접근 방식을 비교해 볼 수 있습니다.

소스 오디오 파일을 찾습니다.

fname = "speech_dft_8kHz.wav";

파일을 읽도록 System object™를 정의합니다.

audioIn = dsp.AudioFileReader(fname,'OutputDataType','single');

데이터를 필터링하도록 System object를 정의합니다.

filtLP = dsp.FIRFilter('Numerator',fir1(160,.15));

필터링된 오디오 데이터를 재생하도록 System object를 정의합니다.

audioOut = audioDeviceWriter('SampleRate',audioIn.SampleRate);

오디오 데이터를 처리하도록 while 루프를 정의합니다.

while ~isDone(audioIn)
    audio = audioIn();    % Read audio source file
    y = filtLP(audio);   % Filter the data
    audioOut(y);         % Play the filtered data
end

이 System object 코드는 MATLAB 전용 코드에서 나타나는 문제를 방지합니다. 명시적 인덱싱을 사용할 필요 없이, file reader 객체는 데이터 프레임 크기를 관리하고 필터는 상태를 관리합니다. audio device writer 객체는 각 오디오 프레임을 처리하는 즉시 재생합니다.