【问题标题】:Why do the convolution results have different lengths when performed in time domain vs in frequency domain?为什么在时域和频域中执行卷积结果的长度不同?
【发布时间】:2011-04-20 07:48:19
【问题描述】:

我不是 DSP 专家,但我知道有两种方法可以将离散时域滤波器应用于离散时域波形。第一个是在时域中对它们进行卷积,第二个是对两者进行 FFT,将两个复频谱相乘,然后对结果进行 IFFT。这些方法的一个关键区别是第二种方法是循环卷积。

例如,如果滤波器和波形都是 N 点长,第一种方法(即卷积)会产生 N+N-1 点长的结果,其中该响应的前半部分是滤波器填充第二半是过滤器排空。要获得稳态响应,滤波器的点数必须少于要滤波的波形。

用第二种方法继续这个例子,假设离散时域波形数据都是实数(不是复数),滤波器的 FFT 和波形都产生 N 点长的 FFT。乘以两个频谱 IFFT'ing 结果会产生一个时域结果,也是 N 点长。这里过滤器填满和清空的响应在时域中相互重叠,并且没有稳态响应。这就是循环卷积的效果。为了避免这种情况,通常滤波器大小会小于波形大小,并且两者都将被补零,以便在两个频谱乘积的 IFFT 之后及时扩展频率卷积的空间。

我的问题是,我经常在文献中看到知名专家/公司的作品,他们有离散(真实)时域波形(N 个点),他们对其进行 FFT,将其乘以某个滤波器(也为 N点),并将结果IFFT用于后续处理。我天真的想法是这个结果不应该包含稳态响应,因此应该包含来自过滤器填充/清空的伪影,这会导致解释结果数据时出现错误,但我一定遗漏了一些东西。在什么情况下这是一种有效的方法?

任何见解将不胜感激

【问题讨论】:

  • 这是一个这样的例子:pcisig.com/specifications/pciexpress/technical_library/…见图20(蓝色曲线是过滤FFT频谱之前,红色曲线是过滤FFT频谱之后),图21是图20中红色曲线的IFFT。
  • 请考虑更具体的标题。我发现有必要阅读所有 4 段才能对您的要求有一个模糊的概念,即使这样也不是很清楚。

标签: signal-processing fft fftw


【解决方案1】:

尽管假设矩形数据窗口在 FFT 孔径宽度处是周期性的会产生伪影,这是对没有足够零填充的圆形卷积所做的一种解释,但差异可能大到也可能不会大到足以淹没有问题的数据分析。

【讨论】:

  • 感谢 hotpaw2,某些数据当然可能不会受到太大影响,但这种做法似乎如此普遍,我很难认为所有数据都不会受到影响。通常,文献将使用窗口化来减少泄漏(例如,当采样在捕获数据的窗口中不是完全周期性的时)。然而,过滤器填充/清空导致瞬态导致额外伪影的问题从未被讨论过,这让我想知道我错过了什么。
  • 可以假设过滤器被所有周期性图像填充。可能是一个常见的假设,即来自先前图像的滤波器响应的尾部要么足够小,要么完全重叠,就好像数据确实是周期性的,FFT 孔径是周期的整数倍(有时是)。跨度>
【解决方案2】:

基本问题不在于零填充与假设的周期性,而是傅立叶分析将信号分解为正弦波,在最基本的层面上,假设其范围是无限的。 两种方法都是正确的,因为使用完整 FFT 的 IFFT 将返回准确的输入波形,而两种方法都不正确,因为使用少于完整的频谱会导致效果在边缘(通常会延伸几个波长)。唯一的区别在于你假设的细节填充了无穷大的其余部分,而不是你是否在做假设。

回到你的第一段:通常,在 DSP 中,我在使用 FFT 时遇到的最大问题是它们是非因果的,因此我通常更喜欢留在时域中,例如使用 FIR和 IIR 滤波器。

更新:

在问题陈述中,OP 正确指出了使用 FFT 过滤信号时可能出现的一些问题,例如边缘效应,在进行长度相当的卷积时可能会特别成问题(在时域)到采样波形。重要的是要注意,尽管并非所有过滤都是使用 FFT 完成的,并且 在 OP 引用的论文中,他们没有使用 FFT 过滤器,并且使用他们的方法不会出现 FFT 过滤器实现会出现的问题.

例如,考虑一个过滤器,它使用两种不同的实现来实现 128 个样本点的简单平均。

FFT:在 FFT/卷积方法中,我们将有一个样本,例如 256 个点,并将其与前半部分恒定并在后半部分变为零的 wfm 进行卷积一半。这里的问题是(即使在这个系统运行了几个周期之后),是什么决定了结果的第一个点的值? FFT 假设 wfm 是循环的(即无限周期),因此:结果的第一个点由 wfm 的 last 127 个(即未来)样本确定(跳过中间wfm),或者如果您零填充,则为 127 个零。两者都不对。

