C++读取shd二进制文件

2023-11-20

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
#include <math.h>
#include <armadillo>
#include "boost/multi_array.hpp"

typedef long int int32;
typedef boost::multi_array<float, 4> multiarray_type;

struct Position
{
	std::vector<float> theta;
	std::vector<float> sdepth;
	std::vector<float> rdepth;
	std::vector<float> rrange;
};

//函数接口
bool read_shd(const std::string &filePath, float depth, float &freq, std::vector<float> &rkm, std::vector<float> &tslice)
{
	freq = 0.0f;
	rkm.clear();
	tslice.clear();

	//打开文件
	std::ifstream in(filePath, std::ios::in | std::ios::binary);
	if (!in)
	{
		in.close();
		return false;
	}

	//读取变量
	int32 recl;
	in.read((char *)&recl, sizeof(int32));

	char title[81] = "\0";
	in.read(title, 80 * sizeof(char));

	//设置读取位置
	in.seekg(4 * recl * sizeof(char), std::ios_base::beg);

	char plottype[11] = "\0";
	in.read(plottype, 10 * sizeof(char));

	float xs = 0.0f;
	in.read((char *)&xs, sizeof(float));

	float ys = 0.0f;
	in.read((char *)&ys, sizeof(float));

	//设置读取位置,读取freq
	in.seekg(2 * 4 * recl * sizeof(char), std::ios_base::beg);
	in.read((char *)&freq, sizeof(float));

	int32 Ntheta;
	in.read((char *)&Ntheta, sizeof(int32));

	int32 Nsd;
	in.read((char *)&Nsd, sizeof(int32));

	int32 Nrd;
	in.read((char *)&Nrd, sizeof(int32));

	int32 Nrr;
	in.read((char *)&Nrr, sizeof(int32));

	float atten = 0.0f;
	in.read((char *)&atten, sizeof(float));

	//设置读取位置
	in.seekg(3 * 4 * recl * sizeof(char), std::ios_base::beg);

	Position pos;
	pos.theta.resize(Ntheta, 0.0f);
	for (int i = 0; i < Ntheta; ++i)
	{
		in.read((char *)&pos.theta[i], sizeof(float));
	}

	//设置读取位置
	in.seekg(4 * 4 * recl * sizeof(char), std::ios_base::beg);

	pos.sdepth.resize(Nsd, 0.0f);
	for (int i = 0; i < Nsd; ++i)
	{
		in.read((char *)&pos.sdepth[i], sizeof(float));
	}

	//设置读取位置,读取r.depth
	in.seekg(5 * 4 * recl * sizeof(char), std::ios_base::beg);

	pos.rdepth.resize(Nrd, 0.0f);
	for (int i = 0; i < Nrd; ++i)
	{
		in.read((char *)&pos.rdepth[i], sizeof(float));
	}

	//设置读取位置,读取,r.range
	in.seekg(6 * 4 * recl * sizeof(char), std::ios_base::beg);

	pos.rrange.resize(Nrr, 0.0f);
	for (int i = 0; i < Nrr; ++i)
	{
		in.read((char *)&pos.rrange[i], sizeof(float));
	}

	int Nrcvrs_per_range = 0;
	multiarray_type abs_pressure;
	//定义压力场维度
	if (std::string(plottype) == "irregular ")
	{
		abs_pressure.resize(boost::extents[Ntheta][Nsd][1][Nrr]);
		Nrcvrs_per_range = 1;
	}
	else
	{
		abs_pressure.resize(boost::extents[Ntheta][Nsd][Nrd][Nrr]);
		Nrcvrs_per_range = Nrd;
	}

	//初始化压力最大值
	float abs_max = 0.0f;
	std::vector<float> tempArr(2 * Nrr, 0);

	//读取文件中的压力数据
	for (int itheta = 0; itheta < Ntheta; ++itheta)
	{
		for (int isd = 0; isd < Nsd; ++isd)
		{
			for (int ird = 0; ird < Nrcvrs_per_range; ++ird)
			{
				int recnum = 7 + itheta*Nsd*Nrcvrs_per_range + isd*Nrcvrs_per_range + ird;
				in.seekg(recnum * 4 * recl * sizeof(char), std::ios_base::beg);

				for (int i = 0; i < 2 * Nrr; ++i)
				{
					in.read((char *)&tempArr[i], sizeof(float));
				}
				for (int irr = 0; irr < Nrr; ++irr)
				{
					abs_pressure[itheta][isd][ird][irr] = sqrtf(tempArr[2 * irr] * tempArr[2 * irr] + tempArr[2 * irr + 1] * tempArr[2 * irr + 1]);

					abs_max = abs_max > abs_pressure[itheta][isd][ird][irr] ? abs_max : abs_pressure[itheta][isd][ird][irr];
				}
			}
		}
	}

	//把0值改成一个较小的浮点数,并计算dB值
	for (multiarray_type::iterator it_d1 = abs_pressure.begin(); it_d1 != abs_pressure.end(); ++it_d1)
	{
		for (auto it_d2 = it_d1->begin(); it_d2 != it_d1->end(); ++it_d2)
		{
			for (auto it_d3 = it_d2->begin(); it_d3 != it_d2->end(); ++it_d3)
			{
				for (auto it_d4 = it_d3->begin(); it_d4 != it_d3->end(); ++it_d4)
				{
					*it_d4 = (*it_d4 == 0.0f) ? (abs_max / 1.0e+10) : (*it_d4);
					*it_d4 = -20.0f * log10((*it_d4));
				}
			}
		}
	}

	//计算rkm
	std::transform(pos.rrange.begin(), pos.rrange.end(), std::back_inserter(rkm), [](float v)->float {return v / 1000.0f; });

	//插值计算
	if (pos.rdepth.size() == 1)
	{
		//只有一个元素时不插值
		for (int i = 0; i < abs_pressure[0][0][0].size(); ++i)
			tslice.push_back(abs_pressure[0][0][0][i]);
	}
	else
	{
		//x vector
		arma::fvec x;
		x.resize(pos.rdepth.size());
		for (int i = 0; i < pos.rdepth.size(); ++i)
			x(i) = pos.rdepth[i];
		//y vectors
		arma::fmat yVectors;
		int rows = abs_pressure[0][0].size();
		int cols = abs_pressure[0][0][0].size();
		yVectors.resize(rows, cols);
		for (int i = 0; i < rows; ++i)
		{
			for (int j = 0; j < cols; ++j)
			{
				yVectors(i, j) = abs_pressure[0][0][i][j];
			}
		}

		//插值结果变量定义
		arma::fvec x1(1);
		x1(0) = 80.0f;

		arma::fvec y1(1);

		//计算插值结果
		yVectors.each_col([&](const arma::fvec &col) {
			arma::interp1(x, col, x1, y1);
			tslice.push_back(y1(0));
		});
	}
	in.close();

	return true;
}

