如何创建频率与时间图?

信息处理 傅里叶变换 频率 转变
2022-01-10 15:55:31

我是化学工程师,不是 EE,所以这有点困难。

我试图弄清楚如何获取幅度与时间的数据并将其转换为频率与时间的关系。我的第一直觉是将我的数据切成块,对每个块执行 FFT,然后绘制它。不幸的是,随着每个片段的持续时间接近于零,不再有足够的信息来获得准确的频率信息(低频需要的不仅仅是非常小的时间片段)。所以......我该怎么做?我敢肯定这是某人已经解决的某种著名问题。

这是我正在寻找的那种变换,用声波(钢琴音符 G)说明。如您所见,此图由三个轴组成,第三个由颜色表示。

谢谢!

在此处输入图像描述

2个回答

时间与频率的分辨率是一个众所周知的问题,并且确实有克服它的方法。对于音频信号,一些常用的技术包括:参数方法;自适应分辨率(分析各种时间/频率配置并将结果拼凑在一起 - Wen X. 和 M. Sandler,“使用多个傅立叶变换的复合频谱图”);过完备基上的小波/分解;并使用相位信息来提取频率峰值的精确位置(IFgram)。

但是,您显示的图表似乎没有使用其中一些技术;所以我怀疑这不是你可能要找的。水平轴上似乎有一些“拖尾”(例如在 t=1.2s 时),这是一个明确的信号,表明分析已经完成,块之间有很高的重叠。

实际上,如果允许帧重叠,则块持续时间和每秒分析帧数不必相互关联。因此,如果您想使用 40 毫秒长的分析帧,您的网格不必是:

第一帧:t=0..t=40ms;第 2 帧:t=40ms..t=80ms

很可能是:

第一帧:t=0..t=40ms;第 2 帧:t=10ms..t=50ms

这种重叠可以产生更高时间分辨率的错觉,而不会过多地减小 FFT 窗口大小。请注意,这只能帮助在时间轴上准确定位一个事件 - 它无助于解决两个时间接近的事件......就像增加 FFT 大小可能有助于识别频率峰值的位置,但不能帮助两个相邻频率峰值的分辨率。

是的,很多人都从事过时频分析。

“将我的数据切成块,对每个块执行 FFT”的方法是一个好主意。在执行 FFT 之前对每个块应用“窗口函数”有助于避免许多伪影。允许块重叠也有帮助。经过这些调整,您最终得到了Gabor 变换,这似乎是最流行的短时傅里叶变换 (STFT)。

正如您已经指出的那样,并且正如维基百科文章所指出的那样,所有短时傅里叶变换技术都有一个权衡:

  • 当您将时间序列切割成非常短的片段时,您可以获得关于音调何时开始和停止的高度精确的时间信息,但频率信息非常模糊。
  • 当您将时间序列切成很长的片段时,您可以获得关于音调确切频率的高度精确的频率信息,但它开始和停止的确切时间是模糊的。

这是一个著名的问题,但可惜的是,它不仅没有得到解决,而且已经证明两者之间的不确定性是不可避免的——Gabor 极限、Heisenberg-Gabor 极限、测不准原理等。

如果我是你,我会从许多现成的库之一开始计算 Gabor 变换,并尝试将时间序列切割成各种长度。很有可能你会很幸运,你最终会得到一些长度,可以提供足够的时间定位和足够的频率识别。

如果这对这个应用程序不起作用,那么我将转向其他时间频率表示时间频率分析方法——小波变换、chirplet 变换分数傅里叶变换(FRFT) 等。

编辑:一些从音频数据生成频谱图/瀑布图的源代码:

Image to Spectrogram与上述实用程序的方向相反。