FFT: 将样本匹配到频率

3
假设:
  • 我有一个向量 t,其中包含我的样本时间(以秒为单位)。(这些样本在时间域上不是等间隔分布的。)

  • 另外,我有一个向量 data,其中包括在时间 t 时刻的样本值。

  • t 和 data 长度相同。

如果绘制图表,则会获得某种周期性信号。

现在,我可以执行 abs(fft(data)) 来获取我的频谱,然后将其绘制在 x 轴上的数据点数量上。

如何根据向量 t 中的时间获得频谱并进行绘制?我想看到信号中包含哪些以 s 为单位的频率或周期。

感谢您的帮助。


3
这更适合于http://dsp.stackexchange.com。但我认为傅里叶变换并不适用于这个问题,至少在其基本形式中,它假设样本在时间上均匀分布。 - mtrw
2个回答

4

[非提问者意图]: FFT将为任意数量的输入数据点提供全局频谱。您不能将特定数据点(在时间上)与部分(或全部)频谱关联。

相反,您可以使用spectrogram并获取短时傅里叶变换(STFT)。这将为您提供一个NxM离散的时间-频率FT值网格(N:FT频率bin,M:信号时间窗口)。

通过将(重叠的)STFT窗口局限于感兴趣的数据样本上,您将获得N个频率幅度值,从而得到随着信号随时间变化的短期频谱估计分布

此外,还可以参考此可能相关的答案:https://stackoverflow.com/a/12085728/651951

编辑/更新

对于不均匀间隔的数据,您需要考虑使用非均匀DFT(以及非均匀FFT实现)。请参见相关问题/答案https://scicomp.stackexchange.com/q/593 NFFT或NUFFT的主要方法是通过局部卷积/插值创建均匀网格,在此基础上运行FFT并撤消插值滤波器的卷积效应。
您可以阅读更多:

如果需要一个与MATLAB接口的实现,可以尝试使用NFFT及其可能的并行版本PNFFT。你可以在这里找到一个很好的指南,了解如何设置和使用


嗨,我实际上想要获取我的信号的全局频谱并找出其频率。因此,STFT似乎不合适,因为我只会在短时间内得到频率。 我唯一的问题是,由于我的数据点未经等间隔采样,因此我无法识别频率。你知道我的意思吗? - Vladimir S.
@Vladimir S. 对不起,我以为你对临时本地化FT感兴趣。更新了我的答案,反映了一些关于你原来的问题和NFFT的想法。谢谢! - gevang

2
你可以重新采样或插值你的样本点,以获得另一组在时间上等间距的样本点。第二组等间距样本点的选择间距或采样率将使你能够推断出FFT结果中的频率。
除非初始数据集被带限制到足够低的频率以允许插值,否则结果可能会有噪声或包含混叠。如果是带限制的,则可以尝试像三次样条这样的插值方法。
尽管看起来通过重新采样为更多数据点可以获得高FFT bin频率分辨率,但实际的有用分辨率精度将更相关于原始样本数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接