В этом примере показано, как к 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-функцию. Для более быстрой компиляции включите режим отладки путем установки -g
опция. (В режиме отладки компилятор отключает некоторую оптимизацию.) Значения по умолчанию генерации кода генерации кода MEX, когда вы не задаете цель сборки. По умолчанию, codegen
называет сгенерированную MEX-функцию denoiseSignal_mex
. Чтобы позволить генерацию файла MEX, задайте свойства (класс, размер и сложность) двух входных параметров:
coder.typeof(0,[1 Inf])
задает вектор-строку из произвольной длины, содержащей действительный double
значения.
coder.typeof('c',[1 Inf])
задает символьный массив произвольной длины.
codegen -g denoiseSignal -args {coder.typeof(0,[1 Inf]),coder.typeof('c',[1 Inf])}
Code generation successful.
Загрузите сигнал.
load noisdopp plot(noisdopp) title('Signal')
Denoise сигнал дважды с помощью denoiseSignal_mex
. Во-первых, используйте метод шумоподавления UniversalThreshold
. Затем используйте SURE
метод. Постройте оба результата.
dn = denoiseSignal_mex(noisdopp,'UniversalThreshold'); dn2 = denoiseSignal_mex(noisdopp,'SURE'); plot([dn' dn2']) legend('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 -g 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')