Многие системные объекты имеют аналоги функций MATLAB ®. Для простых разовых вычислений используйте функции MATLAB. Однако при необходимости проектирования и моделирования системы со многими компонентами используйте системные объекты. Использование системных объектов также подходит, если вычисления требуют управления внутренними состояниями, имеют входные данные, которые изменяются с течением времени или обрабатывают большие потоки данных .
Создание динамической системы с различными фазами выполнения и внутренними состояниями с использованием только функций MATLAB потребует сложного программирования. Для инициализации системы, проверки данных, управления внутренними состояниями, сброса и завершения работы системы необходим код. Во время выполнения многие из этих управленческих операций автоматически выполняются системными объектами. Объединение системных объектов в программе с другими функциями MATLAB позволяет оптимизировать код и повысить эффективность.
В этом примере показано, как записывать код MATLAB только для чтения аудиоданных.
Код считывает аудиоданные из файла, фильтрует их и воспроизводит отфильтрованные аудиоданные. Аудиоданные считываются в кадрах. Этот код дает тот же результат, что и код системных объектов в следующем примере, что позволяет сравнивать подходы.
Найдите исходный аудиофайл.
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 loop.
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, заключается в том, что звуковая функция не предназначена для работы в реальном времени. Получающийся звук чопорный и едва слышный.
В этом примере показано, как записать код системных объектов для чтения аудиоданных.
Код использует системные объекты из программного обеспечения DSP System Toolbox™ для считывания аудиоданных из файла, фильтрации и последующего воспроизведения отфильтрованных аудиоданных. Этот код дает тот же результат, что и код MATLAB, показанный ранее, что позволяет сравнивать подходы.
Найдите исходный аудиофайл.
fname = "speech_dft_8kHz.wav";
Определите системный object™ для чтения файла.
audioIn = dsp.AudioFileReader(fname,'OutputDataType','single');
Определите объект System для фильтрации данных.
filtLP = dsp.FIRFilter('Numerator',fir1(160,.15));
Определите объект System для воспроизведения отфильтрованных аудиоданных.
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
Этот код системных объектов позволяет избежать проблем, возникающих в коде только MATLAB. Не требуя явной индексации, объект чтения файлов управляет размерами кадра данных, в то время как фильтр управляет состояниями. Объект записи звукового устройства воспроизводит каждый звуковой кадр при его обработке.