В этом примере вы будете учиться как:
Используйте блок MATLAB function, чтобы добавить функции MATLAB® в модели Simulink® для моделирования, симуляции и развертывания на встраиваемых процессорах.
Эта возможность полезна для алгоритмов кодирования, которые лучше утверждаются на текстовом языке MATLAB, чем на графическом языке Simulink.
Используйте coder.extrinsic
, чтобы вызвать код MATLAB от блока MATLAB function.
Эта возможность позволяет вам вызывать существующий код MATLAB от Simulink, сначала не имея необходимость сделать этот код подходящим для генерации кода, допуская быстрое прототипирование.
Проверяйте, что существующий код MATLAB подходит для генерации кода.
Преобразуйте алгоритм MATLAB от пакетной обработки данных до потоковой передачи.
Используйте персистентные переменные в коде, который подходит для генерации кода.
Необходимо сделать веса фильтра персистентными так, чтобы алгоритм фильтра не сбрасывал их значения каждый раз, когда он запускается.
Чтобы работать через этот пример, у вас должно быть основное знакомство с программным обеспечением MATLAB. Необходимо также понять, как создать основную модель Simulink и как моделировать ту модель. Для получения дополнительной информации смотрите, Создают Простую Модель.
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB
MATLAB Coder™
Simulink
Simulink Coder
DSP System Toolbox™
Компилятор C
Для списка поддерживаемых компиляторов см. Поддерживаемые Компиляторы.
Для получения инструкций по установке продуктов MathWorks® обратитесь к документации по установке. Если вы установили MATLAB и хотите проверять, который установлены другие Продукты Mathworks, введите ver
в Окно Команды MATLAB. Для получения инструкций по установке и подготовке компилятор C, смотрите Подготовку C или Компилятора C++ (MATLAB Coder).
Фильтр наименьшее количество средних квадратичных (LMS) является адаптивным фильтром, который настраивает его передаточную функцию согласно алгоритму оптимизации. Вы предоставляете фильтру пример желаемого сигнала вместе с входным сигналом. Фильтр затем вычисляет веса фильтра или коэффициенты, которые производят наименьшее количество средних квадратичных ошибки между выходным сигналом и желаемым сигналом.
Этот пример использует фильтр LMS, чтобы удалить шум в звукозаписи. Существует два входных параметров. Первый вход является искаженным сигналом: звукозапись плюс отфильтрованный шум. Второй вход является желаемым сигналом: неотфильтрованный шум. Фильтр работает, чтобы устранить различие между выходным сигналом и желаемым сигналом и выводит различие, которое, в этом случае, является чистой звукозаписью. Когда вы запускаете симуляцию, вы слышите и шум и музыку. В зависимости от времени адаптивный фильтр удаляет шум, таким образом, вы слышите только музыку.
Этот пример использует алгоритм наименьшее количество средних квадратичных (LMS), чтобы удалить шум из входного сигнала. LMS-алгоритм вычисляет отфильтрованный вывод, ошибку фильтра и веса фильтра, учитывая искаженные и желаемые сигналы.
В начале примера LMS-алгоритм использует процесс пакетной обработки, чтобы отфильтровать аудиовход. Этот алгоритм подходит для MATLAB, где вы, вероятно, загрузите в целом сигнале и обработаете все это целиком. Однако процесс пакетной обработки не подходит для обработки сигнала в режиме реального времени. Когда вы работаете через пример, вы совершенствовали проект фильтра, чтобы преобразовать алгоритм от пакетного до поточной обработки.
Базовая функциональная подпись для алгоритма:
function [ signal_out, err, weights ] = ... lms_01(signal_in, desired)
Фильтрация выполняется в следующем цикле:
for n = 1:SignalLength % Compute the output sample using convolution: signal_out(n,ch) = weights' * signal_in(n:n+FilterLength-1,ch); % Update the filter coefficients: err(n,ch) = desired(n,ch) - signal_out(n,ch) ; weights = weights + mu*err(n,ch)*signal_in(n:n+FilterLength-1,ch); end
SignalLength
является длиной входного сигнала, FilterLength
является длиной фильтра, и mu
является размером шага адаптации.Процесс фильтрации имеет три фазы:
Свертка
Свертка для фильтра выполняется в:
signal_out(n,ch) = weights' * signal_in(n:n+FilterLength-1,ch);
Вычисление ошибки
Ошибка является различием между желаемым сигналом и выходным сигналом:
err(n,ch) = desired(n,ch) - signal_out(n,ch);
Адаптация
Новое значение весов фильтра является старым значением весов фильтра плюс поправочный коэффициент, который основан на сигнале ошибки, искаженном сигнале и размере шага адаптации:
weights = weights + mu*err(n,ch)*signal_in(n:n+FilterLength-1,ch);
Haykin, Саймон. Адаптивная теория фильтра. Верхний Сэддл-Ривер, NJ: Prentice-Hall, Inc., 1996.
Пример использует следующие файлы:
Файлы модели Simulink для каждого шага примера.
Файлы кода MATLAB для каждого шага примера.
В этом примере вы работаете с моделями Simulink, которые вызывают файлы MATLAB, которые содержат простой алгоритм фильтра наименьшее количество средних квадратичных (LMS).
Учебные файлы доступны в следующей папке: docroot\toolbox\simulink\examples\lms
. Чтобы запустить пример, необходимо скопировать эти файлы в локальную папку. Для инструкций смотрите Копирование Файлов Локально.
Ввод | Имя | Описание |
---|---|---|
Файлы MATLAB | lms_01 | Базовая реализация MATLAB пакетного фильтра. Не подходящий для генерации кода. |
lms_02 | Фильтр, измененный от пакета до потоковой передачи. | |
lms_03 | Основанный на кадре фильтр потоковой передачи со Сбросом и Адаптирует средства управления. | |
lms_04 | Основанный на кадре фильтр потоковой передачи со Сбросом и Адаптирует средства управления. Подходящий для генерации кода. | |
lms_05 | Отключенное встраивание для генерации кода. | |
lms_06 | Демонстрирует использование coder.nullcopy . | |
Файлы модели Simulink | acoustic_environment | Модель Simulink, которая предоставляет обзор акустической среды. |
noise_cancel_00 | Модель Simulink без блока MATLAB function. | |
noise_cancel_01 | Полная модель noise_cancel_00 включая блок MATLAB function. | |
noise_cancel_02 | Модель Simulink для использования с lms_02.m . | |
noise_cancel_03 | Модель Simulink для использования с lms_03.m . | |
noise_cancel_04 | Модель Simulink для использования с lms_04.m . | |
noise_cancel_05 | Модель Simulink для использования с lms_05.m . | |
noise_cancel_06 | Модель Simulink для использования с lms_06.m . | |
design_templates | Модель Simulink, содержащая, Адаптируется и средства управления Сбросом. |
Скопируйте учебные файлы в локальную папку:
Создайте локальную папку solutions
, например, c:\test\lms\solutions
.
Изменитесь на папку docroot\toolbox\simulink\examples
. В командной строке MATLAB, введите:
cd(fullfile(docroot, 'toolbox', 'simulink', 'examples'))
Скопируйте содержимое подпапки lms
к вашей папке solutions
, задав имя полного пути папки solutions
:
copyfile('lms', 'solutions')
solutions
теперь содержит полный набор решений для примера. Если вы не хотите выполнять шаги для каждой задачи, можно просмотреть предоставленное решение, чтобы видеть, как код должен выглядеть.Создайте локальную папку work
, например, c:\test\lms\work
.
Скопируйте следующие файлы от своей папки solutions
до вашей папки work
.
lms_01
lms_02
noise_cancel_00
acoustic_environment
design_templates
Ваша папка work
теперь содержит все файлы, что необходимо начать.
Вы теперь готовы настроить свой компилятор C.
Создание вашего блока MATLAB function требует поддерживаемого компилятора. MATLAB автоматически выбирает тот как компилятор по умолчанию. Если у вас есть несколько поддерживаемых MATLAB компиляторов, установленных в вашей системе, можно изменить значение по умолчанию с помощью команды mex -setup
. См. Компилятор Значения по умолчанию Изменения (MATLAB) и список Поддерживаемых Компиляторов.
Запустите модель acoustic_environment
, предоставленную примером, чтобы понять проблему, что вы пытаетесь решить использование фильтра LMS. Эта модель добавляет ограниченный полосой белый шум в звуковой сигнал и выводит получившийся сигнал динамику.
Моделировать модель:
Откройте модель acoustic_environment
в Simulink:
Установите свою текущую папку MATLAB на папку, которая содержит ваши рабочие файлы для этого примера. В командной строке MATLAB, введите:
cd work
work
является именем полного пути папки, содержащей ваши файлы. Смотрите Находят Файлы и Папки (MATLAB) для получения дополнительной информации.В командной строке MATLAB, введите:
acoustic_environment
Гарантируйте, что ваши динамики работают.
Чтобы моделировать модель, от окна модели Simulink, выбирают Simulation> Run.
Когда Simulink запускает модель, вы слышите звуковой сигнал, искаженный шумом.
В то время как симуляция запускается, дважды кликните Ручной Переключатель, чтобы выбрать источник аудиосигналов.
Теперь вы слышите желаемый аудиовход без любого шума.
Цель этого примера состоит в том, чтобы использовать алгоритм фильтра LMS MATLAB, чтобы удалить шум из шумного звукового сигнала. Вы делаете это путем добавления блока MATLAB function в модель и вызова кода MATLAB от этого блока.
Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель noise_cancel_01
в своей подпапке solutions
, чтобы видеть измененную модель.
В целях этого примера вы добавляете блок MATLAB function в модель noise_cancel_00
, предоставленную примером. На практике необходимо было бы разработать собственный испытательный стенд начиная с пустой модели Simulink.
Добавить блок MATLAB function в модель noise_cancel_00
:
Откройте noise_cancel_00
в Simulink.
noise_cancel_00
Добавьте блок MATLAB function в модель:
В командной строке MATLAB введите slLibraryBrowser
, чтобы открыть Браузер Библиотеки Simulink.
Из списка Библиотек Simulink выберите библиотеку User-Defined Functions
.
Кликните по блоку MATLAB function и перетащите его в модель noise_cancel_00
. Поместите блок чуть выше красной текстовой аннотации Place MATLAB Function Block here
.
Удалите красные текстовые аннотации из модели.
Сохраните модель в текущей папке как noise_cancel_01
.
В этой части примера вы используете функцию coder.extrinsic
, чтобы вызвать ваш код MATLAB от блока MATLAB function для быстрого прототипирования.
Почему Вызов код MATLAB Как Внешняя Функция?. При вызове кода MATLAB, когда внешняя функция предоставляет эти преимущества:
Для быстрого прототипирования вы не должны делать код MATLAB подходящим для генерации кода.
Используя coder.extrinsic
позволяет вам отладить свой код MATLAB в MATLAB. Можно добавить одну или несколько точек останова в файле lms_01.m
, и затем запустить симуляцию в Simulink. Когда механизм выполнения MATLAB сталкивается с точкой останова, он временно останавливает выполнение так, чтобы можно было осмотреть рабочее пространство MATLAB и просмотреть текущие значения всех переменных в памяти. Для получения дополнительной информации об отладке кода MATLAB, смотрите Отладку программа MATLAB (MATLAB).
Как Вызвать код MATLAB Как Внешнюю Функцию. Вызывать ваш код MATLAB от блока MATLAB function:
Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Удалите код по умолчанию, отображенный в Редакторе блока MATLAB function.
Скопируйте следующий код в блок MATLAB function.
function [ Signal_Out, Weights ] = LMS(Noise_In, Signal_In) %#codegen % Extrinsic: coder.extrinsic('lms_01'); % Compute LMS: [ ~, Signal_Out, Weights ] = lms_01(Noise_In, Signal_In); end
Сохраните модель.
Входные параметры функции lms_01
Noise_In
и Signal_In
теперь появляются как входные порты к блоку и функциональным выходным параметрам Signal_Out
и Weights
, появляются как выходные порты.
Соединение вводов и выводов блока MATLAB function
Соедините вводы и выводы блока MATLAB function так, чтобы ваша модель выглядела так.
Смотрите Ярлыки Блока и Сигнальной линии и Действия для получения дополнительной информации.
В коде блока MATLAB function предварительно выделите выходные параметры путем добавления следующего кода после внешнего вызова:
% Outputs: Signal_Out = zeros(size(Signal_In)); Weights = zeros(32,1);
Weights
собирается совпадать с коэффициентами Числителя Цифрового Фильтра в Акустической подсистеме Среды.Сохраните модель.
Вы теперь готовы проверить свою модель на наличие ошибок.
Моделировать модель:
Гарантируйте, что вы видите графики Time Domain.
Чтобы просмотреть графики, в модели noise_cancel_01
, открывают блок Analysis и Visualization и затем открывают блок Time Domain.
В окне модели Simulink выберите Simulation> Run .
Когда Simulink запускает модель, вы видите и слышите выходные параметры. Первоначально, вы слышите звуковой сигнал, искаженный шумом. Затем фильтр постепенно ослабляет шум, пока вы не слышите только, что музыка вопроизводит с очень мало шумовым остающийся. После двух секунд вы слышите искаженный сигнал с шумом снова, и фильтр ослабляет шум снова. Этот цикл повторяется постоянно.
MATLAB отображает следующий график, показывающий этот цикл.
Остановите симуляцию.
Что Передает потоком?. Фильтр потоковой передачи неоднократно называется к фрагментам фиксированного размера процесса входных данных или кадрам, пока он не обработал целый входной сигнал. Формат кадра может быть столь же маленьким как одна выборка, в этом случае фильтр действовал бы в основанном на выборке режиме, или до нескольких тысяч выборок, для основанной на кадре обработки.
Почему Потоковая передача Использования?. Проект алгоритма фильтра в lms_01
имеет следующие недостатки:
Алгоритм не использует память эффективно.
Предварительное выделение установленной суммы памяти для каждого входного сигнала в течение времени жизни программы означает, что больше памяти выделяется, чем используется.
Необходимо знать размер входного сигнала в то время, когда вы вызываете функцию.
Если бы входной сигнал прибывает в режиме реального времени или как поток выборок, необходимо было бы ожидать, чтобы накопить целый сигнал, прежде чем вы могли передать его, как пакет, к фильтру.
Размер сигнала ограничивается максимальным размером.
Во встраиваемом приложении фильтр, вероятно, будет обрабатывать непрерывный входной поток. В результате входной сигнал может быть существенно более длинным, чем максимальная длина, которую мог возможно обработать фильтр, работающий в пакетном режиме. Чтобы заставить фильтр работать на любую длину сигнала, это должно запуститься в режиме реального времени. Одно решение состоит в том, чтобы преобразовать фильтр от пакетной обработки до поточной обработки.
Просмотр Измененного кода MATLAB. Преобразование в потоковую передачу включает:
Представление метода "первым пришел - первым вышел" (FIFO) очередь
Очередь FIFO действует как буфер временного хранения, который содержит небольшое количество выборок от потока входных данных. Количество выборок, сохраненных очередью FIFO, должно быть точно тем же самым как количеством выборок в импульсном ответе фильтра, так, чтобы функция могла выполнить операцию свертки между коэффициентами фильтра и входным сигналом.
Создание очереди FIFO и персистентных весов фильтра
Фильтр неоднократно называется, пока он не обработал целый входной сигнал. Поэтому очередь FIFO и веса фильтра должны сохраниться так, чтобы процесс адаптации не запускался снова после каждого последующего вызова функции.
Откройте предоставленный файл lms_02.m
в вашей подпапке work
, чтобы видеть измененный алгоритм.
Сводные данные Изменений в Алгоритме Фильтра. Обратите внимание на следующие важные изменения к алгоритму фильтра:
Веса фильтра и очередь FIFO объявляются как персистентные:
persistent weights; persistent fifo;
Очередь FIFO инициализируется:
fifo = zeros(FilterLength,ChannelCount);
Очередь FIFO используется в цикле обновления фильтра:
% For each channel: for ch = 1:ChannelCount % For each sample time: for n = 1:FrameSize % Update the FIFO shift register: fifo(1:FilterLength-1,ch) = fifo(2:FilterLength,ch); fifo(FilterLength,ch) = signal_in(n,ch); % Compute the output sample using convolution: signal_out(n,ch) = weights' * fifo(:,ch); % Update the filter coefficients: err(n,ch) = desired(n,ch) - signal_out(n,ch) ; weights = weights + mu*err(n,ch)*fifo(:,ch); end end
Вы не можете вывести персистентную переменную. Поэтому новая переменная, weights_out
, используется, чтобы вывести веса фильтра:
function [ signal_out, err, weights_out ] = ... lms_02(distorted, desired)
weights_out = weights;
Изменение Модели, чтобы Вызвать Обновленный Алгоритм. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель noise_cancel_02
в своей подпапке solutions
, чтобы видеть измененную модель.
В модели noise_cancel_01
дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Измените код блока MATLAB function, чтобы вызвать lms_02
.
Измените внешний вызов.
% Extrinsic: coder.extrinsic('lms_02');
Измените вызов алгоритма фильтра.
% Compute LMS: [ ~, Signal_Out, Weights ] = lms_02(Noise_In, Signal_In);
Измените формат кадра от 16384
до 64
, который представляет более реалистическое значение.
Щелкните правой кнопкой в окне модели и выберите Model Properties из контекстного меню.
Выберите вкладку Callbacks.
В списке Model callbacks выберите InitFcn
.
Измените значение FrameSize
к 64
.
Нажмите Apply и закройте диалоговое окно.
Сохраните свою модель как noise_cancel_02
.
Симуляция Алгоритма Потоковой передачи. Моделировать модель:
Гарантируйте, что вы видите графики Time Domain.
Запустите симуляцию.
Когда Simulink запускает модель, вы видите и слышите выходные параметры. Первоначально, вы слышите звуковой сигнал, искаженный шумом. Затем в течение первых нескольких секунд фильтр постепенно ослабляет шум, пока вы не слышите только, что музыка вопроизводит с очень мало шумовым остающийся. MATLAB отображает следующий график, показывающий сходимость фильтра только после нескольких секунд.
Остановите симуляцию.
Алгоритм фильтра теперь подходит для Simulink. Вы готовы разработать свою модель, чтобы использовать средства управления Reset
и Adapt
.
Почему добавляют, адаптируются и средства управления сбросом?
Изменение модели, чтобы использовать сброс и адаптировать средства управления
Симуляция модели с адаптируется и средства управления сбросом
Почему Добавляют, Адаптируются и Средства управления Сбросом?. В этой части примера вы добавляете, Адаптируются и средства управления Сбросом к вашему фильтру. Используя эти средства управления, можно включить и выключить фильтрацию. Когда Adapt
включен, фильтр постоянно обновляет веса фильтра. Когда Adapt
отключен, веса фильтра остаются в своих текущих значениях. Если Reset
установлен, фильтр сбрасывает веса фильтра.
Изменение Вашего кода MATLAB. Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл lms_03.m
в вашей подпапке solutions
, чтобы видеть измененный алгоритм.
Изменить ваш код фильтра:
Открытый lms_02.m
.
В разделе Set up
, замене
if ( isempty(weights) )
if ( reset || isempty(weights) )
В цикле фильтра обновите коэффициенты фильтра, только если Adapt
является ON
.
if adapt weights = weights + mu*err(n,ch)*fifo(:,ch); end
Измените функциональную подпись, чтобы использовать Adapt
и входные параметры Reset
и изменить название функции на lms_03
.
function [ signal_out, err, weights_out ] = ... lms_03(signal_in, desired, reset, adapt)
Сохраните файл в текущей папке как lms_03.m
:
Сводные данные изменений в алгоритме фильтра
Изменение Модели, чтобы Использовать Сброс и Адаптировать Средства управления. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель noise_cancel_03
в своей подпапке solutions
, чтобы видеть измененную модель.
Откройте модель noise_cancel_02
.
Дважды кликните блок MATLAB function, чтобы открыть Редактор блока MATLAB function.
Измените код блока MATLAB function:
Обновите объявление функции.
function [ Signal_Out, Weights ] = ... LMS(Adapt, Reset, Noise_In, Signal_In )
Обновите внешний вызов.
coder.extrinsic('lms_03');
Обновите вызов LMS-алгоритма.
% Compute LMS: [ ~, Signal_Out, Weights ] = ... lms_03(Noise_In, Signal_In, Reset, Adapt);
Закройте редактор блока MATLAB function.
Входные параметры функции lms_03
Reset
и Adapt
теперь появляются как входные порты к блоку MATLAB function.
Откройте модель design_templates
.
Скопируйте блок Settings от этой модели до вашей модели noise_cancel_02
:
Из меню модели design_templates
выберите Edit> Select All.
Выберите Edit> Copy.
Из меню модели noise_cancel_02
выберите Edit> Paste.
Соедините Adapt и Reset выходные параметры подсистемы Настроек к соответствующим входным параметрам на блоке MATLAB function. Ваша модель должна теперь появиться можно следующим образом.
Сохраните модель как noise_cancel_03
.
Симуляция Модели с Адаптируется и Средства управления Сбросом. Моделировать модель и видеть эффект средств управления Адаптированием и Сбросом:
В модели noise_cancel_03
просмотрите осциллограф Сходимости:
Дважды кликните подсистему Анализа и Визуализации.
Дважды кликните осциллограф Сходимости.
В окне модели Simulink выберите Simulation> Run.
Simulink запускает модель как прежде. В то время как модель запускается, переключите средства управления Адаптированием и Сбросом и просмотрите осциллограф Сходимости, чтобы видеть их эффект на фильтр.
Фильтр сходится, когда Adapt
является ON
, и Reset
является OFF
, затем сбрасывает когда вы toggleReset
. Результаты могут выглядеть примерно так:
Остановите симуляцию.
Вы доказали, что ваш алгоритм работает в Simulink. Затем вы генерируете код для своей модели. Прежде, чем сгенерировать код, необходимо гарантировать, что код MATLAB подходит для генерации кода. Для генерации кода необходимо удалить внешний вызов кода.
Создание Кода, Подходящего для Генерации кода. Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель noise_cancel_04
и файл lms_04.m
в вашей подпапке solutions
, чтобы видеть модификации.
Переименуйте блок MATLAB function к LMS_Filter
. Выберите аннотацию MATLAB Function
ниже блока MATLAB function и замените текст на LMS_Filter
.
Когда вы генерируете код для блока MATLAB function, Simulink Coder использует имя блока в сгенерированном коде. Это - хорошая практика, чтобы использовать понятное имя.
В вашей модели noise_cancel_03
дважды кликните блок MATLAB function.
Редактор блока MATLAB function открывается.
Удалите внешнее объявление.
% Extrinsic: coder.extrinsic('lms_03');
Удалите предварительное выделение выходных параметров.
% Outputs: Signal_Out = zeros(size(Signal_In)); Weights = zeros(32,1);
Измените вызов алгоритма фильтра.
% Compute LMS: [ ~, Signal_Out, Weights ] = ... lms_04(Noise_In, Signal_In, Reset, Adapt);
Сохраните модель как noise_cancel_04
.
Открытый lms_03.m
Измените имя функции к lms_04
.
Включите проверку ошибок, характерную для генерации кода путем добавления директивы компиляции %#codegen
после объявления функции.
function [ signal_out, err, weights_out ] = ... lms_04(signal_in, desired, reset, adapt) %#codegen
Индикатор сообщения анализатора кода в правом верхнем покраснел, чтобы указать, что анализатор кода обнаружил проблемы генерации кода. Анализатор кода подчеркивает незаконный код красного цвета и помещает красный маркер справа от него.
Переместите указатель через первый красный маркер, чтобы просмотреть информацию об ошибке.
Анализатор кода обнаруживает ту генерацию кода, требует, чтобы signal_out
был полностью задан прежде, чем преобразовать его в нижний индекс, и не поддерживает рост переменных данных о размере посредством индексации.
Переместите указатель через второй красный маркер и обратите внимание, что анализатор кода обнаруживает те же ошибки для err
.
Чтобы исправить эти ошибки, предварительно выделите выходные параметры signal_out
и err
. Добавьте этот код после настройки фильтра.
% Output Arguments: % Pre-allocate output and error signals: signal_out = zeros(FrameSize,ChannelCount); err = zeros(FrameSize,ChannelCount);
Почему предварительно выделяют Выходные параметры?
Красные ошибочные маркеры для этих двух строк кода исчезают. Индикатор сообщения анализатора кода в правом верхнем ребре кода становится зеленым, который указывает, что вы зафиксировали все ошибки и предупреждения, обнаруженные анализатором кода.
Сохраните файл как lms_04.m
.
Генерация Кода для noise_cancel_04
Прежде, чем сгенерировать код, гарантируйте, что Simulink Coder создает отчет генерации кода. Этот отчет HTML обеспечивает, быстрый доступ к списку сгенерированных файлов со сводными данными параметров конфигурации раньше генерировал код.
В окне модели Simulink выберите Simulation> Model Configuration Parameters.
На левой панели диалогового окна Configuration Parameters выберите Code Generation> Report.
На правой панели выберите Create code generation report.
Опция Open report automatically также выбрана.
Нажмите Apply и закройте диалоговое окно Configuration Parameters.
Сохраните свою модель.
Сгенерировать код для подсистемы Фильтра LMS:
В вашей модели выберите подсистему Фильтра LMS.
Из меню инструментов Build Model выберите Build Selected Subsystem.
Диалоговое окно Build code for subsystem появляется. Нажмите кнопку Build.
Программное обеспечение Simulink Coder генерирует код С для подсистемы и открывает отчет генерации кода.
Для получения дополнительной информации об использовании отчета генерации кода смотрите, Генерируют Отчет Генерации кода (Simulink Coder).
На левой панели отчета генерации кода щелкните по ссылке LMS_Filter.c
, чтобы просмотреть сгенерированный код C. Обратите внимание на то, что функция lms_04
не имеет никакого кода, потому что встраивание включено по умолчанию.
Измените свой алгоритм фильтра, чтобы отключить встраивание:
В lms_04.m
, после объявления функции, добавьте:
coder.inline('never')
Поменяйте имя функции на lms_05
и сохраните файл как lms_05.m
в текущей папке.
В вашей модели noise_cancel_04
дважды кликните блок MATLAB function.
Редактор блока MATLAB function открывается.
Измените вызов алгоритма фильтра, чтобы вызвать lms_05
.
% Compute LMS: [ ~, Signal_Out, Weights ] = ... lms_05(Noise_In, Signal_In, Reset, Adapt);
Сохраните модель как noise_cancel_05
.
Сгенерируйте код для обновленной модели.
В модели выберите подсистему Фильтра LMS.
Из меню инструментов Build Model выберите Build Selected Subsystem.
Диалоговое окно Build code for subsystem появляется.
Нажмите кнопку Build.
Программное обеспечение Simulink Coder генерирует код С для подсистемы и открывает отчет генерации кода.
На левой панели отчета генерации кода щелкните по ссылке LMS_Filter.c
, чтобы просмотреть сгенерированный код C.
На этот раз функция lms_05
имеет код, потому что вы отключили встраивание.
/* Forward declaration for local functions */ static void LMS_Filter_lms_05 ... (const real_T signal_in[64],const real_T ... desired[64], real_T reset, real_T adapt, ... real_T signal_out[64], ... real_T err[64], real_T weights_out[32]); /* Function for MATLAB Function Block: 'root/LMS_Filter' */ static void LMS_Filter_lms_05 ... (const real_T signal_in[64], const real_T ... desired[64], real_T reset, real_T adapt, ... real_T signal_out[64], ... real_T err[64], real_T weights_out[32]) |
Эта часть примера демонстрирует, когда и как предварительно выделить память для переменной, не подвергаясь издержкам инициализации памяти в сгенерированном коде.
В lms_05.m
код MATLAB не только объявляет signal_out
, и err
, чтобы быть FrameSize
-by-ChannelCount
вектор действительных удваивается, но также и инициализирует каждый элемент signal_out
и err
, чтобы обнулить. Эти сигналы инициализируются, чтобы обнулить в сгенерированном коде C.
КОД MATLAB | Сгенерированный код C |
---|---|
% Pre-allocate output and error signals: signal_out = zeros(FrameSize,ChannelCount); err = zeros(FrameSize,ChannelCount); | /* Pre-allocate output and error signals: */ 79 for (i = 0; i < 64; i++) { 80 signal_out[i] = 0.0; 81 err[i] = 0.0; 82 } |
Эта принудительная инициализация является ненужной, потому что и signal_out
и err
явным образом инициализируются в коде MATLAB, прежде чем они будут считаны.
Вы не должны использовать coder.nullcopy
при объявлении переменных weights
и fifo
, потому что эти переменные должны быть инициализированы в сгенерированном коде. Никакая переменная явным образом не инициализируется в коде MATLAB, прежде чем они будут считаны.
Используйте coder.nullcopy
в объявлении signal_out
и err
, чтобы устранить ненужную инициализацию памяти в сгенерированном коде:
В lms_05.m
предварительно выделите signal_out
и err
с помощью coder.nullcopy
:
% Pre-allocate output and error signals: signal_out = coder.nullcopy(zeros(FrameSize, ChannelCount)); err = coder.nullcopy(zeros(FrameSize, ChannelCount));
После объявления переменной с coder.nullcopy
необходимо явным образом инициализировать переменную в коде MATLAB прежде, чем считать его. В противном случае вы можете получить непредсказуемые результаты.
Поменяйте имя функции на lms_06
и сохраните файл как lms_06.m
в текущей папке.
В вашей модели noise_cancel_05
дважды кликните блок MATLAB function.
Редактор блока MATLAB function открывается.
Измените вызов алгоритма фильтра.
% Compute LMS: [ ~, Signal_Out, Weights ] = ... lms_06(Noise_In, Signal_In, Reset, Adapt);
Сохраните модель как noise_cancel_06
.
Сгенерируйте код для обновленной модели.
Выберите подсистему Фильтра LMS.
Из меню инструментов Build Model выберите Build Selected Subsystem.
Диалоговое окно Build code for subsystem появляется. Нажмите кнопку Build.
Программное обеспечение Simulink Coder и генерирует код С для подсистемы и открывает отчет генерации кода.
На левой панели отчета генерации кода щелкните по ссылке LMS_Filter.c
, чтобы просмотреть сгенерированный код C.
В сгенерированном коде C на этот раз нет никакой инициализации к нулю signal_out
и err
.