简介面向电子工程师与科研人员的LTspice与Matlab联合仿真数据导入工具包用于解决LTspice仿真波形数据难以直接导入Matlab进行二次分析的痛点LTspice应对复杂模拟电路和开关电源仿真Matlab擅长数据处理与图形化展示二者结合可显著提升电路设计验证和结果分析效率。资源共153个文件压缩包2.37MB主要包括44个asc原理图文件、70个raw仿真数据文件、36个plt波形文件、1个m脚本、1个md说明文档及license许可文件其中asc文件覆盖直流扫描、交流扫描、参数步进和瞬态分析等典型仿真场景raw与plt分别保存原始波形数据和绘图配置m脚本封装了数据导入函数配合md文档即可快速上手。已有119人学习下载。通过学习该包读者能掌握LTspice数据导出的常用格式与Matlab读取方法直接调用m脚本完成FFT分析、滤波器设计、参数对比等操作并可将仿真结果与实测数据校准适用于科研验证、课程设计及产品研发中的电路模型优化。1. LTspice 数据进不了 Matlab一个开源脚本打通波形后处理做电源或模拟电路仿真的人多半遇到过这个局面LTspice 里仿真跑得飞快波形也好看可一旦要把数据拿去做 FFT、算纹波、做参数对比或者塞进论文图里LTspice 自带的波形窗口就变得很难用。手动导出 CSV 再导进 Matlab小信号还能忍瞬态几十万点的时候就成灾难。这个 LTspice2Matlab 工具包解决的正是这个痛点——它直接读取 LTspice 仿真生成的 .raw 文件把波形数据还原成 Matlab 的 struct 结构免去一切中间转换。适合做开关电源环路分析、滤波器频率响应验证、传感器信号调理仿真的工程师和学生尤其适合那些每天要在 LTspice 和 Matlab 之间来回倒腾数据的人。2. 原理先行.raw 文件结构与 LTspice2Matlab 的数据还原机制2.1 .raw 文件不只是二进制它分“文本头 二进制体”两段LTspice 的 .raw 文件不是简单的一维数据流而是由两段组成的混合格式。文件开头是纯文本部分记录版本、仿真类型、节点数量、变量列表等元信息这段可以直接用记事本打开之后是二进制数据区按时间步长逐点存放各节点的电压和电流值。LTspice2Matlab 的核心逻辑很直接先读文本头解析出变量名和数据类型再跳转到二进制数据区按照头部声明的格式逐点读出数值。明白了这个结构你就知道为什么这个脚本能“绕过” CSV 导出。手动导出 CSV 时 LTspice 会按你当前视图的显示精度输出一旦视图缩放过数据点就可能被抽稀而直接读 .raw 拿到的是仿真引擎计算出的原始结果最大程度保留了精度而且不经过文本格式化速度比 CSV 导出再 importdata 快一个量级。2.2 数据结构scope.Vars 里藏着什么LTspice2Matlab 调用后返回一个 scope 对象核心字段是 scope.Vars变量数组和 scope.time时间轴。Vars 是一个 struct 数组每个元素对应 .raw 里的一个变量包含三个子字段scope LTspice2Matlab(data.raw); % 查看所有变量名 {scope.Vars.varName} % 取第一个变量的完整数据第一列是时间后面是值 v_first scope.Vars(1).values; % 直接查时间轴长度看是否被抽稀 length(scope.time)这段代码的逻辑是典型的“一次读取按需索引”。第一行把整个 .raw 读取并解析成结构体第二行列出所有变量名方便你确认要取哪个节点第三行的 values 是个二维矩阵第一列是时间、后续列是变量值直接用逗号隔开取列即可。参数上要留意scope.Vars 的顺序与 .raw 文件头部声明的变量顺序一致不是你在原理图里点击探针的顺序取数据时先确认变量名再索引别想当然按 V(out)、V(in) 的字母顺序去猜。这个设计的好处是做完一次读取后可以反复操作数据不需要重复访问磁盘。比如你想看 V(out) 的纹波、I(L1) 的峰值、开关管 Vds 的振铃一次读取全部拿到再各自切片。2.3 时间轴与“time 0”的特殊约定在 LTspice 的二进制数据区里每个时间点的数据布局是一个 double 类型的时刻值后跟当前时刻所有变量的值。LTspice2Matlab 在解析时有一个很多人容易忽略的细节——它用“time 0”来判断是否读完了一个数据页面。这听起来有点奇怪因为仿真时间总是从 0 开始。实际原因是 .raw 文件里每个数据页page的起始时间戳是 0用来区分不同的 .step 扫描记录。脚本读到时间戳小于等于 0 的数值时就会认为当前页结束、下一数据页开始。这个机制在跑多步扫描时非常重要后面讲避坑时会展开。3. 快速落地安装、路径配置与第一条波形复现3.1 文件放对位置Matlab 才找得到脚本这个工具的核心只有一个函数文件拿到手后你不需要复杂的安装过程。把它放入当前工作目录即可但更稳妥的做法是放进 Matlab 的永久路径里% 方法一当前会话可用 addpath(D:\simulation\toolbox\LTspice2Matlab); % 方法二写进 startup.m 或直接保存路径 savepath建议优先用 addpath 指向你存放工具包的固定目录然后执行 savepath 让路径永久生效。原因很实际你不可能每次都记得把 .raw 文件和脚本放在同一个目录尤其是当你只是临时处理一个仿真结果时。参数上要注意addpath 的路径里不要带中文和特殊符号Matlab 的路径解析在这种场景下容易出幺蛾子后面避坑章会细说。3.2 第一步仿真输出配置 LTspice 写出你真正需要的变量在 LTspice 的原理图里放一个 .tran 命令跑瞬态仿真结束后会生成 .raw 文件。但值得刻意做的是在原理图里加一行 .save 指令限制输出变量.save V(out) V(vin) I(D1) I(L1)这行指令的含义是只保存指定节点的电压和指定元器件的电流其他中间节点的数据不写入 .raw。不加这行也能读但 .raw 文件会大很多而且变量多的时候 Matlab 端索引容易搞混。我的习惯是只在需要观察的关键节点上用它尤其是长时间瞬态仿真文件体积可以从几百 MB 降到几十 MB读取速度天壤之别。3.3 复现第一条波形三行代码出图把 LTspice 生成的 .raw 文件路径准备好在 Matlab 里执行% 读取 .raw 文件RLT 参数设为 200 scope LTspice2Matlab(buck_openloop.raw, 200); % 画出 V(out) 波形 figure(Color,w); hold on; plot(scope.time, scope.Vars(find(strcmp({scope.Vars.varName}, V(out)))).values(:,2)); % 画出电感电流 plot(scope.time, scope.Vars(find(strcmp({scope.Vars.varName}, I(L1)))).values(:,2)); xlabel(Time (s)); ylabel(Amplitude); legend(V(out), I(L1));这里有个必须交代的参数第二个参数 RLT 设为 200表示“读取任意数量的数据点”。如果你把它设为 1脚本只读一个时间点的数据设为 10 则只读前 10 个点。默认行为通常是 200即完整读取所有数据。新手最容易在这翻车——直接调函数不加参数或 RLT 设错然后发现波形只画出来一小段。逻辑很简单LTspice2Matlab 设计时给了你一个“数据量上限”的控制位用默认值最省心。3.4 常见误区直接双击 .raw 文件打开再另存为很多人拿到这个脚本后还是惯性思维地双击 .raw 文件用 LTspice 自带的波形窗口打开然后 File - Export 导出文本再写个脚本去解析。这完全绕过了工具包的价值。 .raw 文件也可以直接用 MATLAB 的 fopen 按二进制格式读取但你得自己处理文件头、变量类型、数据对齐的问题代码量不小。用 LTspice2Matlab 的唯一前提是 .raw 文件路径正确文件确实由 LTspice 仿真生成就这三个条件。4. 参数化扫描与批量后处理把单次读取升级成完整后端4.1 批量跑 .step 扫描并逐一提取数据电路仿真里最常见的需求是做参数扫描——改变电阻值、电容值或负载条件观察系统的响应变化。LTspice 的 .step 命令会把多次仿真结果按数据页写进同一个 .raw 文件。LTspice2Matlab 对这种情况的处理并不完美默认只会读第一页数据。我在实际项目中采取的做法是循环读取files dir(sweep_*.raw); results struct(); for i 1:length(files) scope LTspice2Matlab(files(i).name); vout scope.Vars(find(strcmp({scope.Vars.varName}, V(out)))).values; results(i).R extractRvalue(files(i).name); % 自定义函数从文件名取参数值 results(i).vout vout(:,2); end这段代码的思路是把多次仿真拆成多个 .raw 文件分别读取后聚合到 results 结构里。每个 .raw 文件对应一个参数值文件名里带上参数后续画图时能直接对应。参数提取函数 extractRvalue 是自定义的我用的是正则表达式从文件名里抽数字比如 sweep_R10k.raw 提取出 10k。这种做法比在 Matlab 里重新仿真一遍电路靠谱得多因为电路仿真已经由 LTspice 完成了Matlab 只做数据处理不承担任何仿真职责。4.2 用 LTspice2Matlab 做频域验证幅频响应计算拿到时域波形后最自然的延伸就是把数据做 FFT。以开关电源的输出阻抗和环路增益测量为例给电路注入一个小信号扰动时域跑完后对输入输出做频谱分析scope LTspice2Matlab(loopgain.raw); t scope.time; vin scope.Vars(find(strcmp({scope.Vars.varName},V(in)))).values(:,2); vout scope.Vars(find(strcmp({scope.Vars.varName},V(out)))).values(:,2); % 去除直流分量后再做 FFT vin_ac vin - mean(vin); vout_ac vout - mean(vout); Fs 1 / (t(2) - t(1)); N length(t); f (0:N-1) * Fs / N; VIN fft(vin_ac .* hann(N)); % 加窗后做 FFT VOUT fft(vout_ac .* hann(N)); H VOUT ./ VIN; gain_dB 20*log10(abs(H)); % 只取正频域忽略第一个点直流 idx 2:floor(N/2); semilogx(f(idx), gain_dB(idx));这段代码里值得解释的是两个要点一是 FFT 前先去除直流分量不然 0 Hz 处的能量会淹没整个频谱二是加了 hann 窗这是针对瞬态仿真波形截断效应的处理。LTspice 的 .tran 仿真通常没跑完整数倍的周期时域截断会造成频谱泄漏加窗可以减轻这种现象。你可以在仿真命令里设置 .option plotwinsize0 来避免 LTspice 对保存数据做压缩但加窗仍然有必要两者的作用不同——前者保精度后者抑泄漏。4.3 自动生成报告波形环路增益的穿越频率提取批量处理频率响应数据的最终目的是得到设计参数。比如环路增益曲线你得找到 0 dB 穿越频率和相位裕度。写个函数批量做这个事function [fc, pm] extractCrossing(gain_dB, phase_deg, f) % 找到增益穿越 0 dB 的频率点 idx_cross find(diff(sign(gain_dB)) ~ 0); if isempty(idx_cross) fc NaN; pm NaN; return; end fc interp1(gain_dB(idx_cross:idx_cross1), ... f(idx_cross:idx_cross1), 0); % 在该频率点处插值相位 pm interp1(f, phase_deg, fc);逻辑是先用 sign 函数找增益符号变化的索引也就是穿越 0 dB 的位置再用线性插值精确定位频率点最后在该频率插值相位裕度。这样你跑完一轮参数扫描就能得到一条穿越频率和相位裕度随参数变化的曲线直接判断设计余量够不够。我的习惯是把这段逻辑放进一个循环里对扫描的每个 .raw 都算一遍输出一个表格一眼看清哪个参数组合最合适。5. 常见问题与避坑5 个让数据对不上的使用陷阱5.1 变量命名的坑V(out) 与 vout 不是一回事现象用 strcmp({scope.Vars.varName}, vout) 去匹配变量名返回空绘图时报错。原因LTspice 的 .raw 文件里变量名格式不是裸节点名而是带类型前缀的电压是 V(out)电流是 I(L1)把 V(out) 写成 vout 当然匹配不到。LTspice 内部统一用小写节点名但前缀符号 V 是必须的。解决先用 {scope.Vars.varName} 列出全部变量名确认实际名字后再写匹配逻辑。不要凭记忆盲写。这个检查只花你五秒钟但能避免半小时的调试。5.2 中文路径的坑文件路径里带中文或空格现象LTspice2Matlab 能正常仿真但 Matlab 端读取 .raw 时文件打开失败或数据为空。原因这与脚本内部使用 fopen 的方式有关不同版本的 Matlab 在中文路径和特殊字符路径下的行为有差异脚本作者多按英文路径场景编写。解决把仿真工程放在纯英文路径下目录名不要包含空格和中文。这是我的默认配置仿真目录永远用英文命名比如 D:\sim\buck_loop。这不是玄学而是这个工具箱本身的边界条件——它没做路径编码处理。5.3 RLT 参数用错的坑波形只显示前一小段现象调用 LTspice2Matlab 后time 数组只有几百个点画出的波形和图看不完整。原因第二个参数 RLT 被设成了 1 或 10。这个参数的作用是限定读取数据量上限在旧版本脚本中是“读前 N 个时间点”而不是“自动读取全部”。解决统一使用 RLT 200 的调用方式这是脚本约定中表示“读取所有数据”的取值。不要省略这个参数也不要填空值。5.4 .tran 数据压缩的坑数据点被抽稀看不清细节现象读取出的数据时间间隔不均匀某些时刻间隔明显变大高频纹波失真。原因LTspice 默认在保存 .raw 时会做有损压缩具体行为受 .options plotwinsize 控制。当仿真时间很长而存储容量受限时LTspice 会合并相近时间点的数据导致波形细节丢失。解决在仿真命令里加一行 .options plotwinsize0 关闭压缩。这相当于告诉 LTspice 以原始时间步长保存全部数据点文件会变大但波形还原度最高。每次新建仿真原理图时我都习惯性地放上这一行不用等到发现问题再返工。5.5 .step 多页数据只读到第一组的坑现象仿真使用了 .step 扫描但读取出来的只有第一组参数对应的波形。原因正如前文所述LTspice2Matlab 默认只解析 .raw 文件中的第一个数据页。多步扫描的后续数据页虽然也存在于文件中但脚本默认行为不会继续遍历。解决要么把扫描拆成多个 .raw 文件分别跑要么在 Matlab 里手动循环 paginate。实际项目中我更推荐前者——每个 .raw 对应一个参数点文件组织清晰排查问题也方便。6. 进阶把 LTspice2Matlab 变成你自己的电路数据后端6.1 用 .save 指令 工具包实现“轻量仿真数据中心”如果你做的是多轮次的电源参数调试仿真-读取-修改-再仿真的循环会让你不停地开 LTspice、关波形窗口、切文件。我在跑某降压变换器的负载瞬态扫描时把所有 .save 指令集中管理统一输出关键节点波形然后在一个 Matlab 脚本里完成扫描、读取、绘制、指标计算整个流程从半小时压缩到三分钟。具体操作是原理图里的 .save 指令用通配符输出核心节点.step 配合文件输出路径参数每次仿真只输出需要的变量。这样做既控制了 .raw 的体积又让 Matlab 端的数据处理变成一个稳定的流水线。遇到多个设计方案的对比我也直接在同一份脚本里相互叠加绘图不会在 LTspice 窗口之间来回切换。6.2 验证方法拿已知电路做交叉校验拿到任何新脚本我的习惯是先找一个理想模型验证数据不丢帧、不乱序。做法是用一个 RC 充电电路仿真理论时间常数已知然后用工具包读取数据反推时间常数和理论值比对。如果误差在 1% 以内说明读取逻辑没问题。这个方法特别适合刚接触 LTspice2Matlab 的用户。scope LTspice2Matlab(rc_charge.raw); t scope.time; vcap scope.Vars(find(strcmp({scope.Vars.varName}, V(cap)))).values(:,2); % 理论曲线Vcap 5 * (1 - exp(-t / tau)) % 用最小二乘拟合时间常数 fit_func (p) p(1) * (1 - exp(-t / p(2))) - vcap; p0 [5, 1e-3]; p_est lsqnonlin(fit_func, p0); estimated_tau p_est(2);拟合出的 tau 越接近你用 R*C 算出的理论值说明数据越可信。这段代码还有另一层用途验证 .raw 文件的数据点数是否被压缩。如果拟合残差很小却对不上那多半是 plotwinsize 压缩导致的问题而不是脚本的问题。从那以后我每次开始一个新项目的第一轮仿真都会先跑一遍这个校验流程确认工具包在当前 LTspice 版本下工作正常再放心批量处理数据。希望这套流程也能帮你少踩几个数据出错的坑。本文还有配套的精品资源点击获取