我的信号可能不是周期性的。我们需要大约15个样本的样本(@ 10kHz采样率),我们需要对该信号进行FFT以获得频率内容。
问题是我们在嵌入式系统(DSP)上实现这个FFT,它提供了最大的库FFT。 1024长度。也就是说,它需要1024个数据点作为输入,并提供1024点输出。
在完整的150000点输入上获得FFT的正确方法是什么?
答案 0 :(得分:1)
您可以在每个1024点块上运行FFT并对它们求平均值,以获得较低分辨率1024点频率轴上的平均功率谱(从0到奈奎斯特频率的512个样本,fs / 2,所以大约10 Hz 10 kHz采样的分辨率)。你应该平均分量FFT的幅度(即sqrt(re ^ 2 + im ^ 2)),否则平均值将对每个子窗口内的漂移阶段敏感,这将取决于精确的正弦频率。
如果您认为周期性成分可能处于低频率,那么它将显示在15秒样本中但不会在1024 / 10k~100ms样本中完成任何循环(即,低于10 Hz左右),你可以对输入进行下采样。您可以尝试粗略的做法,平均每100个点以100 Hz采样率获得稍微失真的信号,然后将10.24秒的值打包到1024 pt序列中以传递到FFT。
您可以使用较小的下采样因子组合这两种方法,然后对连续窗口进行幅度平均。
我很困惑为什么系统只提供高达1024点的FFT - 是否存在一些内存使得访问更大的块更难?
使用1k FFT作为子程序计算128k点FFT是可能的,但是你最终会自己重新编码很多FFT。也许你应该忘记系统库,并使用一些其他的FFT实现,没有长度限制,将在你的目标上编译。它可能没有包含系统提供的所有优化,但当您将其嵌入到使用多个较短FFT的部分输出以产生长FFT所需的自定义代码中时,您可能会失去很多优势。
可能最快捷的方法是进行混合FFT(1024点使用库,然后添加代码将它们组合成128k点FFT)将采用现有的完整FFT程序(基数-2,抽取 - 输入例如,时间(DIT)例程,但是然后修改它以使用系统库进行前10个阶段,这相当于在原始信号的不同子集上计算128个单独的1024点FFT(不幸的是,连续的窗口,但部分位反转的子集),然后让其余7阶段的蝴蝶在那些部分输出上运行。你想要非常清楚地了解DIT FFT如何实现这一点。