exponenta event banner

Системные объекты и функции MATLAB

Системные объекты и функции MATLAB

Многие системные объекты имеют аналоги функций MATLAB ®. Для простых разовых вычислений используйте функции 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. Не требуя явной индексации, объект чтения файлов управляет размерами кадра данных, в то время как фильтр управляет состояниями. Объект записи звукового устройства воспроизводит каждый звуковой кадр при его обработке.