imc DEVICES raw数组转Matlab mat数据

  • 本来想将imc采集的数据进行拟合,拟合出一个大概的传函,用于仿真,但操作过程发现影响变量太多,拟合效果不好,查表无法覆盖,实践困难。测试功能还可以,闭环调试有点困难。
  • 新叶儿做的转换软件,可以使用,将所有数据都打包进了mat文件
  • 安装imctermite库,需要安装"适用于 C++ 的 Visual Studio 生成工具",链接地址
  • raw2mat,raw不能是中文,data第一列为时间,第二列为数据。后续可以根据文件名增加键,将值赋值该键,删除data键。
python 复制代码
# -*- coding: utf-8 -*-
import imctermite
import scipy.io as sio
import numpy as np
import os

# ==================== 设置部分 ====================
input_raw = "input2.raw"          # 输入的 .raw 文件名(假设为 input.raw,根据实际情况修改)
output_mat = "output2.mat"        # 输出的 .mat 文件名

if not os.path.exists(input_raw):
    print(f"错误:找不到文件 {input_raw}")
    exit(1)

print(f"正在读取: {input_raw}")

# ==================== 读取 .raw 文件 ====================
try:
    imc = imctermite.imctermite(input_raw.encode('utf-8'))
except RuntimeError as e:
    print("解析 .raw 文件失败:", e)
    exit(1)

# 获取所有通道的数据(包含 ydata)
channels_with_data = imc.get_channels(True)

if not channels_with_data:
    print("文件中没有找到任何通道数据")
    exit(1)

print(f"找到 {len(channels_with_data)} 个通道")

# ==================== 准备数据 ====================
# 取出时间向量(通常取第一个通道的 xdata)
time_vector = None
for ch in channels_with_data:
    x = ch.get('xdata')
    if x is not None and len(x) > 0:
        time_vector = np.asarray(x, dtype=np.float64)
        break

if time_vector is None:
    # 如果没有 xdata,使用索引作为时间(或根据 dt 生成)
    if len(channels_with_data) > 0:
        n = len(channels_with_data[0].get('ydata', []))
        dt = channels_with_data[0].get('dt', 1.0)  # 假设 dt 存在,否则用 1.0
        time_vector = np.arange(n) * dt
    else:
        print("错误:没有数据")
        exit(1)

# 建立 2D numpy 数组:第一列 time,其余列为每个通道的 ydata
data_cols = [time_vector]
channel_names = []  # 用于记录通道名称

for i, ch in enumerate(channels_with_data, 1):
    y = ch.get('ydata')
    if y is None or len(y) == 0:
        continue
    
    y = np.asarray(y, dtype=np.float64)
    
    # 检查长度一致性
    if len(y) != len(time_vector):
        print(f"警告:通道 {ch.get('name', '?')} 长度不符 ({len(y)} ≠ {len(time_vector)}),跳过")
        continue
    
    data_cols.append(y)
    
    # 生成安全的通道名称(MATLAB 变量名兼容)
    name = ch.get('name', f"channel_{i}")
    name = name.replace(" ", "_").replace("-", "_").replace(".", "_").replace("/", "_").replace("\\", "_")
    name = "".join(c for c in name if c.isalnum() or c == "_")
    if not name or name[0].isdigit():
        name = f"channel_{i}"
    channel_names.append(name)

# 如果没有通道数据,退出
if len(data_cols) <= 1:
    print("错误:没有有效的通道数据")
    exit(1)

# 合成 (样本数 × 列数) 的矩阵
data_matrix = np.column_stack(data_cols)

# ==================== 保存为 .mat 文件 ====================
mat_dict = {
    'data': data_matrix,                  # 主数据矩阵,第一列 time
    'channel_names': channel_names,       # 通道名称列表(从第二列开始)
    'source_file': input_raw              # 源文件信息
}

print(f"正在保存到: {output_mat} (形状: {data_matrix.shape})")
sio.savemat(output_mat, mat_dict, oned_as='column')

print("转换完成!")
print("MATLAB 中加载方式:")
print(f"   load('{output_mat}');")
print("   time = data(:,1);")
print("   % 通道数据:data(:,2) 是第一个通道,依此类推")
print(f"   % 通道名称:channel_names{{1}} 是 '{channel_names[0]}' 等")
相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜10 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa10 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio