资讯详情

Matlab读取gprmax的out文件

out文件是hdf普通软件无法读取5格式文件。

Matlab中与hdf5相关的文件

h5read

h5read:从 HDF5 数据集读取数据 语法: :读取 HDF5 文件 filename 数据集中包含 ds 所有数据。 :从数据集中 start 开始读取指定位置的数据子集。count 参数指定沿各维度读取的元素数。 :以 stride 指定的数据集各维索引间隔返回数据子集。

h5info

返回整个 HDF5 文件的相关信息包括组、数据集和命名数据类型。 返回 HDF5 文件中指定位置的相关信息。 被迫将对象和属性名称视为强制性对象和属性名称 UTF-8 编码文本 HDF5 准确指定文件的使用 UTF-8 这种用法是不必要的。

h5disp

描述指定的显示 HDF5 元数据的文件结构。 显示文件中指定位置的元数据。 (其中 mode 是 ‘min只显示组和数据集的名称。mode 的默认值为 ‘simple它显示数据集数据和属性值。 被迫将对象和属性名称视为强制性对象和属性名称 UTF-8 编码文本 HDF5 准确指定文件的使用 UTF-8 这种用法是不必要的。

打开gprmax中的out文件

首先使用h5disp命令来查看gprmax结构和内容 在matlab中输入h5disp('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out')打开了gprmax中自带的out结果如下:

>> h5disp('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out') HDF5 cylinder_Ascan_2D.out  Group '/'      Attributes:         'gprMax':  '3.1.5'         'Title':  'A-scan from a metal cylinder buried in a dielectric half-space'         'Iterations':  637         'nx_ny_nz':  120 105 1          'dx_dy_dz':  0.002000 0.002000 0.002000          'dt':  0.000000         'nsrc':  1         'nrx':  1         'srcsteps':  0 0 0          'rxsteps':  0 0 0      Group '/rxs'          Group '/rxs/rx1'              Attributes:                 'Name':  'Rx(70,85,0)'                 'Position':  0.140000 0.170000 0.000000              Dataset 'Ex'                  Size:  637                 MaxSize:  637                 Datatype:   H5T_IEEE_F32LE (single)                 ChunkSize:  []                 Filter:  none
                FillValue:  0.000000
            Dataset 'Ey' 
                Size:  637
                MaxSize:  637
                Datatype:   H5T_IEEE_F32LE (single)
                ChunkSize:  []
                Filters:  none
                FillValue:  0.000000
            Dataset 'Ez' 
                Size:  637
                MaxSize:  637
                Datatype:   H5T_IEEE_F32LE (single)
                ChunkSize:  []
                Filters:  none
                FillValue:  0.000000
            Dataset 'Hx' 
                Size:  637
                MaxSize:  637
                Datatype:   H5T_IEEE_F32LE (single)
                ChunkSize:  []
                Filters:  none
                FillValue:  0.000000
            Dataset 'Hy' 
                Size:  637
                MaxSize:  637
                Datatype:   H5T_IEEE_F32LE (single)
                ChunkSize:  []
                Filters:  none
                FillValue:  0.000000
            Dataset 'Hz' 
                Size:  637
                MaxSize:  637
                Datatype:   H5T_IEEE_F32LE (single)
                ChunkSize:  []
                Filters:  none
                FillValue:  0.000000
    Group '/srcs' 
        Group '/srcs/src1' 
            Attributes:
                'Type':  'HertzianDipole'
                'Position':  0.100000 0.170000 0.000000 
>> 

从代码中我们可以看到该out文件的基本结构,首先在最外层是一个Group,在这个Group中又包含了Attribute和两个Group,在这个Group中又包含Group、Attribute和Dataset。Attributes里面包含了正演模拟的基本信息:gprmax版本、文件名、迭代次数、网格数、网格步长、采样时间间隔、发射点个数、接受点个数、移动步长等信息。两个子group里面包含了源的信息,主要有:场强数据、位置信息、规模等 然后试试h5info函数:在matlab中输入info=h5info('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out') 得到如下结果:

>> info=h5info('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out')

info = 

  包含以下字段的 struct:

      Filename: 'E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out'
          Name: '/'
        Groups: [2×1 struct]
      Datasets: []
     Datatypes: []
         Links: []
    Attributes: [10×1 struct]

>> 

可以看到使用h5info也可以来查看out文件的信息,但是明显使用h5disp查看到的信息更多,结构也更加清楚

文件结构

输出文件在根(/)处具有以下HDF5属性:

  • gprMax gprMax是用于创建输出的gprMax的版本号
  • Title 是模型的标题
  • Iterations是模型时间窗口的迭代次数
  • nx_ny_nz是一个元组,包含模型每个方向上的单元数
  • dx_dy_dz是包含空间离散化的元组,即Δx、Δy、Δz
  • dt是模型的时间步长,即Δt
  • srcsteps是用于在模型运行之间移动所有源的空间增量。
  • rxsteps是用于在模型运行之间移动所有接收器的空间增量。
  • nsrc是模型中的源总数。
  • nrx是模型中接收器的总数。

输出文件包含源(SRC)、传输线(TL)和接收器(RX)的HDF5组。在每个组中,还有与单个源/传输线/接收器相对应的其他组,例如src1、src2等… 在每个单独的rx组中有以下属性:

  • Name Name是指定的接收方的名称。否则使用“Rx(x,y,z)”,其中x,y,z是接收器的位置。
  • Position 位置是模型中接收器的x、y、z位置(以米为单位)。

在每个单独的rx组中可以有以下数据集:

  • Ex Ex是一个数组,包含接收器位置处电场x分量值的时间历史(对于模型时间窗口)。
  • Ey是一个数组,包含该接收器位置处电场y分量值的时间历史(对于模型时间窗口)。
  • Ez是一个数组,包含接收器位置处电场z分量值的时间历史(对于模型时间窗口)
  • Hx是一个数组,包含接收器位置处磁场x分量值的时间历史(对于模型时间窗口)。
  • Hy是一个数组,包含接收器位置处磁场y分量值的时间历史(对于模型时间窗口)。
  • Hz是一个数组,包含接收器位置处磁场z分量值的时间历史(对于模型时间窗口)。
  • Ix是一个可选数组,包含接收器位置处电流x分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。
  • Iy是一个可选数组,包含该接收器位置处电流y分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。
  • Iz是一个可选数组,包含该接收器位置处电流z分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。

每个src组中都有以下属性:

  • Type 是源的类型,例如赫兹偶极子、电压源等…
  • Position 是源在模型中的x、y、z位置(以米为单位)。

每个tl组中都有以下属性:

  • Position 位置是源在模型中的x、y、z位置(以米为单位)。
  • Resistance 是传输线的电阻。
  • dl是传输线的空间离散化。

每个tl组内都有以下数据集:

  • Vinc是一个数组,包含传输线中入射电压值的时间历史(对于模型时间窗)。
  • Iinc是一个数组,包含传输线中入射电流值的时间历史(对于模型时间窗口)。
  • Vtotal是一个数组,包含传输线中总(场)电压值的时间历史(对于模型时间窗口)。
  • Itotal是一个数组,包含传输线中总(场)电流值的时间历史(对于模型时间窗口)。

h5read读取文件

在matlab中输入field=h5read(‘E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out’,‘/rxs/rx1/Ex’)可以得到637x1的数据,在输入第二个参数的时候,直接取最近的group的地址,不用加外层group的名称。 附上一个读取A-scan的代码:

function [Ascan] = readgprMax()
[filename, pathname] = uigetfile('*.out', 'Select gprMax A-scan output file to plot');
fullfilename = strcat(pathname, filename);
if filename ~= 0
     header.title = h5readatt(fullfilename, '/', 'Title');
    header.iterations = double(h5readatt(fullfilename,'/', 'Iterations'));
    tmp = h5readatt(fullfilename, '/', 'dx_dy_dz');
    header.dx = tmp(1);
    header.dy = tmp(2);
    header.dz = tmp(3);
    header.dt = h5readatt(fullfilename, '/', 'dt');
    header.nsrc = h5readatt(fullfilename, '/', 'nsrc');
    header.nrx = h5readatt(fullfilename, '/', 'nrx');
    //时间向量
    time = linspace(0, (header.iterations - 1) * header.dt, header.iterations)';
    //初始化
    fields.ex = zeros(header.iterations, header.nrx);
    fields.ey = zeros(header.iterations, header.nrx);
    fields.ez = zeros(header.iterations, header.nrx);
    fields.hx = zeros(header.iterations, header.nrx);
    fields.hy = zeros(header.iterations, header.nrx);
    fields.hz = zeros(header.iterations, header.nrx);
    //赋值
    for n=1:header.nrx
        path = strcat('/rxs/rx', num2str(n));
        tmp = h5readatt(fullfilename, path, 'Position');
        header.rx(n) = tmp(1);
        header.ry(n) = tmp(2);
        header.rz(n) = tmp(3);
        path = strcat(path, '/');
        fields.ex(:,n) = h5read(fullfilename, strcat(path, 'Ex'));
        fields.ey(:,n) = h5read(fullfilename, strcat(path, 'Ey'));
        fields.ez(:,n) = h5read(fullfilename, strcat(path, 'Ez'));
        fields.hx(:,n) = h5read(fullfilename, strcat(path, 'Hx'));
        fields.hy(:,n) = h5read(fullfilename, strcat(path, 'Hy'));
        fields.hz(:,n) = h5read(fullfilename, strcat(path, 'Hz'));
    end
    Ascan.header=header;
    Ascan.fields=fields;
end

在需要读取的地方调用

trace=readgprMax();
RFImpulse=trace.fields.ez;

RFImpulse就是需要的数据,可以用它进行后续处理。

标签: 电阻器rz2y4

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台