是的,划分两个 FFT 光谱是可能的,实际上在 python 中很容易实现(但有一些警告)。简单地说:由于两个时间信号的卷积对应于将它们的光谱相乘,反之亦然,可以通过划分光谱来实现反卷积。
这是使用 numpy 进行简单反卷积的示例:
(x
是您的激励扫描信号,y
是记录的扫描信号,您希望从中获得脉冲响应。)
import numpy as np
from numpy.fft import rfft, irfft
# define length of FFT (zero padding): at least double length of input
input_length = np.size(x)
n = np.ceil(np.log2(input_length)) + 1
N_fft = int(pow(2, n))
# transform
# real fft: N real input -> N/2+1 complex output (single sided spectrum)
# real ifft: N/2+1 complex input -> N real output
X_f = rfft(x, N_fft)
Y_f = rfft(x, N_fft)
# deconvolve
H = Y_f / X_f
# backward transform
h = irfft(H, N_fft)
# truncate to original length
h = h[:input_length]
这个简单的解决方案是一个实用的解决方案,但可以(并且应该)改进。一个问题是,在 X_f 具有低幅度的那些频率下,您将获得本底噪声的提升。例如,如果您的指数正弦扫描从 100Hz 开始,对于低于该频率的频率区间,您会得到(几乎)零的除法。一个简单的可能解决方案是首先反转 X_f,应用带限滤波器(高通+低通)以移除“增强区域”,然后将其与 Y_f 相乘:
# deconvolve
Xinv_f = 1 / X_f
Xinv_f = Xinv_f * bandlimit_filter
H = Y_f * Xinv_f
关于失真:指数正弦扫描的一个很好的特性是测量期间产生的谐波失真(例如,扬声器中的非线性)将在反卷积后的“主”响应之前产生较小的“侧”响应(有关更多详细信息,请参阅此) . 这些侧面响应是失真产物,可以通过时间窗口简单地去除。如果“主要”响应没有延迟(从 t=0 开始),这些侧面响应将出现在整个 iFFT 的末尾,因此您可以通过将后半部分窗口化来删除它们。
从信号理论的角度来看,我不能保证这是 100% 正确的,但我认为它说明了这一点并且有效;)