c++ - FFTW 3.3.3 真实数据的基本用法

标签 c++ fftw

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

我使用 C++ 和 FFTW 3.3.3 库。

一个例子比什么都好所以:

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

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

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

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

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

我想我的问题对于习惯 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,真的不知道为什么,但教程说要这样做)。

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

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

最佳答案

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

关于c++ - FFTW 3.3.3 真实数据的基本用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761715/

相关文章:

c++ - 从 sc_signal 驱动 sc_out

c++ - 二维 vector C++ 中的多于两列排序

c++ - 通过 CMake 连接 fftw3 库

c - Ada程序调用c函数interfaces.c.size_t有问题

android - 音频记录 : How can I use a common buffer to use it for processing and storing?

c++ - 打开不存在的文件时如何使 ofstream 构造函数失败?

C++ 模板运算符重载不同类型,自动返回类型

c++ - btRigidBody 底部的子弹射线转换

c++ - FFTW - 计算真正的 2D FFT,特殊要求

c - alloca 和线程安全有什么关系(如果有的话)?