12

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

例如,如果滤波器和波形都是 N 点长,则第一种方法(即卷积)会产生 N+N-1 点长的结果,其中该响应的前半部分是滤波器填满,第二部分是一半是过滤器排空。为了获得稳态响应,滤波器需要比要滤波的波形具有更少的点。

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

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

任何见解将不胜感激

4

4 回答 4

8

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

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

更新:

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

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

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

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

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

于 2010-10-03T18:23:10.243 回答
8

这是一个没有零填充的卷积示例,用于 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[Ni] 来获得负频率而不采用共轭。我绘制了从 -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[Ni] 使用负频率的正频率值,但忘记将其共轭。

于 2010-11-19T09:06:21.223 回答
2

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

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

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

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

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

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

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

于 2010-10-04T22:03:55.627 回答
1

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

于 2010-10-03T16:29:13.620 回答