matlab - MATLAB 中信号的内核 2D 卷积

标签 matlab image-processing signal-processing convolution

我想在 MATLAB 中实现信号的二维核卷积。这本质上是信号(非图像)的非线性二次滤波器,如以下公式所述:

其中k2(t1,t2)是二维卷积核。 x 是 1d [N,1] 信号向量,y 是输出 [N,1] 信号。

到目前为止,我一直在通过一种非常暴力、不优雅的方式来做到这一点。我想知道是否可以使用 MATLAB filter2/conv2 函数更有效地完成此操作!我知道这些函数是用于图像处理的,我对此不太了解,所以我希望有人能提供帮助!

最佳答案

使用 diag(conv2(x,x,k)); 时的问题是您正在计算更大的东西(整个二维矩阵),然后只保留对角线。根据信号的大小,它可能会很昂贵。您可以尝试使用

n = 500; m = 50;

x = rand(n,1);
k2 = rand(m,m);

tic; res1 = diag(conv2(x,x,k2)); toc;

tic;
res2 = zeros(n+m-1,1);
for k = 1:n+m-1
    imin = k+1-min(k,m); imax = min(k,n);
    jmin = max(1,k-n+1); jmax = min(k,m);
    res2(k) = x(imax:-1:imin)'*k2(jmin:jmax,jmin:jmax)*x(imax:-1:imin);
end
toc;
norm(res1-res2)

在我尝试过的许多情况下,它比其他选项运行得更快。例如,一个输出可以是

>> script
Elapsed time is 0.012753 seconds.
Elapsed time is 0.006541 seconds.

ans =

   1.5059e-12

我不知道你的信号或内核有多大,所以你可以尝试一下。

关于matlab - MATLAB 中信号的内核 2D 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686781/

相关文章:

matlab - 如何在 MATLAB 中生成矩阵,其中值随着坐标的增加而减小

matlab - 是否可以使用 histogram() 而不是 hist() 在 Matlab 中并排绘制多列直方图

python - Python 中的带通滤波器形状

c++ - 英特尔 SSE 的斜坡函数

arrays - 在 MATLAB 向量中的固定数量的非零元素之间插入选定数量的零

function - 在 MATLAB 中,如何方便地为一个函数提供多个参数?

java - 图像处理

opencv - 多 otsu(多阈值)与 openCV

delphi - DELPHI 和 Opencv 中的不兼容类型

c++ - 以编程方式增加麦克风增益