【问题标题】:Rewrite medfilt1 MATLAB function to support codegen重写 medfilt1 MATLAB 函数以支持 codegen
【发布时间】:2020-01-06 05:15:05
【问题描述】:

我正在编写一个使用 medfilt1 函数的 MATLAB 脚本。下面是一个使用 100 顺序的示例:

  median_filter_results = medfilt1(my_data, 100);

当尝试通过 codegen 导出 MATLAB 代码时,一条错误消息指出不支持 medfilt1。查看MATLAB documentation website,我可以看出它不存在,而 medfilt2 存在。这让我觉得这个功能可能很容易重现。

在阅读this post 时,作者发表以下评论:

您可以使用 median() 函数。然后你只需要把它放在一个 for 循环中,这非常简单。

但是,我不完全确定我知道这意味着什么,因为 median 函数返回一个数字而不是 medfilt1 函数的向量。 Wikipedia 更进一步,他们显示了一个滑动窗口,通过该窗口可以使用中值函数。但是,我不太确定这就是 MATLAB 正在做的事情。

如何以代码生成安全的方式重写 medfilt1 函数(数据向量和 100 的顺序)?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这是在 for 循环中使用median 的滑动窗口的实现:

    实现滑动窗口很简单。
    关于边距有一个小问题。
    该实现用零填充边距(默认填充为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
    

    【讨论】:

    • 啊,这个解释清楚了。使理解订单和医学过滤器功能变得容易。谢谢。
    【解决方案2】:

    如果支持 2d 滤镜,您可以重新调整它的用途。

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

    否则,请阅读中值滤波器的作用。它将元素替换为它的中位数及其周围的邻居。邻域的大小是您的参数 n。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多