Сигнал Denoise Используя сгенерированный код C

В этом примере показано, как к denoise сигнал с помощью кода С сгенерирован от wdenoiseфункция. Продемонстрированы два метода. Первый метод использует функцию обертки, которая вызывает wdenoise. Второй метод генерирует код С непосредственно от wdenoise. В зависимости от вашего рабочего процесса один метод может быть предпочтен по другому. Например, чтобы оптимизировать генерацию кода для большого кода MATLAB®, можно использовать функции обертки, чтобы построить код из модулей.

Используйте функцию обертки

Создайте функцию MATLAB denoiseSignal это выполняет wdenoise и возвращает сигнал denoised. Функция берет два входных параметра: 1D сигнал и метод шумоподавления. Это передает эти аргументы wdenoise. Функция включена в директорию, содержащую этот пример. Код для denoiseSignal следует.

function out = denoiseSignal(input,denMthd)
%#codegen
out = wdenoise(input,'DenoisingMethod',denMthd);
end

%#codegen директива указывает, что функция предназначается для генерации кода.

Используйте codegen (MATLAB Coder), чтобы сгенерировать MEX-функцию. Значения по умолчанию генерации кода генерации кода MEX, когда вы не задаете цель сборки. По умолчанию, codegen называет сгенерированную MEX-функцию denoiseSignal_mex. Чтобы позволить генерацию файла MEX, задайте свойства (класс, размер и сложность) двух входных параметров:

  • coder.typeof(0,[1 Inf]) задает вектор-строку из произвольной длины, содержащей действительный double значения.

  • coder.typeof('c',[1 Inf]) задает символьный массив произвольной длины.

codegen denoiseSignal -args {coder.typeof(0,[1 Inf]),coder.typeof('c',[1 Inf])}
Code generation successful.

Загрузите сигнал.

load noisdopp
plot(noisdopp)
title('Signal')

Figure contains an axes. The axes with title Signal contains an object of type line.

Denoise сигнал дважды с помощью denoiseSignal_mex. Во-первых, используйте метод шумоподавления UniversalThreshold. Затем используйте SURE метод. Постройте оба результата.

dn = denoiseSignal_mex(noisdopp,'UniversalThreshold');
dn2 = denoiseSignal_mex(noisdopp,'SURE');
plot([dn' dn2'])
legend('Universal','SURE')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Universal, SURE.

Используйте функцию MATLAB и MEX-функцию к denoise сигнал с помощью Minimax метод. Подтвердите, что результаты равны.

dnA = denoiseSignal_mex(noisdopp,'Minimax');
dnB = denoiseSignal(noisdopp,'Minimax');
max(abs(dnA-dnB))
ans = 6.2172e-15

Используйте явным образом

Можно также сгенерировать код С непосредственно от wdenoise. Сгенерируйте файл MEX что denoises сигнал с помощью db4 вейвлет. Сгенерированный файл MEX называется wdenoise_mex.

codegen wdenoise -args {coder.typeof(0,[1 Inf]),coder.Constant('Wavelet'),coder.Constant('db4')}
Code generation successful.

Denoise исходный сигнал.

dn3 = wdenoise_mex(noisdopp,'Wavelet','db4');

Подтвердить файл MEX принимает входные параметры переменной длины, denoise первые 200 выборок исходного сигнала.

dn4 = wdenoise_mex(noisdopp(1:200),'Wavelet','db4');
plot([noisdopp(1:200)' dn4'])
legend('Original','Denoised')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Denoised.

Смотрите также

Похожие темы