Qt对地震数据(文件格式*.Segd)实现将时域数据转频域数据

文件格式以segd为例,其他地震文件格式同理。

时域数据

时域数据通俗点讲就是我在某个时间段记录的一个值,然后经过一段时间后,产生的一组数据就是时域数据。

频域数据

频域数据是指信号在频率域上的表示,即信号的频率特性。频域分析是将时域信号转换为频域信号的过程,通过分析信号在不同频率上的成分和振幅来理解信号的频谱特性

时域转频域

时域转频域需要使用FFT(快速傅里叶运算)进行转化

segd文件格式就不再介绍,无非就是文件头,道头,数据位,读出原始数据,然后进行操作即可。

前期工作

Qt安装FFT可以参考这篇文章链接

Qt对Segd数据时域转频域

QVector<double> EP_Work::calculateSpectrum(const QVector<double> data)
{
    QVector<double> spectrum(data.size()/2);
    fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * data.size());
    fftw_complex *out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * data.size());
    fftw_plan plan = fftw_plan_dft_1d(data.size(), in, out, FFTW_FORWARD, FFTW_ESTIMATE);

    for (int i = 0; i < data.size(); i++) {
        in[i][0] = data[i];
        in[i][1] = 0;
    }

    fftw_execute(plan);

    for (int i = 0; i < data.size()/2; i++) {       
        double re = out[i][0];
        double im = out[i][1];

        //double p=(re * re + im * im) / N;
        double p=sqrt(re * re + im * im);
        spectrum[i] =10 * log10(p) ;  //进行指数运算,缩小最大值与最小值范围
        //spectrum[i] = sqrt(pow(out[i][0], 2) + pow(out[i][1], 2));
        //spectrum[i] = p;
    }
    fftw_destroy_plan(plan);
    fftw_free(in);
    fftw_free(out);

    return spectrum;
}

Segd波形
在这里插入图片描述

进行fft运算后的幅度谱
在这里插入图片描述
这个小工具还可进行查看功率谱,相干性,以及相位谱等。
下载地址
感谢支持,有什么不对的地方欢迎指出问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用Qt的多线程来增加一个读取数据的线程。通过创建一个继承自QThread的自定义类,并重写其run()函数,在run()函数中实现数据的读取逻辑。以下是一个示例代码: ```cpp #include <QThread> class DataThread : public QThread { Q_OBJECT public: DataThread(QObject *parent = nullptr) : QThread(parent) {} signals: void dataReady(const QString &data); protected: void run() override { // 在这里实现数据的读取逻辑 // 例如使用SEGY和SEGD格式的C源代码进行数据读取 // 并将读取到的数据发送给主线程 QString data = readData(); emit dataReady(data); } private: QString readData() { // 数据读取的具体实现 // 这里可以根据需要使用SEGY和SEGD格式的C源代码进行数据读取 // 返回读取到的数据 } }; ``` 在主线程中,您可以实例化该自定义类并连接其dataReady信号到需要处理数据的槽函数,如下所示: ```cpp DataThread dataThread; connect(&dataThread, &DataThread::dataReady, this, &YourClass::handleData); dataThread.start(); ``` 在槽函数handleData中,您可以处理读取到的数据。请注意,在Qt中,槽函数是在主线程中执行的,因此在槽函数中进行UI更新等操作是安全的。 这样,您就可以通过在单独的线程中读取数据,避免主线程卡顿的问题,并在读取完成后将数据传递给主线程进行处理。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [老歪用Qt C++写的读取SEGY和SEGD格式地震数据源码,支持波形显示和变密度显示 在Qt5.12版本上编译通过](https://download.csdn.net/download/Idealtracy/88244376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [QT多线程技术读取文档内容到程序里](https://download.csdn.net/download/szhy007/20482193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油吧,小杜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值