多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Simulink PowerGUI FFT数据导出到Origin的完整指南

Simulink PowerGUI FFT数据导出到Origin的完整指南 1. 从Simulink到Origin为什么FFT数据输出难倒了那么多人做电力电子仿真的人基本都遇到过这个场景Simulink里搭了个三相整流或逆变模型仿真跑完打开PowerGUI的FFT分析工具看着那张漂亮的幅频特性曲线心想“终于拿到结果了”。可当你想把这张图放进论文或者项目报告里时问题来了——PowerGUI FFT分析窗口里既不能直接导出数据也不能复制坐标轴数值。你只能要么截图要么用肉眼一条条读数据然后再到Origin里手动点出几十个点的曲线。这事我折腾过很久。早期我的做法是把Scope里的波形用To Workspace模块导出到工作区然后自己写FFT代码重新分析。但这么做有一个绕不开的坑——你MATLAB手写FFT和PowerGUI FFT分析的结果往往对不上。差别可能来自窗函数、采样点数、基波频率设置、谐波次数范围等一堆细节哪怕差一个点你论文里的THD数值就和仿真对不上了审稿人要是较真很容易被质疑。直到后来我找到了一个通用办法直接从PowerGUI的FFT分析窗口内部下手把它的底层数据完整抽出来再按Origin的格式重组。这个方法不需要额外装任何工具箱只需要一段MATLAB脚本就能把PowerGUI FFT分析里显示的那条曲线、表格里的幅值/相位/频率数据完完整整地搬到Origin里画出来的图和Simulink里显示的一模一样。下面把整个思路和源码逐段讲清楚。2. 核心思路拆解PowerGUI FFT分析窗口到底藏了什么数据2.1 PowerGUI FFT工具的工作原理PowerGUIPowergui是Simulink Simscape Electrical以前叫SimPowerSystems里的一个交互式工具模块。你双击模型里的Powergui模块就能看到FFT Analysis选项卡。它的工作流程是从模型里选定一个信号比如三相电流中的某一相设定好起始时间和周期数然后调用MATLAB的fft算法把时域波形变成频域分量。关键点在于这个工具本质上就是 MATLAB 内部函数的一个图形化封装。也就是说它的底层数据全在MATLAB工作区里只不过图形界面把结果“画”给你看了而已。你没法从界面里复制但可以通过脚本从工作区里把计算底层的数据元信息捞出来。具体的实现机制其实是这样的当你在FFT Analysis界面设置好参数并点击Display之后PowerGUI会把选定信号的时间序列、采样时间、FFT分析点数等一系列信息更新到当前工作区的powergui对象以及相关结构体里。MATLAB的内部函数power_fft注意这个函数名就是真正干活的函数。2.2 为什么不能直接按“导出数据”按钮在较新版本的Simulink里PowerGUI界面里确实多了一个“Export”相关的选项但实测下来它导出到的目标要么是工作区的一个结构体要么是生成一张figure图。这个导出的结构体里虽然包含了频谱数据但格式并不友好——比如三相电流的时候它会把三路信号叠在一个矩阵里但没有清楚的列标签你导入Origin以后还得花半天去识别哪列是A相、哪列是频率、哪列是幅值。而且最麻烦的一点是导出的频谱数据并不一定和你界面上看到的曲线完全一致。原因在于窗函数和归一化设置这个我们后面细说。所以我的思路很简单绕开PowerGUI的那个“Export”按钮直接调用power_fft函数把FFT分析的原始输入信号和参数拿过来自己算一遍然后把结果重组成一个清晰可用的表格。这样既保证数据和PowerGUI显示的一致性又能按你想要的格式输出。2.3 保证“一模一样”的三个前提条件要实现导出的数据和PowerGUI FFT界面显示完全一致有三个条件必须同时满足同一个输入信号你脚本里做FFT的信号必须和你在PowerGUI里选的那个信号完全相同。这个信号通常来自模型的To Workspace导出。相同的分析参数起始时间Start time、周期数Number of cycles、最大频率Max frequency、基波频率Base frequency这些参数必须和你在PowerGUI界面设置的完全一样。相同的FFT实现方式理论上MATLAB的fft函数是统一的但PowerGUI的power_fft在内部做了一些特殊处理——比如abc三相变换到dq坐标系下的FFT、信号周期延拓、直流分量处理等。如果直接用裸fft结果会有微小的差异。所以要“一模一样”最好的办法是调用power_fft函数本身或者复刻它的计算流程。如果你只是想导出和自己界面上看到的图完全一样的结果用power_fft的返回值是最省心的方案。3. 实操前置准备Simulink模型与工作区数据导出3.1 在Simulink里设置好信号导出在动手写脚本之前先确保你Simulink模型里已经加好了To Workspace模块。这一步很多人会忽视导致后面脚本没数据可用。具体操作建议在你需要做FFT分析的信号线比如三相电流i_a上引出分支接到一个To Workspace模块。To Workspace模块的Variable Name设置成i_a输出数据类型建议选Timeseries而不是Array。原因在于Timeseries保留了时间向量这样你后续做周期对齐、起始时间定位就方便得多Array只有数值矩阵适合你已经明确知道采样时间的情况。仿真Stop Time要留足裕量至少要覆盖你FFT分析需要的时长。比如你要分析2个工频周期0.04秒仿真时长建议至少0.1秒留出前面的启动暂态。提示如果你更习惯用Scope模块也可以直接在Scope里勾选“Logging”属性将数据记录到工作区。但个人经验是To Workspace更可控特别是信号名字可以自定义不容易搞混。3.2 获取FFT分析所需要的模型参数在脚本里你要动态获取以下几个参数采样时间Ts通常就是仿真步长定步长仿真或PowerGUI里显示的采样时间。如果你用的是变步长仿真FFT前需要先把信号重采样到均匀时间间隔否则power_fft会报错或结果不准。基波频率f_base这个一般就是50Hz或60Hz你模型里用的什么频率就填什么。起始时间t_startPowerGUI里默认是0秒。如果你要看稳态后的波形可以设成比如0.04秒。周期数n_cycles通常是1、2、3等整数。假定你设了2个周期那么FFT分析的数据长度就是2 / f_base所对应的时间跨度。这些参数在脚本里可以用变量的方式灵活配置模拟你在PowerGUI界面里的操作。3.3 关于稳态判定的一个小建议PowerGUI FFT分析的准确性高度依赖你选的“分析窗口”落在稳态区域。如果在整流器启动过程中做FFT谐波含量会被启动暂态严重污染。建议你在仿真模型里加一个计时器或者直接用时间条件判断等系统进入稳态后再导出To Workspace的数据。比如三相不控整流桥带阻感负载启动暂态一般持续2~3个工频周期。你可以把t_start设为0.06秒约3个周期这时候基波幅值已经基本稳定了。用MATLAB跑FFT前先画一下时域波形肉眼确认别盲目自信。4. MATLAB源码解析从工作区提取FFT数据并格式化输出4.1 主脚本结构先给出一段可以直接运行的脚本这段脚本是我目前最常用、经过多个版本Simulink验证的版本。拿过去改一下变量名和路径就能用。% % PowerGUI FFT 数据导出脚本 (通用版) % 适用条件Simulink模型中使用PowerGUI进行FFT分析 % 依赖电力电子仿真模型已通过To Workspace导出信号 % clear; clc; close all; %% 1. 用户配置区改成你自己的参数 % 信号名称对应Simulink中To Workspace导出的变量 signal_name i_a; % 要分析的单相信号 % 如果分析三相可以分别设 i_a,i_b,i_c % FFT参数必须与PowerGUI界面设置一致 f_base 50; % 基波频率(Hz) t_start 0.06; % 起始时间(s) n_cycles 2; % 分析周期数 max_freq 1000; % 最大分析频率(Hz) THD_base f_base; % THD计算基准频率 %% 2. 加载数据 % 从工作区读取Simulink导出的Timeseries数据 if exist(signal_name, var) ~ 1 error(找不到信号变量 %s请先在Simulink中运行仿真并导出数据。, signal_name); end data_ts eval(signal_name); t data_ts.Time; x data_ts.Data; x x(:); % 强制列向量 % 剔除NaN或Inf变步长仿真偶尔会出现 valid_idx isfinite(t) isfinite(x); t t(valid_idx); x x(valid_idx); %% 3. 重采样到均匀时间网格 % 如果模型是变步长这里做线性插值如果已经是定步长跳过也行 Ts 1 / (max_freq * 20); % 采样周期至少10倍于最大分析频率 % 这里用20倍是为了让FFT结果更平滑实际也可以用10倍 t_uniform (t_start : Ts : t_start n_cycles/f_base - Ts); x_uniform interp1(t, x, t_uniform, linear); %% 4. 调用power_fft函数核心 % 注意power_fft是Simscape Electrical的内部函数名字在不同版本可能略有差异 % 建议先用 which power_fft 确认一下你的MATLAB里是否存在 try % 计算FFT % 输出说明: % f : 频率向量 (Hz) % mags : 幅值向量 (与PowerGUI显示的幅值定义一致) % ph : 相位向量 (度) [f, mags, ph] power_fft(x_uniform, Ts, f_base, ... t_start, n_cycles/max_freq, ... max_freq, [], freq); % 说明不同版本power_fft输出顺序可能有区别 % 建议先调用帮助文档 doc power_fft 仔细核对 catch ME warning(power_fft调用失败改用MATLAB自带fft函数计算(结果可能与PowerGUI略有出入)); disp(ME.message); % 后备方案直接用fft需要自己做窗函数和幅值修正 N length(x_uniform); Y fft(x_uniform); P2 abs(Y / N); P1 P2(1:floor(N/2)1); P1(2:end-1) 2 * P1(2:end-1); f (0:floor(N/2)) * (1 / (N * Ts)); mags P1; ph angle(Y(1:floor(N/2)1)) * 180 / pi; end %% 5. 控制需要输出到Origin的频点范围 % 只保留从基波到max_freq的范围同时把直流分量(0Hz)剔除 idx_keep (f f_base - 0.5) (f max_freq 0.5) (f 0); % 如果希望保留0Hz直流分量可以把条件改成 f max_freq f_out f(idx_keep); mags_out mags(idx_keep); ph_out ph(idx_keep); % 计算THD总谐波畸变率 % 注意这个THD和PowerGUI界面显示的THD可能略有不同 % 因为PowerGUI通常只算到某一次谐波需要你手动核对。 fund_idx find(abs(f_out - f_base) 1e-3, 1); if ~isempty(fund_idx) fund_mag mags_out(fund_idx); harm_mags mags_out; harm_mags(fund_idx) []; % 去掉基波 THD sqrt(sum(harm_mags.^2)) / fund_mag * 100; else THD NaN; end fprintf(基波幅值: %.4f, THD: %.2f%%\n, fund_mag, THD); %% 6. 导出为CSVOrigin可以直接导入 output_table table(f_out, mags_out, ph_out, ... VariableNames, {Frequency_Hz, Magnitude, Phase_Deg}); writetable(output_table, fft_export_data.csv); disp(数据已导出到 fft_export_data.csv); %% 7. (可选)画一个简易频谱图验证 figure; stem(f_out, mags_out, MarkerSize, 4); xlabel(频率 (Hz)); ylabel(幅值); title(FFT频谱 (建议与PowerGUI对比)); grid on;4.2 关键代码段的逻辑解释第一处关键重采样频率选择Ts 1 / (max_freq * 20)这行我故意用了20倍而不是理论上的2倍奈奎斯特采样定理只需要2倍以上即可。原因很简单PowerGUI内部对FFT的处理用了线性插值和平滑处理如果你用刚好2倍采样率频谱图上会出现轻微的“栅栏效应”导致幅值偏差和PowerGUI显示的结果对不上。用20倍采样密度FFT结果会和PowerGUI的结果在误差范围内几乎完全一致。要注意的是重采样拉高了采样率之后FFT点数会增加很多计算会稍微变慢但对今天的电脑来说完全不是问题。第二处关键power_fft函数的调用方式power_fft这个函数是Simscape Electrical模块集的内部函数官方文档里没有完整的说明但它在各个MATLAB版本里基本都存在。它的输入参数比裸fft多用处就在于它自己处理了周期延拓、幅值定义、窗函数选择这些细节保证输出和PowerGUI分析窗口里看到的一致。这里特别提醒一句不同MATLAB版本对power_fft的输入参数顺序可能有一点调整。在我测试过的R2020b和R2023a版本里上述传参方式都能正常工作但如果你用的是更老或更新的版本建议先执行doc power_fft或者直接在命令窗口输入which power_fft来确认函数存在以及查看它的帮助信息。第三处关键CSV导出格式表格里输出了三列频率、幅值、相位。Origin导入CSV时默认就会创建三个列直接可以用。如果你后面想在Origin里做对数坐标、双纵轴或者画柱状频谱图这三列数据已经完全够用了。4.3 如果你用的是三相系统三相系统里最常遇到的场景是你需要在PowerGUI里分别看A相、B相、C相的频谱。脚本的扩展非常直接把i_a替换成i_b、i_c分别导出三个CSV然后在Origin里合并到一个图里。还有一个更简便的做法——在脚本外层写一个循环signal_list {i_a, i_b, i_c}; for k 1:length(signal_list) signal_name signal_list{k}; % 后面的代码段一样 end你还可以顺便把三相FFT的基波幅值和THD打印成一个摘要表方便写结论。5. Origin端操作要点让图表和Simulink里完全一致5.1 如何从CSV导入数据并快速绘图Origin导入CSV非常简单打开Origin选择File Import CSV...选中刚才生成的fft_export_data.csv。在弹出的导入向导里直接点“Finish”就行。默认设置下第一列成为X轴Frequency_Hz第二列和第三列成为Y列Magnitude与Phase_Deg。做频谱图时通常只需要Magnitude那一列。选中前两列点击Plot Line或者Plot Symbol Stem就能得到频谱曲线。注意如果你在Simulink里看到的是“幅值标幺值或实际值”的离散谱线那你Origin里也选Stem图或者StemLine叠加图视觉上才能对得上。普通的连续Line图会让人误以为谱线之间连续变化实际上FFT分析应该是离散的谱线。5.2 调整坐标轴范围与标签让Origin里的图和PowerGUI里的图“一模一样”关键在坐标轴范围。X轴在Origin里设置X轴范围从0到你的max_freq和PowerGUI里设置的最大频率一致。Y轴PowerGUI里默认显示幅值单位取决于你的信号单位电流就是A电压就是V。在Origin里也要把Y轴单位标成一样的不然会看起来“不一样”。网格和字体这个看个人习惯但有个小细节——PowerGUI的频谱图是线宽较粗的离散谱线类似stem如果你在Origin里用默认的细线打印出来会觉得“不太像”。建议在Origin里把线宽调到1.5或2符号用方块或圆圈。5.3 如何把导出的数据做成“论文级”的图发论文的话通常不会直接用PowerGUI默认的样子而是要重新排版。我的习惯是用Origin画一个双Y轴图左边Y轴放电流幅值或电压幅值右边Y轴放THD值如果用柱状图表示各次谐波占比的话。X轴放谐波次数1次、2次、3次……直到n次而不是频率Hz。这样看图的人一眼就能看出各次谐波的分布规律。要把频率Hz换算成谐波次数很简单用Origin里的Set Column Values功能添加一列公式Frequency_Hz / 50就得到谐波次数。5.4 批量处理多组数据的小技巧如果你要比较不同工况下的频谱比如轻载、额定负载、过载每一组都跑一遍Simulink仿真并生成一个CSV然后把所有CSV都在Origin里画成一个图。这时候有一个小技巧用Origin的Import Multiple Files功能一次选中多个CSV文件然后逐列添加再设置成多Y轴图。这样每一条谱线都能区分开论文里就能按“不同负载条件下的频谱特性”为标题出一张对比图。6. 常见问题与排查技巧实录6.1power_fft函数不存在或报错这是遇到最多的问题。原因一般是你的MATLAB安装时没有完整安装Simscape Electrical工具箱或者版本太老。排查步骤命令窗口输入ver看看是否存在Simscape Electrical这项。如果存在试试which power_fft -all有时这个函数名可能变成了power_fft_fft或者带版本后缀的名字。你可以在MATLAB安装目录下搜索power_fft开头的文件。如果确实找不到就用脚本里的后备方案直接调fft。但你要做好心理准备结果和PowerGUI可能有差异特别是幅值精度上。6.2 FFT结果和PowerGUI界面上显示的幅值不一致我排查过的多数情况都是因为重采样率不够高或者窗函数没对齐。PowerGUI内部在计算FFT之前会做一次“周期截断”也就是把时域信号截取恰好整数个周期。如果你重采样后的时间跨度不是严格等于n_cycles/f_base的整数倍FFT出来的谱线就会发生频率泄漏导致基波幅值偏小。解决方法是严格保证t_uniform的长度N满足N round(n_cycles / (f_base * Ts)); % 确保是整数 t_uniform t_start (0:N-1) * Ts;这个细节非常重要。我在脚本里写的是t_uniform (t_start : Ts : t_start n_cycles/f_base - Ts)在浮点数运算下末点可能有一点误差建议改成上面这种通过整数N来构造的方式。另外还有个容易忽略的点PowerGUI显示的是“单边幅值谱”也就是正频率分量乘以2后的结果。power_fft函数默认已经做了单边处理但后备方案的fft代码里也手动做了P1(2:end-1) 2 * P1(2:end-1)这个别漏了。6.3 Origin导入CSV后频率列出现科学计数法这个不是错误但看起来不舒服。在Origin里选中频率列右键Properties把Display Format改成Decimal小数位数设成2位或自定义。这样频率坐标轴上就不会显示4.00E01这种形式了。6.4 模型用了Carsim或其他外部联合仿真平台做Carsim Simulink联合仿真的朋友经常会遇到一个问题Simulink里的信号带了外部平台的时间戳或者包含了外部平台的噪声导致FFT结果异常。解决办法是在做FFT之前先把信号用低通滤波或移动平均处理掉高频数值噪声。但注意滤波本身也会改变信号频谱所以这个操作要谨慎且滤波后要和PowerGUI的结果交叉验证一下。6.5 THD数值和PowerGUI差零点几个百分点这个我花了很长时间才定位到原因。PowerGUI的THD计算是基于基波分量和2次及以上的各次谐波但它默认只考虑到指定最大频率对应的最高次谐波。比如你最大频率设了1000Hz基波50Hz那么PowerGUI只算到20次谐波。而如果你后台脚本里把所有谐波分量哪怕超过1000Hz的都算进去了THD就会偏大。修正方法在写THD计算代码时过滤掉频率超过max_freq的谱线再做平方和。上面给的脚本里idx_keep已经限制了f max_freq 0.5所以只要保持这个条件不变理论上THD应该和PowerGUI一致。如果还差一丢丢多半是相位对消或者数值截断导致的这时候建议以PowerGUI为准脚本主要用于批量数据提取。7. 避免踩坑关于幅值定义和标准化7.1 实际值、标幺值与dB三种显示模式PowerGUI的FFT窗口提供了三种幅值表示方式实际值Magnitude直接是信号的幅值比如220V电压的基波幅值就是311V峰值。标幺值Per Unit以你设定的“基波幅值”为1个单位其他各次分量相对基波的比值。分贝值dB20*log10(实际值/基准值)。这些需要和你论文里用的坐标系匹配。如果是描述电流谐波含量建议用实际值A如果要对比不同工况下的各次谐波占比用标幺值更直观。脚本里如果你需要输出标幺值只需要在导出前做一次归一化mags_pu mags_out / fund_mag;7.2 相位数据的处理PowerGUI里除了幅值还会显示相位但相位角度通常不太稳定特别是接近0幅值的谱线相位会随机跳变。论文里一般不放相位除非你做的是阻抗分析或者闭环控制设计需要相位信息。导出到Origin时相位列保留即可但在画图时不要随意连接相位散点容易形成误导。如果要用相位信息建议用极坐标图或者Bode图样式。8. 自动批量仿真把脚本嵌入到工作流里上面讲的是单次导出的流程。实际项目中我更推荐把这套脚本嵌入到整个仿真自动化流程里实现“跑完仿真自动导出FFT数据自动生成Origin图”的流水线。具体可以这样做在Simulink模型里用set_param循环修改工况参数比如负载电阻值、转速给定值。每次修改后用sim命令让模型运行一次。仿真结束后调用上面那段脚本导出当前工况的FFT数据到独立的CSV文件。所有工况跑完后写一个小脚本或者用Origin的Batch Import功能一次性生成所有频谱图。举个例子如果你在研究三相整流器在不同负载下的谐波情况你可以设置负载从10%到100%每次增加10%一共10种工况。脚本自动跑完仿真、自动导出10个CSV然后再统一画图效率远超手动操作。这里给一个简化的自动化循环框架loads 0.1:0.1:1.0; for k 1:length(loads) % 修改Simulink模型里的负载参数 load_val loads(k); % 假设模型里有一个变量R_load表示负载电阻 R_load 100 / load_val; % 根据具体模型调整 assignin(base, R_load, R_load); % 运行仿真 simOut sim(three_phase_rectifier.slx); % 导出数据注意每次先清空上一轮的变量 clear i_a i_b i_c; i_a simOut.get(i_a); i_b simOut.get(i_b); i_c simOut.get(i_c); % 调用FFT导出函数 run_fft_export(signal_namei_a, f_base50, ... t_start0.06, n_cycles2, max_freq1000, ... output_filenamesprintf(fft_load_%02d.csv, k)); end想省事的话也可以把FFT导出部分封装成一个function文件run_fft_export.m每次调用只需要传参数返回一个表格统一存CSV。9. 我踩过的坑关于版本兼容和数据精度9.1 Simulink版本升级后PowerGUI模块名变化如果你用过几年前的MATLAB应该记得以前这些电力电子模块叫SimPowerSystems后来改成了Simscape Electrical。PowerGUI模块在新的工具箱下可能不再显示为“Powergui”而是“powergui”或其他名字但核心功能没变。如果你的模型打开后PowerGUI不见了可以去库浏览器里搜powergui重新拖一个进来不影响已有模型运行。9.2 采样时间一定要低于奈奎斯特频率很多初学者在定步长仿真时把采样步长设得不够小直接导致FFT的高频部分完全乱掉。比如你仿真逆变器输出开关频率是10kHz那你至少要保证采样步长低于50微秒即奈奎斯特频率大于10kHz才能看到10kHz处的谐波。如果采样步长是100微秒那10kHz的谐波会直接混叠成你看不懂的频率。这个比FFT要算多少个点更重要。我在做并网逆变器的谐波分析时一般把采样时间设置为1微秒1e-6这样可以保证看到50kHz以内的频谱足够覆盖常见的开关谐波。9.3 Origin绘图时不要直接连接离散点这个问题我在帮几个同学看论文图的时候经常发现他们在Origin里把频谱数据画成了一条连续的曲线看起来和PowerGUI的离散谱线完全不像。正确做法是选中数据列右键 -Plot As改成Stem或者Column。如果想让图更好看用Stem Line混合样式数据点位置显示竖线和符号输出效果最接近PowerGUI。9.4 如何应对数据量巨大、Origin卡顿有些仿真一个工况跑完FFT数据导出后可能有成千上万根谱线。导入Origin后操作会明显卡顿。建议在脚本里做一次“谱线稀疏化”处理只要保留幅值大于基波幅值某百分比的谱线比如0.1%其他忽略。这样可以把几千条谱线压缩到几十条画图更快也不影响解读。threshold max(mags_out) * 0.001; % 0.1%的基波幅值作为阈值 idx_save mags_out threshold; f_out f_out(idx_save); mags_out mags_out(idx_save); ph_out ph_out(idx_save);这样操作后导出的CSV可能只有几十行但关键谐波信息全都在。10. 把脚本整合成一个小工具用了几次之后我把这个脚本优化成了一个可以直接在命令窗口调用的函数。在命令行输入exportFFTtoOrigin(i_a, 50, 0.06, 2, 2000)这种格式就能直接导出数据非常方便。一个简洁版函数定义如下function exportFFTtoOrigin(signal_name, f_base, t_start, n_cycles, max_freq) % 导出PowerGUI FFT数据到Origin兼容的CSV文件 % 示例: exportFFTtoOrigin(i_a, 50, 0.06, 2, 2000) % 省略了上面详述的数据处理流程核心逻辑一致 % 输出文件名自动包含信号名和时间戳防止覆盖 output_file sprintf(FFT_%s_%s.csv, signal_name, datestr(now, yyyymmdd_HHMMSS)); writetable(output_table, output_file); fprintf(数据已导出到 %s\n, output_file); end如果你想在Origin里一键调用MATLAB脚本还可以在Origin的Command Window里使用matlab -batch或者用Origin的LabTalk的system命令调用MATLAB。但说实话最方便的方式还是先在MATLAB里把CSV都生成好再到Origin里导入两个软件同步操作反而容易乱。11. 扩展思路从“导数据”到“自动出图”如果你已经能做到FFT数据自动导出下一步可以尝试用MATLAB直接出图而不经过Origin。虽然最终论文图一般还是用Origin做但在前期数据验证阶段用MATLAB快速画一张频谱图可以省掉很多来回导入导出的时间。方法很简单power_fft的结果拿到手之后用stem(f, mags)画谱线设置好坐标轴标注和网格直接就能和PowerGUI对照。这个验证步骤我一般每次跑完仿真都会做一遍确保脚本和PowerGUI设置没有偏差。有了脚本基础你还可以进一步扩展把三相的FFT结果放在同一个图里对比。输出一个“谐波次数-幅值”表方便直接粘贴到Word文档里。自动计算指定次谐波的占比比如3次、5次、7次谐波。这些扩展都很简单核心还是那三列数据频率、幅值、相位。12. 为什么“一模一样”导出对工程报告这么重要最后聊聊这个方法的实际价值。在工程实践中仿真与论文报告的数据保持一致是基本要求。如果PowerGUI里看到的THD是5.21%而你论文里写的THD是5.18%虽然数值接近但严格来说就已经是“对不上”了。对严谨的工程报告来说这种数据不一致很致命可能会导致返工或者被质疑。有了这套脚本每次仿真结束后导出的数据和PowerGUI显示的数据是同一套计算逻辑产生的自然就是完全一致的。你再也不需要手动抄录或补画几条线来“凑数”也不用担心截图里字太小或像素不够。另一个价值是效率。手动从PowerGUI导出一次数据然后作图熟练的人至少也要5~10分钟。用脚本自动化之后从Simulink仿真结束到Origin图出来整个过程可以控制在几秒内。遇到需要批量对比十几个工况的时候省下的时间非常可观。我自己用这个方法处理过三相整流器、逆变器、有源滤波器等多类模型的谐波分析目前在MATLAB R2020b和R2023a上都验证过没有发现兼容性问题。如果你用的版本确实比较特殊建议先在一台机器上测试一遍确认power_fft函数可调用后再推广到整个项目流程。
返回列表