Этот пример показывает, как деноцировать сигнал, используя код С, сгенерированный из wdenoise
функция. Продемонстрированы два методов. Первый метод использует функцию обертки, которая вызывает wdenoise
. Второй метод генерирует код С непосредственно из wdenoise
. В зависимости от вашего рабочего процесса, один метод может быть предпочтительнее другого. Например, чтобы упорядочить генерацию кода для большого кода MATLAB ®, можно использовать функции обертки для модуляризации кода.
Создайте функцию MATLAB denoiseSignal
который выполняет wdenoise
и возвращает деноизированный сигнал. Функция принимает два входных параметров: сигнал 1-D и метод шумоподавления. Он передает эти аргументы wdenoise
. Функция включена в директорию, содержащую этот пример. Код для denoiseSignal
далее.
function out = denoiseSignal(input,denMthd) %#codegen out = wdenoise(input,'DenoisingMethod',denMthd); end
The %#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')
Денуризируйте сигнал дважды, используя denoiseSignal_mex
. Во-первых, используйте метод шумоподавления UniversalThreshold
. Затем используйте SURE
способ. Постройте график обоих результатов.
dn = denoiseSignal_mex(noisdopp,'UniversalThreshold'); dn2 = denoiseSignal_mex(noisdopp,'SURE'); plot([dn' dn2']) legend('Universal','SURE')
Используйте функцию MATLAB и MEX-функцию, чтобы денонсировать сигнал с помощью Minimax
способ. Подтвердите, что результаты равны.
dnA = denoiseSignal_mex(noisdopp,'Minimax'); dnB = denoiseSignal(noisdopp,'Minimax'); max(abs(dnA-dnB))
ans = 6.2172e-15
Можно также сгенерировать код С непосредственно из wdenoise
. Сгенерируйте файл MEX, который денофицирует сигнал с помощью db4
вейвлет. Сгенерированный файл MEX называется wdenoise_mex
.
codegen wdenoise -args {coder.typeof(0,[1 Inf]),coder.Constant('Wavelet'),coder.Constant('db4')}
Code generation successful.
Денуазируйте исходный сигнал.
dn3 = wdenoise_mex(noisdopp,'Wavelet','db4');
Чтобы подтвердить, что файл MEX принимает входы переменной длины, денуризируйте первые 200 выборок исходного сигнала.
dn4 = wdenoise_mex(noisdopp(1:200),'Wavelet','db4'); plot([noisdopp(1:200)' dn4']) legend('Original','Denoised')