FIR:另一种方法是使用 FIR 滤波器实现平均值。例如,这里可以使用 128 个寄存器 FIFO 队列中的值的平均值。也就是说,随着每个样本点的到来,1)将其放入队列中,2)将最旧的项目出列,3)对队列中剩余的所有 128 个项目进行平均;这是您对这个样本点的结果。这种方法连续运行,一次处理一个点,并在每个样本后返回过滤结果,并且在应用于有限样本块时不会出现 FFT 出现的问题。每个结果只是当前样本和之前的 127 个样本的平均值。

OP 引用的论文采用了一种更类似于 FIR 滤波器而不是 FFT 滤波器的方法(请注意,尽管论文中的滤波器更复杂,整篇论文基本上都是对该滤波器的分析。)见,例如,this free book 描述了如何分析和应用不同的滤波器,还请注意,分析 FIR 和 IIR 滤波器的拉普拉斯方法与引用论文中的方法非常相似。

【讨论】:

  • 感谢 tom10,“(通常会扩展几个波长)。”这是我在调查过的几个测试用例中观察到的。也就是说,波形的中间 1/3'rd 在对两个频谱的乘积进行 IFFT 后显得非常稳定(例如,频率转换方法)。是否有任何理论/数学可以显示在这种方法中稳态响应变得完全有效的分界线?也就是说,我正在寻找一种方法来根据理论预测滤波后的时域波形的哪个区域(例如,滤波器 FFT 和波形 FFT 的乘积的 IFFT 的结果)是稳定的。
  • sigh... 现在我必须拿出一本书... 引用来自 Numerical Recipes 的表格:“总结一下——我们需要在数据的一端填充多个零,等于响应函数的最大正持续时间或最大负持续时间,以较大者为准。(对于持续时间 M 的对称响应函数,您只需要 M/2 个零填充。)将此操作与上述响应 rk 的填充相结合,我们有效地将数据与不希望的周期性伪影隔离开来。”参见图 13.1.14 附近的 hebb.mit.edu/courses/9.29/2002/readings/c13-1.pdf
  • 至少这回答了关于卷积的具体问题,尽管不是一般 FFT 假定周期性的一般后果。我记得,对此也有一些理论,但我不记得它。
  • 谢谢 tom10。但是,我可能没有正确传达上面的问题。请注意,FILTER 长度等于波形长度,两个 N 点长(两个数组中都没有零填充)。上面的链接过滤器长度
  • 如上所述,我的初步结果显示,如果我有一个滤波器 N 点长(无零填充)和一个波形 N 点长(无零填充),取两者的 FFT,乘以复杂的频谱,并进行 IFFT,然后查看这个时域结果,时域波形的中间 1/3(大约)看起来非常稳定(与预期结果完全匹配)。我本来希望整个时域波形是滤波器填满,并且 100% 与滤波器清空重叠。所以很高兴看到一些数组是稳定的,但我不知道为什么会发生这种情况。
【解决方案3】:

我可以解释为什么在应用 FFT 之前应用“窗口化”的原因。

正如已经指出的那样,FFT 假设我们有一个无限信号。当我们在有限时间 T 内采样时,这在数学上相当于将信号乘以一个矩形函数。

时域的乘法变成频域的卷积。矩形的频率响应是同步函数,即 sin(x)/x。分子中的 x 是最重要的,因为它在 O(1/N) 的时间内消亡。

如果您的频率分量恰好是 1/T 的倍数,则这无关紧要,因为除了频率为 1 的频率之外,同步函数在所有点都为零。

但是,如果您有一个落在 2 个点之间的正弦波,您将看到在频率点上采样的同步函数。它就像同步功能的放大版本,由卷积引起的“鬼”信号以 1/N 或 6dB/倍频程衰减。如果您的信号高于本底噪声 60db,您将看不到主信号左右 1000 个频率的噪声,它会被同步功能的“裙子”淹没。

如果您使用不同的时间窗口,您会得到不同的频率响应,例如余弦以 1/x^2 衰减,有专门的窗口用于不同的测量。汉宁窗通常用作通用窗。

关键是在不应用任何“窗口函数”时使用的矩形窗口会产生比精心选择的窗口更糟糕的伪像。即通过“扭曲”时间样本,我们在频域中获得了更好的画面,更接近于“现实”,或者更确切地说是我们期望和想要看到的“现实”。

【讨论】:

  • 你的意思是sinc函数和Hamming还是Hann窗口?
【解决方案4】:

