【问题标题】:FFTW 3.3.3 basic usage with real datasFFTW 3.3.3 真实数据的基本用法
【发布时间】:2014-01-12 17:52:34
【问题描述】:

我是 FFT 的新手,我被要求找到一种方法来分析/处理石油钻井平台收集的一组特定数据。 由于钻机移动(例如潮汐和波浪的上下波动),收集的数据中有很多噪音。 我被要求用 FFT=>filtering=>IFFT 清理收集的数据。

我使用 C++ 和 FFTW 3.3.3 库。

一个例子比什么都好:

我有一个数据库,例如泥流(升/分钟)。泥流每 5 秒收集一次,每个度量的 DB 中都有一个时间戳(例如 1387411235)。

所以我的 FFT 的 IN_data 是一对时间戳/泥流(例如 1387456630/3955.94、1387456635/3954.92 等...)

显示这些数据确实看起来像一个嘈杂的声音信号,相关事件可能会被噪音掩盖。

使用在 Internet 上找到的示例,我可以设法执行 FFT,但我缺乏知识和理解是一个大问题,因为我从未从事过信号处理和傅立叶变换。

我真的不知道如何开始这项工作,使用哪个版本的 FFTW 例程(c2c、r2c 等...),如果有任何数据前处理和/或后处理处理要做。 我在互联网上阅读了很多示例和教程,但我是法国人(抱歉我在这里犯了错误),这对我来说并不总是有意义,尤其是对于 OUT_data 单元、OUT_data 类型、输入和输出数据数组大小,窗口化(顺便说一句),简而言之我迷路了......

我想我的问题对于习惯 FFTW 的人来说会很简单,但对我来说现在就非常复杂了。

所以我的问题:

  • 在两种方式(FFT 和 IFFT)中使用什么 FFTW 例程(IN_data 和 OUT_data 数组的种类、类型和大小)。
  • 如何解释结果数组(FFTW 将返回的单位是什么)。

现在我所做的一个简短示例是:

fftw_plan p;
p  = (fftw_plan)fftw_plan_dft_1d(size,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
fftw_execute(p);
fftw_destroy_plan(p);

使用“in”和“out”作为 fftw_complex(我的 In_data 数组的复数元素为每个数据设置为 1,不知道为什么,但教程说要这样做)。

此代码基于互联网上的一个示例,但我缺乏知识/理解是一个很大的拖累,我想知道这里是否有人可以给我解释/工作流程/见解/链接如何拉这个出去。

我正处于新工作的试用期,我真的很想为我的老板实现这个功能,即使这意味着四处寻求帮助,我在这里看到了很多 FFTW 熟练的帖子......

【问题讨论】:

  • 不要为自己是法国人而道歉 ;)
  • 对于我缺乏技能/知识的朋友,我深表歉意……但还是谢谢……
  • FFTW 对于一个完整的 DSP 菜鸟来说是一个相当复杂的包 - 我建议从更简单的东西开始,例如KissFFT。此外,您需要确定您的数据是均匀采样的,否则基于 FFT 的方法将无法正常工作。
  • 感谢 Paul 的回答,测量每 5 秒进行一次,所以我猜采样是统一的(在极少数情况下,未收集数据,但数据库中始终存在相应的时间戳)。
  • 好的 - 我的观点是,对于均匀采样的数据,样本之间的间隔必须正好为 5 秒,并且不能丢失数据点,否则您将需要比 FFT 更复杂的方法。

标签: c++ fftw


【解决方案1】:

对于完全不熟悉 DSP 的人来说,这是一个雄心勃勃的项目,但您可以从阅读 overlap-add 方法开始,这基本上是您的 FFT-filter-IFFT 方法清理此问题所需的方法数据。您还应该查看 DSP StackExchange 站点 dsp.stackexchange.com,其中的几个类似问题/答案中介绍了频域滤波的理论背景和应用。

【讨论】:

  • 再次感谢 Paul,我知道这是雄心勃勃的,但正如一位著名人士曾经说过的那样:“我们选择去......不是因为它容易,而是因为它很难”。我会研究 KissFFT,但 FFTW 看起来非常高效,处理这个“信号”必须与处理音频信号相同(尽管采样率要大得多)。这里有很多关于音频处理的问题,而且通常你的答案似乎对丢失的人有用......我可以使用音频线程来深入研究 FFTW 的这个问题吗?
  • KissFFT 也非常有效 - 对于采样率低的地震数据,您可能也不需要过多担心效率,因此让某些东西工作可能更重要。您甚至可以考虑首先在 MATLAB(或其免费等效的 Octave)中进行原型设计,因为这将非常快速地实现,并且您将在此过程中学到很多东西并获得信心,然后再继续使用您的 C/C++ 实现选择的 FFT 库。
  • 是的,我正在研究 KissFFT,这似乎是一种更简单的方法。我会这样做的,你是熟练的,我应该听你的。
  • 不错的选择 - 与 FFTW 不同,KissFFT 也没有潜在的棘手许可问题。如果您决定做出错误的选择,您可以随时更改 FFT 库 - 就您的实现而言,它实际上只是一个“黑匣子”。另请注意,KissFFT 作者参与了 StackOverflow。
  • 你需要在时间分辨率和频率分辨率之间找到一个平衡点。这在某种程度上与海森堡的不确定性有关。您需要一个长窗口来确定频率事件,但需要一个短窗口来确定时间事件的位置。 -- 出于这个原因,发明了 Gabor 变换和后来的小波变换。使用具有连续窗函数的滑动窗类似于 Gabor 变换的思想。 -- 你需要想象一下,在FFT中,窗口的末端被环绕到开始,如果发生跳转,FFT将包含人为的缺陷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多