我的问题是关于信号的输入大小,它不是2的幂,因此我们必须对它进行滤波。一些解决方案说,假设如果我们要取1800的fft,则应将其零填充到2048的长度以使其为2的幂,然后应用基数2算法。但是,还有其他解决方案,它们应用了不使用零填充的不同算法的组合,然后计算所需的FFT。我的问题是,如果我们使用不同算法的组合来计算大小1800的ftf,那么在必须取1800的fft的情况下,将信号零填充到2048的长度是否会导致结果有所不同。结果将是相同的。

评论

所得的FFT将有所不同:您将以$ n = 0的$ 2 \ pi n / 2048 $计算它们,而不是以$ 2 \ pi n / 1800 $的频率计算FFT,而$ n = 0 \ ldots 1799 $ \ ldots 2047美元。但是,信息不会降级。

那么,这意味着这两种方法都是正确的吗?但是您建议在实用性方面哪个更好?

是的,这两种方法都是正确的。我会使用“最低能耗解决方案”(即最简单,最懒惰的解决方案)。通常这将使用2048长度转换。

我在文学和书籍中已经看到人们建议将其零填充以使其具有2的功效。
假设您的数据在x中。表格X = fft(x,123456); (或其他一些奇怪的长度)。找出xx = ifft(X);。看什么sum(abs(x-xx(1:length(x))));是。

#1 楼

所得的FFT将有所不同:您将以$ 2 \ pi n / 2048 \计算它们,而不是针对$ n = 0 \ ldots 1799 \\ $计算频率$ 2 \ pi n / 1800 \ \ $的FFT。 $代表$ n = 0 \ ldots 2047 \ \ $。但是,信息不会降级。

两种方法都是正确的:使用1800或2048。我将使用“最小能量解决方案”(即最简单,最懒惰的解决方案)。人们通常会使用2048长度的转换。

人们倾向于使用radix-2转换,因为他们对此并不了解。关于FFT的功效似乎有2的幂的错误信息。没有这样的约束。另外,他们可能不了解像样的非基数2算法,例如FFTW和其他库中可用的算法。 br />

假设您的长度为1800的数据在x中。格式X = fft(x,2048);(或其他不同于1800的长度)。
查找xx = ifft(X);
请参阅sum(abs(x-xx(1:1800)));


另请参阅此问题及其答案。

评论


$ \ begingroup $
当我这样做时...它只是给我一个数字,但没有通过图形进行比较。很抱歉,但是我在matlab中不是很好,因为我在C中实现了所有功能。
$ \ endgroup $
– D X
13年4月23日在7:49

#2 楼

需要了解的是,由于结果(和来源)是谨慎的,因此FFT并不是真正的傅立叶变换,而是实际上的傅立叶级数开发。这意味着任何FFT的结果都不是单个数据块的变换,而是周期信号的变换,该周期信号由相同数据块的无限级数组成,有无间距由填充长度。 (假设我的分析数据看起来像“ m”,则转换将是“ ... mmmmm ...”或“ ... mmmmmm ...”的发展,它们不是同一信号。) br />
因此,没有填充手段将隐式地在源数据中添加或消除源于高频的毛刺,该毛刺是由于一个块的末尾与下一个块的开始的不连续性而引起的(一样)。极端的例子是分析包含所有相同值的块。不填充的填充将使连续信号与矩形信号有所不同。

另一个结果是,填充时间越长,单个信号的转换结果越接近数据突发,并且转换的分辨率越高。说过去,这不会完全准确,信息不会降低。由于舍入错误,将(以有限的方式)存在问题,并且使用更长的缓冲区可能有助于防止(再次以非常有限的方式)。