两个 FIR 的反卷积

信息处理 有限脉冲响应 反卷积
2022-01-30 02:41:44

基本问题:在频域中解卷积两个因果 FIR(即使用 FFT)的“正确”方法是什么,它们都不是最小相位,但都可以被认为具有稳定的精确逆?我所说的“正确”是指如何避免时间混叠错误?如果没有“正确”的方法,那么最好的方法是什么?

一些背景:给定两个因果 FIR,在频域卷积它们时很容易避免时间混叠,方法是首先用尾随零适当地填充 IR(即通过标准 DSP 文本中讨论的 FFT 执行线性卷积)。但是,当 FIR 可能不是最小相位时,我不清楚如何为反卷积做类似的事情。

从因果 FIR(最小相位或非最小相位)中解卷积最小相位 FIR 似乎很简单,因为我们可以计算最小相位 FIR 的精确倒数(我们知道这将是因果和稳定的),然后将此倒数与另一个逆线性卷积冷杉。

然而,由于不是最小相位的因果 FIR 的精确逆是非因果的(假设逆是 BIBO 稳定的 - 我们强制逆具有有限长度),因此在计算逆后使用 FFT 执行线性卷积不会使有意义,因为用尾随零填充非因果逆是没有意义的。

结果有些令人费解的相关示例:线性卷积以产生然后,我从每个以尝试重现每个为此,我用尾随零匹配,计算填充的精确逆,然后将逆与循环卷积。跨列图之间的相关差异是信号具有不同数量的尾随零(x1x2i (i=1,2,3)yix1yix2ix1yix1yix2ii表示尾随零的数量)。任何人都可以解释为什么第 1 列和第 3 列中的结果似乎合理,但第 2 列中的结果不合理吗?此外,这似乎是对两个信号进行反卷积的合理方法,但获得的结果并不总是令人满意(如本例所示)。有什么想法吗?

注意:在绘图标题中,我使用表示线性卷积和表示反卷积(所有这些都在频域中完成,如上所述)。/

谢谢!

例子

1个回答

我不确定为什么这个x22例子会出现问题,但我相信问题是因为反卷积没有在正确的长度上执行。

FIR 的反卷积(反转 FIR)通常需要使用无限持续时间的脉冲响应进行卷积。因此,在使用 FFT 执行反卷积时仅使用默认长度可能不会生成正确的结果。

我在 R 中实现了同样的问题,但最后(附加)行显示了如果我对比默认值更长的信号进行反卷积所获得的结果。这会产生正确的结果。

在此处输入图像描述

如您所见,我的实现为示例生成了奇怪的结果,x21而不是x22您的示例。


下面的R代码

x1 <- c(0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0)
x21 <- c(0,1,1,1,0)
x22 <- c(0,1,1,1,0,0)
x23 <- c(0,1,1,1,0,0,0)

my_conv <- function(x,y)
{
  out_length <- length(x)+length(y)-1
  x_pad <- c(x,rep(0,out_length-length(x)))
  y_pad <- c(y,rep(0,out_length-length(y)))

  z <- Re(fft(fft(x_pad) * fft(y_pad),inverse=TRUE))

  return(z/out_length)
}

my_deconv <- function(x,y, out_length=0)
{
  if (out_length == 0)
  {
    out_length <- length(x)+length(y)-1
  }
  x_pad <- c(x,rep(0,out_length-length(x)))
  y_pad <- c(y,rep(0,out_length-length(y)))

  z <- Re(fft(fft(x_pad) / fft(y_pad),inverse=TRUE))

  return(z/out_length)
}

par(mfrow=c(5,3))
plot(x1)
plot(x1)
plot(x1)
plot(x21)
plot(x22)
plot(x23)
y1 <- my_conv(x1,x21)
plot(y1)
y2 <- my_conv(x1,x22)
plot(y2)
y3 <- my_conv(x1,x23)
plot(y3)
plot(my_deconv(y1,x1))
plot(my_deconv(y2,x1))
plot(my_deconv(y3,x1))
plot(my_deconv(y1,x1,50))
plot(my_deconv(y2,x1,50))
plot(my_deconv(y3,x1,50))