我正在尝试使用 python 中的傅立叶方法对信号进行重新采样,使用np.fft.rfft()
and np.fft.irfft()
。(我没有使用scipy.signal.resample()
,因为在我的最终应用程序中,我需要对频域中的信号做更多的事情,而window
不是scipy.signal.resample()
. :
%pylab inline
N = 16
P = 8
S = [0.49, 1.68, 0.78, 0.05, 0.21, 0.29, 1.34, 1.17, 16.73,
48.78, 16.90, 0.62, 0.40, 1.60, 0.86, 0.57]
assert len(S) == N
figure(figsize=(14, 5))
plot(np.arange(N), S, '.')
dft = np.fft.rfft(S)
plot(np.arange(N), np.fft.irfft(dft), '-')
dft *= P
dft.resize(P*N/2+1)
plot(np.arange(P*N)/P, np.fft.irfft(dft), '-')
xlim(6.5, 11.5)
ylim(-5, 55);
这是我回来的:
如您所见,结果看起来几乎是正确的,但还是有一点偏差。(重新采样的红色曲线不会经过原始采样点,即使在与原始信号相同的时间位置存在采样点。)
绿线表示在扩展和缩放dft
数组之前一切正常。所以问题似乎出在实际的重采样中:
dft *= P
dft.resize(P*N/2+1)
plot(np.arange(P*N)/P, np.fft.irfft(dft), '-')
我看不出这个结果在数学上是如何可能的,因为除了时间和幅度轴的缩放之外,向阵列的高频端dft
添加零只会向信号的傅立叶级数展开添加零项。所以信号应该仍然通过原始样本值。
但是我看到的小错误似乎与缩放无关:有时重新采样的波形落后于原始波形(t=8),有时更快(t=10),有时幅度更大(t=7, 9,11),有时它更小(t = 8,10)。
我已经玩了好几个小时了,但找不到我的代码有什么问题。也许我只是看不到它,因为我已经盯着它看了很长时间了。
(有关 python FFT 实现使用的定义,请参阅np.fft
文档)
编辑(回应评论):当我用 t=9 的脉冲或快速脉冲序列替换 S 时,我得到以下信息: