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波形
Qt对地震数据(文件格式*.Segd)实现将时域数据转频域数据_第1张图片

进行fft运算后的幅度谱
Qt对地震数据(文件格式*.Segd)实现将时域数据转频域数据_第2张图片
这个小工具还可进行查看功率谱,相干性,以及相位谱等。
下载地址
感谢支持,有什么不对的地方欢迎指出问题

你可能感兴趣的:(qt,开发语言)