“扩展”IFFT

时间:2013-03-05 04:25:00

标签: python numpy signal-processing fft ifft

如果我有波形x,例如

x = [math.sin(W*t + Ph) for t in range(16)]

使用任意WPh,并使用

计算其(实际)FFT f
f = numpy.fft.rfft(x)

我可以使用

获取原始x
numpy.fft.irfft(f)

现在,如果我需要将恢复波形的范围扩展到左侧和右侧的多个样本,该怎么办?即波形y,使len(y) == 48y[16:32] == xy[0:16], y[32:48]成为原始波形的周期性扩展。

换句话说,如果FFT假设其输入是在f(t)上采样的无限函数t = 0, 1, ... N-1如何为{{1}恢复f(t)的值}和t<0

注意:我使用完美的正弦波作为示例,但实际上t>=N可能是任何内容:xx = range(16)等任意信号,或从随机x = np.random.rand(16)文件中获取的任何长度的段。

3 个答案:

答案 0 :(得分:3)

以下示例应该让您了解如何进行此操作:

>>> x1 = np.random.rand(4)
>>> x2 = np.concatenate((x1, x1))
>>> x3 = np.concatenate((x1, x1, x1))
>>> np.fft.rfft(x1)
array([ 2.30410617+0.j        , -0.89574460-0.26838271j, -0.26468792+0.j        ])
>>> np.fft.rfft(x2)
array([ 4.60821233+0.j        ,  0.00000000+0.j        ,
       -1.79148921-0.53676542j,  0.00000000+0.j        , -0.52937585+0.j        ])
>>> np.fft.rfft(x3)
array([ 6.91231850+0.j        ,  0.00000000+0.j        ,
        0.00000000+0.j        , -2.68723381-0.80514813j,
        0.00000000+0.j        ,  0.00000000+0.j        , -0.79406377+0.j        ])

当然,获得三个周期的最简单方法是在时域中连接3个反向FFT副本:

np.concatenate((np.fft.irfft(f),) * 3)

但是,如果您想要或必须在频域中执行此操作,则可以执行以下操作:

>>> a = np.arange(4)
>>> f = np.fft.rfft(a)
>>> n = 3
>>> ext_f = np.zeros(((len(f) - 1) * n + 1,), dtype=f.dtype)
>>> ext_f[::n] = f * n
>>> np.fft.irfft(ext_f)
array([ 0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.])

答案 1 :(得分:3)

  

现在,如果我需要将恢复波形的范围扩展到左侧和右侧的多个样本,该怎么办?即波形y使得len(y)== 48,y [16:32] == x和y [0:16],y [32:48]是原始波形的周期性扩展。

周期性扩展名也只是x,因为它是周期性扩展名。

  

换句话说,如果FFT假设其输入是在t = 0,1,... N-1上采样的无穷函数f(t),那么如何才能恢复t = N?

“N点FFT假设”您的信号是周期性的N周期。这是因为您的块被分解成的所有谐波基函数都是周期性的,前一个N和后续N个样本只是一个主要N个样本的副本。

如果允许W的任何值,您的输入正弦曲线将不会周期性为N.但这并不能阻止FFT函数将其分解为许多周期性正弦波的总和。并且具有周期性N的周期性正弦波的总和也将具有N的周期性。

显然,你必须重新考虑这个问题。

也许你可以利用线性预测。根据片段的窗口自相关和Levinson-Durbin递归计算几个线性预测系数,并使用这些预测系数进行外推。但是,对于稳定的预测滤波器,预测将收敛到零,收敛速度取决于您拥有的信号类型。例如,白噪声的完美线性预测系数都是零。在这种情况下,您将“向左”和“右”推断零。但是你无能为力。如果您有白噪声,则片段中没有关于周围样本的信息,因为所有样本都是独立的(这就是白噪声)。

这种线性预测实际上能够完美地预测正弦样本。因此,如果你的输入是任意W和p的sin(W * t + p),你只需要第二阶段的线性预测。对于更复杂的信号,我建议订购10或16。

答案 2 :(得分:1)

对于FFT孔径或长度周期性的固定波形,您可以循环重复波形或IFFT(FFT())重新合成的等效波形,以在时域中扩展它们。对于从FFT孔径或长度中不是周期性的源中及时丧失的波形,FFT结果将是与Sinc函数卷积的频谱。因此,需要某种等同于去卷积来恢复原始的无窗口光谱内容。由于这种去卷积是困难的或不可能的,因此最常用的是分析/再合成方法,例如相位声码器处理或其他频率估计器。然后,这些估计的频率(可能与单个原始FFT结果的区间中的那些不同)可以被馈送到一组正弦合成器,相位修改的IFFT的混合或其他重新合成方法,以产生更长的时间。具有大致相同光谱含量的波形。