首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“扩展”IFFT

“扩展”IFFT
EN

Stack Overflow用户
提问于 2013-03-05 04:24:59
回答 3查看 2K关注 0票数 7

如果我有一个波形x,如

代码语言:javascript
复制
x = [math.sin(W*t + Ph) for t in range(16)]

用任意WPh计算其(实) FFT f

代码语言:javascript
复制
f = numpy.fft.rfft(x)

我可以获得原始的x

代码语言:javascript
复制
numpy.fft.irfft(f)

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

换句话说,如果FFT的输入是一个在f(t)上采样的无限函数f(t),那么如何恢复 t<0 t>=N**?**的值?

注:我使用了一个完美的正弦波作为例子,但实际上x可以是任何东西:任意信号,比如x = range(16)x = np.random.rand(16),或者从随机.wav文件中提取的任意长度的片段。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 14:32:45

现在,如果我需要将恢复的波形的范围扩大到左边和右边的几个样本,该怎么办?也就是说,连(Y) == 48,y16:32 == x和y0:16,y32:48的波形y是原始波形的周期扩展。

周期扩张也就是x,因为它是周期扩张。

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

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

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

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

也许你可以利用线性预测。根据片段的加窗自相关和莱文森-杜宾递推计算几个线性预测系数,并利用这些预测系数进行外推。然而,对于一个稳定的预测滤波器,预测将收敛到零,收敛速度取决于你有什么样的信号。例如,白噪声的理想线性预测系数都为零。在这种情况下,您可以将零“外推”到左边和右边。但你对此无能为力。如果你有白噪声,在你的片段中没有关于周围样本的信息,因为所有的样本都是独立的(这就是白噪声的意义)。

这种线性预测实际上能够很好地预测正弦样本。因此,如果您的输入是sin(W*t+p),对于任意的W和p,则只需要二阶线性预测。对于更复杂的信号,我建议排序为10或16。

票数 3
EN

Stack Overflow用户

发布于 2013-03-05 05:35:52

下面的例子应该会给您一个关于如何解决这个问题的好主意:

代码语言:javascript
复制
>>> 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副本:

代码语言:javascript
复制
np.concatenate((np.fft.irfft(f),) * 3)

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

代码语言:javascript
复制
>>> 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.])
票数 3
EN

Stack Overflow用户

发布于 2013-03-05 19:11:25

对于在FFT孔径或长度中周期性的平稳波形,你只需循环重复波形,或者IFFT(FFT())重新合成的等效波形,在时域上扩展它们。对于在FFT孔径或长度上不是周期的源在时间上守恒的波形,FFT的结果将是与Sinc函数相交的频谱。因此,需要某种相当于反卷积的方法来恢复原始的未加窗口的光谱内容。由于这种反褶积是困难的或不可能的,所以通常采用一种分析/再综合的方法,例如相位声码器或其他频率估计器。然后,这些估计的频率,可能与单个原始FFT结果中的频率不同,可以输入一组正弦合成器、一组相位修正的IFFT或其他再合成方法,以产生一个较长的波形,其频谱含量大致相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15215790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档