如何实施c o n v ( x , h )conv(x,h)在 MATLAB 中不使用循环?

信息处理 matlab 卷积 反卷积
2022-02-08 01:57:51

我试图在不使用循环的情况下计算 MATLAB 中两个给定向量的卷积,当然也不使用函数conv本身,但我无法删除我在下面的代码中使用的最后一个循环。任何提示将不胜感激。

function [ convolve ] = myconv( x,y)
%This function calculate the convolution of the two inputs
lx=length(x);
ly=length(y);
lt=lx+ly;
x=[x zeros(1,ly)];
y=[y zeros(1,lx)];
convolve=zeros;
for n=2:lt
    convolve(n-1)=sum(x(1:n-1).*fliplr(y(1:n-1)));
end
1个回答

那这个呢:

function [convolve] = myconv(x, y)
    L = length(x) + length(y) - 1
    convolve = ifft(fft(x, L) .* fft(y, L));
end

使用卷积定理。

关于 deconv 功能,请查看:

x = randn(10,1);
y = randn(10,1);

L = length(x) + length(y) - 1;

z = ifft(fft(x, L) .* fft(y, L));
z2 = conv(x, y);
sum(abs(z-z2))

x2 = ifft(fft(z, L) ./ fft(y, L));
x3 = deconv(z, y);
x0 = [x; zeros(L-length(x),1)];
sum(abs(x0-x2))
sum(abs(x3-x))

程序输出:

ans =

   1.1616e-14

ans =

   5.4956e-15


ans =

   2.3924e-12

第一个总和计算 conv 和我的建议之间的偏差。第二个和显示了傅里叶域去卷积序列和原始序列之间的差异(请注意,FFT 的输出有 L 个样本,其中最后的 L-len(x) 个样本为 0)。第三个 sum 比较 deconv 的输出和原始序列。您会看到它们都与浮点错误相匹配。