Этот пример показывает, как деноцировать сигнал, используя код С, сгенерированный из 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')
