【问题标题】:Finding the convolution kernel in matlab在matlab中找到卷积核
【发布时间】:2011-12-12 17:28:24
【问题描述】:

我有两个空间数据向量(每个向量的长度约为 2000 个元素)。一个是另一个的卷积版本。我正在尝试确定会产生这种卷积的内核。我知道我可以通过找到输出和输入向量的傅里叶变换比率的傅里叶逆变换来做到这一点。事实上,当我这样做时,我或多或少地得到了我所期望的形状。然而,我的核向量与两个输入向量具有相同的维度,而实际上卷积只使用了大约五分之一(~300-400)的点。我得到了正确的形状但点数错误的事实使我认为我没有完全正确地使用 ifft 和 fft 函数。似乎如果我真的在做正确的事情,这应该自然而然地发生。目前我只是在做;

FTInput = fft(in);
FtOutput = fft(out);
kernel = ifft(FtOutput./FTInput).

这是正确的,是我正确解释输出向量还是我过度简化了任务?我确定是后者,只是不知道在哪里。

谢谢

【问题讨论】:

  • 您可能会在 dsp.stackexchange.com 上询问。这是一个系统识别问题。有两个问题:您在此处采用的方法通过与数据长度相同的 FIR 滤波器对系统进行建模,这可能是也可能不是一个好的模型。如果您的输入和输出信号完全被噪声破坏,例如通过模拟传感器数字化,噪声往往会影响您的答案。

标签: matlab signal-processing


【解决方案1】:

你做对了,这不是错误。

在给定干净和卷积数据的情况下估计卷积滤波器的问题非常困难。给定“不错”的数据,您可能会得到正确的形状,但检索卷积滤波器的真正支持(即在它们应该在的地方得到零)不会自然发生。

【讨论】:

  • 感谢这实际上与我正在做的事情有点相切,更多的是交叉检查。看起来它可能永远不会像我试图交叉检查的测量那样好。
【解决方案2】:

我认为您的“问题”来自您忽略的离散卷积所需的固有填充

通过除以傅里叶,您假设您的卷积是在空间中使用循环填充进行的(或者您的卷积是通过傅里叶中的乘法进行的,两者都是等价的)但是如果您的卷积是在空间域中计算的,则为零最有可能使用填充。

s=[1 2 3 4 5] //signal

f=[0 1 2 1 0] //filter

s0=s *conv0* f=[4 8 12 16 14] //convolution with zero padding in spatial domain, truncated to signal length
sc=s *convc* f=[9 8 12 16 15] //convolution with cyclic padding in spatial domain, truncated to signal length

S,S0,Sc, the ffts of s,s0,sc

approx0=ifft(S0./S)=[-0.08 1.12 2.72 -0.08 -0.08]

approxc=ifft(Sc./S)=[0 1 2 1 0] 

【讨论】:

    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多