Денуазируйте сигнал, используя сгенерированный код C

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

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

Денуризируйте сигнал дважды, используя 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-функцию, чтобы денонсировать сигнал с помощью 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')

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

См. также

Похожие темы