以下是 DFT(循环卷积)与线性卷积的无零填充卷积示例。这是长度为 M=32 的序列与长度为 L=128 的序列的卷积(使用 Numpy/Matplotlib):

f = rand(32); g = rand(128)
h1 = convolve(f, g)
h2 = real(ifft(fft(f, 128)*fft(g)))
plot(h1); plot(h2,'r')
grid()

第一个 M-1 点是不同的,因为它不是零填充的,所以它短了 M-1 个点。如果您在进行块卷积,这些差异是一个问题,但是使用重叠和保存或重叠和添加等技术来克服这个问题。否则,如果您只是计算一次性过滤操作,则有效结果将从索引 M-1 开始,到索引 L-1 结束,长度为 L-M+1。

关于引用的论文,我在附录 A 中查看了他们的 MATLAB 代码。我认为他们在将 Hfinal 传递函数应用于负频率而不首先对其进行共轭时犯了一个错误。否则,您可以在他们的图表中看到时钟抖动是一个周期性信号,因此使用循环卷积可以很好地进行稳态分析。

编辑:关于共轭传递函数,PLL 具有实值脉冲响应,并且每个实值信号都具有共轭对称谱。在代码中,您可以看到他们只是使用 Hfinal[N-i] 来获得负频率而不采用共轭。我已经绘制了它们从 -50 MHz 到 50 MHz 的传递函数:

N = 150000                    # number of samples. Need >50k to get a good spectrum. 
res = 100e6/N                 # resolution of single freq point  
f = res * arange(-N/2, N/2)   # set the frequency sweep [-50MHz,50MHz), N points
s = 2j*pi*f                   # set the xfer function to complex radians 

f1 = 22e6       # define 3dB corner frequency for H1 
zeta1 = 0.54    # define peaking for H1 
f2 = 7e6        # define 3dB corner frequency for H2 
zeta2 = 0.54    # define peaking for H2    
f3 = 1.0e6      # define 3dB corner frequency for H3 

# w1 = natural frequency   
w1 = 2*pi*f1/((1 + 2*zeta1**2 + ((1 + 2*zeta1**2)**2 + 1)**0.5)**0.5)  
# H1 transfer function 
H1 = ((2*zeta1*w1*s + w1**2)/(s**2 + 2*zeta1*w1*s + w1**2))            

# w2 = natural frequency 
w2 = 2*pi*f2/((1 + 2*zeta2**2 + ((1 + 2*zeta2**2)**2 + 1)**0.5)**0.5)  
# H2 transfer function  
H2 = ((2*zeta2*w2*s + w2**2)/(s**2 + 2*zeta2*w2*s + w2**2))            

w3 = 2*pi*f3        # w3 = 3dB point for a single pole high pass function. 
H3 = s/(s+w3)       # the H3 xfer function is a high pass

Ht = 2*(H1-H2)*H3   # Final transfer based on the difference functions

subplot(311); plot(f, abs(Ht)); ylabel("abs")
subplot(312); plot(f, real(Ht)); ylabel("real")
subplot(313); plot(f, imag(Ht)); ylabel("imag")

如您所见,实部具有偶数对称性,虚部具有奇数对称性。在他们的代码中,他们只计算了对数图的正频率(足够合理)。然而,为了计算逆变换,他们通过索引 Hfinal[N-i] 使用负频率的正频率值,但忘记了共轭。

【讨论】:

  • 感谢 eryksun,感谢您的精彩情节和 cmets。我同意第一段。关于第二段,您可能是对的(我不是 DSP 专家)——您是否有任何在线或其他参考资料可以让我了解有关如何将传递函数应用于 FFT 频谱的更多信息?
  • 另外,我不确定您在上面引用了哪些图表。第 14 页之前的图表仅使用简单的正弦模型进行说明。第 27 页上的图表是时间快照,其中开始和结束时间是任意选择的(注意曲线以不同的值开始和结束)。此例程适用于真正的模拟信号,其中没有真正的周期性。周期抖动是每个时钟周期与平均时钟周期的差异。另一种思考方式:真实的模拟信号在其时钟边沿上总是有一些随机噪声,从而阻止了它的周期性。
  • 感谢 eryksun,根据您的上述分析,我倾向于同意您的观点,即他们忘记了共轭。
  • 对于33kHz分量,是扩频技术引入的,标准可选。因此,代码不能依赖于周期性信号。
  • 关于拉普拉斯xfr函数,标准提供了以拉普拉斯形式编写的所需xfr函数。我认为你的方法听起来很合理。两者最终不会产生相同的结果(或者,通过对 Laplace xfr 函数进行采样,会在哪里引入错误;为什么要避免)?
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2016-03-19
  • 2020-06-08
相关资源
最近更新 更多