void output_result(const std::string & filePath, float freq, const std::vector<float> &rkm, const std::vector<float> &tslice)
{
	std::ofstream out(filePath, std::ios_base::out);
	if (!out)
		return;

	out << std::setprecision(8) << "Freq:" << freq << std::endl;

	out << "rkm vector" << std::endl;
	for (auto e : rkm)
		out << std::setprecision(8) << e << std::endl;
	
	out << "tslice vector" << std::endl;
	for(auto e:tslice)
		out << std::setprecision(8) << e << std::endl;
}

int main()
{
	std::string shdFile = "D:/ReadShdFile/Isosonic3_0.shd";

	float freq;
	float depth;
	std::vector<float> rkm;
	std::vector<float> tslice;

	std::cout << "Input shd file path (include file name)" << std::endl;
	std::cin >> shdFile;

	std::cout << "Input depth value" << std::endl;
	std::cin >> depth;

	if (read_shd(shdFile, depth, freq, rkm, tslice))
	{
		std::string resultFile = "result.txt";

		std::cout << "file read successfully" << std::endl;

		output_result(resultFile, freq, rkm, tslice);
	}
	else
	{
		std::cout << "file read Fail" << std::endl;
	}

	system("pause");
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++读取shd二进制文件 的相关文章

  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • MySQL报错的解决Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘

    使用数据库工具连接或还原数据库数据时 提示Can t connect to local MySQL server through socket var lib mysql mysql sock 处理方法 1 修改配置文件 vim etc m
  • 二叉树结构的建立与遍历

    实验项目 1 编写建立二叉树的二叉链表存储结构 左右链表示 的程序 并以适当的形式显示和保存二叉树 2 完成二叉树的7种遍历操作 3 给定一个二叉树 编写算法完成下列应用 1 判断其是否为完全二叉树 2 求二叉树中任意两个结点的公共祖先 输
  • wps日期加减算天数_日期相减之后的天数怎么用公式计算 - 卡饭网

    如何在Excel中得到两个日期相减的天数 如何在Excel中得到两个日期相减的天数 有的小伙伴在使用Excel软件时 想要知道两个日期相减后的天数 但是却不知道使用什么公式 也不知道公式中的数据的含义 那么小编就来为大家介绍一下吧 具体如下
  • Python安装教程(版本3.8.10)windows10

    Python目前已支持市面上的各大主流操作系统 在Linux Unix Mac系统已经自带Python环境 本章将介绍在Windows系统上安装Python 一般下载 executable installer x86 表示是 32 位的机器
  • 基于Python Django 搜索的目标站点内容监测系统设计

    1 简介 基于搜索的目标站点内容监测系统 包括登陆 首页 数据采集 爬虫分析 数据管理 修改密码和用户管理等功能 2 技术栈 说明 技术栈 备注 后台 Python Django 前端 HTML 数据库 MYSql 架构 B S 结构 3
  • MySQL数据库保姆级安装教程

    俗话说从入门到放弃 从入门到入土 开始学习MySQL之前我们一定是要做环境准备的 接下来我们来讲解一下MySQL的安装 一 MySQL下载 MySQL 1 大家可以尝试在官网首页寻找下载入口 也可以使用我提供的MySQL的安装包进行下载安装
  • 数据结构之双向链表,实现双向链表的增删改查

    目录 一 双向链表的定义 1 双向链表节点的定义 2 双向链表的初始化 二 双向链表的函数接口实现 1 双链表的尾插 2 双向链表的尾删 3 双向链表的头插 4 双向链表的头删 6 双向链表在pos前面插入 7 双向链表删除pos位置的节点
  • 1.Twitter开发者之如何申请一个twitter开发者账号

    Twitter开发者之如何申请一个twitter开发者账号 教大家申请一个推特开发者账号满足后面的使用 保证每一步都给大家介绍到 非常详细 希望帮助大家注册好自己的账号 1 先打开Twitter的账号注册界面 选择使用手机号码或电子邮箱注册
  • C51单片机实验——脉冲计数显示(proteus+asm)

    前言 脉冲信号输入进2级74LS14整形 T1接收脉冲信号并计数 显示在LED 外部中断0控制计数器的启动 停止 外部中断1控制计数器的清零复位 P1 0控制LED的段选口使能信号 P1 1控制LED的位选口使能信号 Proteus电路图
  • ios代码大全】代码例子区全区搜索索引

    IOS 类代码 我自己做的翻书效果 小猫咪再次登场 2011 03 02 如何实现QQLive HD界面 附代码 2011 03 02 tabelviewcell 点击设置背景图片 2011 03 02 基于UDP的聊天程序 借鉴iphon
  • OpenGL ES 3.0 Programming Guide 1-3

    一 introduction to OGLES 3 0 OGLES 3 0 Graphics Pipeline VertexBuffer ArrayObj gt VertexShader texture transform feedback
  • C51的1602LCD液晶显示

    C51的1602LCD液晶显示 1 引脚功能介绍 2 基本操作时序 3 1602 液晶的指令介绍 4 实例 1 引脚功能介绍 1602 液晶就是可以显示 2 行 每行 16 个字符的液晶 一共 16 个引脚 每个引脚的功能 我们都可以在它的
  • redis操作 AOF RDB 主从复制 集群

    Redis操作 1 Redis的持久化 Redis提供了2个不同方式的持久化方式 RDB RDB是指在指定的时间间隔将内存中的数据集快照写入磁盘 也就是行话讲的Snapshot快照 它恢复时将快照文件直接读到内存中 备份是如何进行的 Red
  • 算法练习:“回”字形打印矩阵、“之字”形打印矩阵

    转圈输出n n的矩阵 进而输出 M N 的矩阵 12 34 输出为 1243 对于任意一个矩阵 可以找到他的位于正对角线两边界的元素 1234 5678 4329 对于这个矩阵 第一个边界元素是1 第二个边界元素是9 假设 1 的坐标为 r
  • Kibana 配置详解

    Kibana 配置详解 前言 一 Kibana 核心目录结构 二 Kibana 核心配置文件 参考 前言 该博文主要介绍Kibana文件目录结构说明 以及Kibana的配置说明 Kibana的安装使用可以参考我的Kibana分类专栏 本文针
  • android获取当前栈顶的activity

    在Application的onCreate方法中 Override public void onCreate registerActivityLifecycleCallbacks new ActivityLifecycleCallbacks
  • JSP页面出现Invalid location of tag (div)

    意为 不合法的标签标记 原因是我使用标签的方法不对 把table标签删除就可以了
  • C++读取shd二进制文件

    include