Переписать функцию medfilt1 MATLAB для поддержки codegen - PullRequest
1 голос
/ 05 января 2020

Я пишу скрипт MATLAB, который использует функцию medfilt1. Вот пример использования порядка 100:

  median_filter_results = medfilt1(my_data, 100);

При попытке экспортировать код MATLAB через codegen в сообщении об ошибке указывается, что medfilt1 не поддерживается. Глядя на веб-сайт документации MATLAB , я могу сказать, что его там нет, а medfilt2 есть. Это заставляет меня думать, что эту функцию, вероятно, довольно легко воспроизвести.

Читая этот пост , авторы делают следующий комментарий:

Вы можете использовать Медиана () функция. Тогда вам просто нужно поместить это в a для l oop, что крайне тривиально.

Однако я не совсем уверен, что знаю, что это значит, так как медиана функция возвращает обратно одно число против вектора функции medfilt1. Википедия идет немного дальше, где они показывают скользящее окно, через которое можно использовать функцию медианы. Тем не менее, я не совсем уверен, что именно этим занимается MATLAB.

Как переписать функцию medfilt1 (вектор данных и порядок 100) безопасным для кодгена способом?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вот реализация, использующая скользящее окно median в a для l oop:

Реализация скользящего окна проста.
Существует небольшое осложнение в отношении полей.
Реализация дополняет поля нулями (заполнение по умолчанию medfilt1).

Вот реализация и тест:

n = 100;

%Test using an array of random elements.
A = rand(1, 1000);

B = my_medfilt1(A, n);

%Reference for testing
refB = medfilt1(A, n);

%Display 1 if result of my_medfilt1 is the same as medfilt1
is_equal = all(B == refB)


function y = my_medfilt1(x, n)
%Perform one dimensional median filter in a loop.
%Assume x is one dimensional row vector.
if size(x, 1) > 1
    error('x must be a row vector')
end

y = zeros(1, length(x)); %Initialize space for storing resut

%Add n/2 zeros from each side of x (this is the default padding of medfilt1.
x = padarray(x, [0, floor(n/2)], 0, 'both');

%Sliding window
for i = 1:length(y)
    y(i) = median(x(i:i+n-1));
end

end
1 голос
/ 05 января 2020

Если поддерживается 2d-фильтр, вы можете использовать его повторно.

x=rand(100,1);
y1=medfilt1(x,11);
y2=medfilt2(x,[11,1]);
all(y1==y2)

В противном случае прочтите, что делает медианный фильтр. Он заменяет элемент медианой его и окружающих его соседей. Размер окрестности - ваш параметр n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...