Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Signal processing 为什么在时域和频域执行卷积时,卷积结果的长度不同?_Signal Processing_Fft_Fftw - Fatal编程技术网

Signal processing 为什么在时域和频域执行卷积时,卷积结果的长度不同?

Signal processing 为什么在时域和频域执行卷积时,卷积结果的长度不同?,signal-processing,fft,fftw,Signal Processing,Fft,Fftw,我不是DSP专家,但我知道有两种方法可以将离散时域滤波器应用于离散时域波形。第一种方法是在时域卷积,第二种方法是对两者进行FFT,将两个复频谱相乘,然后对结果进行IFFT。这些方法的一个关键区别是第二种方法是循环卷积 例如,如果滤波器和波形均为N点长,则第一种方法(即卷积)产生的结果为N+N-1点长,其中该响应的前半部分为滤波器填充,后半部分为滤波器清空。为了获得稳态响应,滤波器需要比要滤波的波形具有更少的点 使用第二种方法继续此示例,并假设离散时域波形数据都是真实的(不复杂),则滤波器的FFT

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

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

使用第二种方法继续此示例,并假设离散时域波形数据都是真实的(不复杂),则滤波器的FFT和波形都会产生N个点长的FFT。将两个光谱相乘,得出一个时域结果,该结果也有N个点长。在这里,过滤器填充和清空的响应在时域中相互重叠,没有稳态响应。这是循环卷积的效果。为了避免这种情况,通常滤波器尺寸将小于波形尺寸,并且两者都将进行零填充,以允许在两个频谱乘积的IFFT之后,频率卷积在时间上扩展的空间

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


尽管假设数据的矩形窗口在FFT孔径宽度处是周期性的,这是在没有足够的零填充的情况下圆卷积的一种解释,但会产生伪影,但任何见解都将受到极大的赞赏,差异可能大,也可能小到足以淹没所讨论的数据分析。

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

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

更新:

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

例如,考虑一个过滤器,它使用两种不同的实现对128个采样点进行简单平均

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

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


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

我可以解释为什么在应用FFT之前应用“加窗”

正如已经指出的,FFT假设我们有一个无限的信号。当我们拿样品过来的时候
f = rand(32); g = rand(128)
h1 = convolve(f, g)
h2 = real(ifft(fft(f, 128)*fft(g)))
plot(h1); plot(h2,'r')
grid()
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")