據(jù)導(dǎo)入Matlab:用LTspice2Matlab打通仿真與后處理)
簡介面向電子電路仿真與數(shù)據(jù)分析場景LTspice2Matlab工具包專門解決LTspice與Matlab之間的數(shù)據(jù)導(dǎo)入問題適用于開關(guān)電源設(shè)計(jì)、模擬電路分析等需要將仿真波形轉(zhuǎn)換為可編程處理數(shù)據(jù)的工程師與科研人員。資源包共153個(gè)文件主要包含raw仿真原始數(shù)據(jù)、asc電路原理圖、plt繪圖配置、m腳本及md說明文檔整體大小僅2.37MB結(jié)構(gòu)緊湊便于查閱。其中m腳本提供封裝好的導(dǎo)入函數(shù)配合直流掃描、交流掃描、瞬態(tài)掃描等多個(gè)示例電路可在Matlab中直接運(yùn)行并完成波形繪制、快速傅里葉變換、濾波器設(shè)計(jì)等后續(xù)任務(wù)省去手動(dòng)解析文本數(shù)據(jù)的繁瑣過程。借助這套工具還能將仿真結(jié)果與實(shí)際硬件測試數(shù)據(jù)對(duì)比輔助電路模型校準(zhǔn)與性能預(yù)測。已有112人學(xué)習(xí)下載適合具備一定仿真基礎(chǔ)的中高級(jí)用戶能有效縮短從仿真到數(shù)據(jù)分析的鏈路提升電路驗(yàn)證與優(yōu)化效率。 做電路仿真的人十有八九都遇到過同一個(gè)尷尬LTspice波形窗口里看得好好的數(shù)據(jù)想拿進(jìn)Matlab做FFT、參數(shù)辨識(shí)或者和實(shí)測數(shù)據(jù)對(duì)比時(shí)卻不知道怎么把它干凈地導(dǎo)出來。LTspice本身有導(dǎo)出文本的功能但每次手動(dòng)導(dǎo)出、整理格式非常費(fèi)勁仿真跑幾十組參數(shù)的話光導(dǎo)出數(shù)據(jù)就想罵人。今天想聊的就是專門解決這個(gè)痛點(diǎn)的工具LTspice2Matlab。它在MathWorks官網(wǎng)文件交換區(qū)就能找到作用只有一個(gè)——把LTspice生成的.raw二進(jìn)制數(shù)據(jù)文件直接讀進(jìn)Matlab工作區(qū)返回時(shí)間向量和變量矩陣幾行代碼就能完成數(shù)據(jù)對(duì)接。適合經(jīng)常用LTspice做模擬電路、電源、濾波器仿真又需要在Matlab里做后續(xù)分析的人。1. 為什么在Matlab里看LTspice數(shù)據(jù)——打破仿真與后處理的隔閡1.1 我為什么被逼到找LTspice2Matlab一個(gè)真實(shí)場景先講個(gè)我自己的經(jīng)歷。之前做一個(gè)電源環(huán)路補(bǔ)償設(shè)計(jì)LTspice里搭好了Buck電路跑完交流掃描波特圖在LTspice窗口里看得很漂亮。但問題是我要把仿真結(jié)果和實(shí)驗(yàn)室里實(shí)測的環(huán)路增益曲線放在同一張圖里對(duì)比還得算出相位裕度、穿越頻率這些指標(biāo)。LTspice的波形查看器能看但不能做復(fù)雜的數(shù)值提取更不方便和測試數(shù)據(jù)做歸一化對(duì)比。那時(shí)候我試過幾種土辦法截屏后手動(dòng)描點(diǎn)、用Export data as text導(dǎo)成CSV再拖進(jìn)Matlab、甚至想過把波形圖放大后用鼠標(biāo)一個(gè)一個(gè)讀數(shù)。說實(shí)話效率低到離譜。一個(gè)波特圖幾百個(gè)點(diǎn)手動(dòng)描點(diǎn)描到懷疑人生而且一旦改了電路參數(shù)就得重新來一遍。LTspice2Matlab就是在這種情況下進(jìn)入視野的它直接把.raw文件里的所有仿真數(shù)據(jù)整體搬運(yùn)到Matlab工作區(qū)變量名、時(shí)間軸、數(shù)值全給你整整齊齊地?cái)[好后面你想怎么處理怎么處理。1.2 為什么不用手動(dòng)導(dǎo)出CSV對(duì)比一下效率有人可能會(huì)問LTspice本身就能導(dǎo)出文本數(shù)據(jù)我把它存成CSV再導(dǎo)入Matlab不就行了嗎確實(shí)行但只適合一次性、小規(guī)模的數(shù)據(jù)。我把兩種方式放在一起對(duì)比維度手動(dòng)導(dǎo)出CSV再導(dǎo)入LTspice2Matlab直讀單次操作耗時(shí)1-2分鐘左右?guī)酌攵辔募幚砻總€(gè)文件都要手動(dòng)操作腳本循環(huán)自動(dòng)處理變量信息需要手動(dòng)記順序自動(dòng)保留變量名列表重復(fù)修改參數(shù)后重新走一遍全部流程重新調(diào)用一次函數(shù)即可數(shù)據(jù)完整性可能漏掉部分變量.raw內(nèi)全部數(shù)據(jù)都在尤其在批量掃參的場景下dir(*.raw)加上循環(huán)就能把整個(gè)文件夾的仿真結(jié)果一次性導(dǎo)入手動(dòng)導(dǎo)出根本做不到這種自動(dòng)化程度。這也是我后來一直用LTspice2Matlab的原因——它把“仿真完成”到“數(shù)據(jù)可用”這段路直接鋪平了。2. 搭建環(huán)境LTspice、Matlab和LTspice2Matlab的安裝與配置2.1 LTspice側(cè)確保.raw文件是二進(jìn)制格式LTspice2Matlab讀取的是LTspice仿真后生成的.raw文件這個(gè)文件默認(rèn)是二進(jìn)制格式里面保存了所有仿真變量在每個(gè)時(shí)間點(diǎn)的數(shù)值。LTspice仿真完成后.raw文件會(huì)自動(dòng)出現(xiàn)在原理圖所在目錄下文件名與原理圖一致后綴為.raw。這里有一個(gè)很關(guān)鍵的設(shè)置項(xiàng)。LTspice的控制面板里有一項(xiàng)輸出格式選項(xiàng)如果你不小心勾選了“保存為ASCII文本”之類的選項(xiàng)生成的.raw文件就不是二進(jìn)制LTspice2Matlab讀取時(shí)會(huì)直接報(bào)錯(cuò)。具體路徑在Control Panel - Operation務(wù)必保證二進(jìn)制raw格式處于開啟狀態(tài)。我見過好幾個(gè)同事導(dǎo)入失敗最后發(fā)現(xiàn)都是因?yàn)橹霸趧e的地方調(diào)過這個(gè)選項(xiàng)。另外要注意的是LTspice有多個(gè)版本LTspice IV和LTspice XVII的raw格式在歷史上有些微差異。如果你用的是很老的LTspice IV建議去文件交換區(qū)下載最新版的LTspice2Matlab腳本新版本對(duì)老格式兼容性更好。2.2 在Matlab里接入LTspice2Matlab下載、放路徑、調(diào)用LTspice2Matlab本質(zhì)上是一個(gè).m函數(shù)文件不涉及編譯安裝部署非常簡單。第一步在MathWorks官網(wǎng)的File Exchange搜索“LTspice2Matlab”下載LTspice2Matlab.m文件。如果你用公司內(nèi)網(wǎng)訪問不了也可以找同事要一份現(xiàn)成的腳本這個(gè)文件是開源的傳播很普遍。第二步把LTspice2Matlab.m放到Matlab可以找到的位置。我習(xí)慣建一個(gè)專門放自用腳本的目錄比如D:\MyMatlabTools然后在Matlab里執(zhí)行addpath(D:\MyMatlabTools);為了避免每次啟動(dòng)Matlab都要重新添加路徑可以在預(yù)設(shè)項(xiàng) - MATLAB - 常規(guī) - 自定義路徑里把這個(gè)目錄加進(jìn)去這樣以后啟動(dòng)就自動(dòng)加載了。第三步驗(yàn)證是否安裝成功。隨便跑一個(gè)LTspice仿真到仿真目錄下執(zhí)行data LTspice2Matlab(your_sim.raw);如果不報(bào)錯(cuò)說明環(huán)境已經(jīng)通了。這一步建議先拿最簡單的電路驗(yàn)證不要一上來就處理大型掃描數(shù)據(jù)否則出了問題很難判斷是環(huán)境問題還是數(shù)據(jù)問題。3. 實(shí)操第一個(gè)完整的LTspice-to-Matlab導(dǎo)入任務(wù)3.1 先跑一個(gè)最簡單的RC電路紙上談兵沒意思直接拿一個(gè)RC電路完整走一遍流程。在LTspice里搭一個(gè)最簡單的低通濾波器一個(gè)電壓源V1一個(gè)電阻R1一個(gè)電容C1節(jié)點(diǎn)命名分別是IN和OUT。給V1設(shè)置一個(gè)階躍源或者脈沖源仿真類型選暫態(tài)分析.tran 5m也就是仿真5毫秒。仿真跑完后在原理圖同目錄下會(huì)生成一個(gè)RC_test.raw文件?,F(xiàn)在打開Matlab把當(dāng)前工作目錄切到原理圖所在文件夾然后執(zhí)行data LTspice2Matlab(RC_test.raw);第一次看到data這個(gè)結(jié)構(gòu)體的時(shí)候你可能會(huì)覺得有點(diǎn)亂但其實(shí)字段很清晰。我用得最多的三個(gè)字段是data.time_vec時(shí)間向量也就是橫軸數(shù)據(jù)。注意這個(gè)時(shí)間向量不一定是等間隔的LTspice在波形變化劇烈時(shí)會(huì)自動(dòng)加密步長。data.variable_name_list變量名列表按順序?qū)?yīng)每一列數(shù)據(jù)里面能看到V(in)、V(out)、I(R1)這些名字。data.variable_mat實(shí)際的數(shù)值矩陣每一列對(duì)應(yīng)一個(gè)變量。3.2 核心命令與數(shù)據(jù)結(jié)構(gòu)解析來看一段完整的讀取代碼% 讀取LTspice仿真數(shù)據(jù) data LTspice2Matlab(RC_test.raw); % 提取時(shí)間軸 t data.time_vec; % 查看變量列表確認(rèn)輸入輸出電壓對(duì)應(yīng)的列 disp(data.variable_name_list); % 提取輸出電壓數(shù)據(jù) vout data.variable_mat(:, 2); % 假設(shè)第2列是V(out) % 繪制波形 plot(t * 1e3, vout, LineWidth, 1.5); xlabel(Time (ms)); ylabel(Voltage (V)); title(RC Step Response); grid on;這里有個(gè)容易踩坑的地方variable_mat的列順序和variable_name_list里的順序是對(duì)應(yīng)的但每次仿真變量順序可能不一樣。我吃過一次虧直接用第2列當(dāng)輸出電壓結(jié)果那次仿真的第2列恰好是輸入電壓圖畫出來完全不對(duì)。所以正式處理之前一定先打印variable_name_list確認(rèn)一下或者用代碼自動(dòng)查找目標(biāo)變量的索引varIdx find(strcmp(data.variable_name_list, V(out))); vout data.variable_mat(:, varIdx);3.3 導(dǎo)入之后讓數(shù)據(jù)真正“能用”畫圖、FFT、提取指標(biāo)數(shù)據(jù)導(dǎo)入Matlab只是第一步大部分人的真實(shí)需求是在導(dǎo)入后做定量分析。最常見的一個(gè)場景是做FFT頻譜分析但這里有個(gè)細(xì)節(jié)很多人沒有注意到LTspice暫態(tài)仿真的時(shí)間步長是自適應(yīng)變化的不是均勻采樣直接在原始時(shí)間軸上做FFT會(huì)得到不準(zhǔn)確的結(jié)果。穩(wěn)妥的做法是先做重采樣把數(shù)據(jù)插值到等間隔的時(shí)間網(wǎng)格上再做FFT% 重采樣到均勻時(shí)間軸fs1MHz fs 1e6; t_uniform (0 : 1/fs : t(end)); vout_uniform interp1(t, vout, t_uniform, linear); % 做FFT Y fft(vout_uniform); f (0 : length(Y)-1) * fs / length(Y); plot(f(1:length(f)/2), abs(Y(1:length(Y)/2))); xlabel(Frequency (Hz)); ylabel(Magnitude);除了FFT另一個(gè)高頻需求是從時(shí)域波形里提取指標(biāo)比如上升時(shí)間、過沖、穩(wěn)定時(shí)間。這些在LTspice里也能測但只能通過光標(biāo)一點(diǎn)點(diǎn)讀比較麻煩。導(dǎo)入Matlab后可以用幾行代碼自動(dòng)算出來尤其適合批量處理不同參數(shù)下的大量波形。4. 數(shù)據(jù)導(dǎo)入之后幾個(gè)高頻場景的封裝方法4.1 批量處理多個(gè).raw文件仿真不可能只跑一次。我在做參數(shù)優(yōu)化的時(shí)候經(jīng)常一個(gè)晚上跑二三十個(gè)不同電容、電阻參數(shù)的仿真。如果每個(gè)文件都手動(dòng)讀取效率太低。這時(shí)候直接用dir配合循環(huán)處理files dir(*.raw); for k 1:length(files) data LTspice2Matlab(files(k).name); % 根據(jù)文件名提取參數(shù) params extractParams(files(k).name); % 提取輸出變量并計(jì)算指標(biāo) idx find(strcmp(data.variable_name_list, V(out))); vout data.variable_mat(:, idx); % 計(jì)算并存儲(chǔ) result(k).name files(k).name; result(k).overshoot calcOvershoot(vout); end批量仿真還有一個(gè)更省事的方式用LTspice的命令行模式。在命令行直接執(zhí)行PATH_TO_LTSPICE\XVIIx86.exe -b netlist.ascLTspice會(huì)靜默仿真并在后臺(tái)生成.raw文件配合Matlab的system命令可以做到全自動(dòng)化。我現(xiàn)在的流程基本是Matlab腳本自動(dòng)修改原理圖參數(shù)→調(diào)用LTspice命令行仿真→用LTspice2Matlab讀回?cái)?shù)據(jù)→自動(dòng)分析并畫圖。4.2 處理.step參數(shù)掃描的數(shù)據(jù)LTspice的.step指令可以一次仿真跑多個(gè)參數(shù)比如.step param R 1k 10k 1k會(huì)跑10組電阻。這種仿真生成的.raw文件里包含多組數(shù)據(jù)處理起來相對(duì)麻煩。我的個(gè)人建議是如果后續(xù)要批量導(dǎo)入Matlab做定量分析盡量少用.step而是把不同的參數(shù)組合拆成單獨(dú)的原理圖文件用批量仿真方式生成多個(gè).raw文件。這樣每個(gè).raw對(duì)應(yīng)一組參數(shù)數(shù)據(jù)結(jié)構(gòu)清晰不用在Matlab里再去拆分。.step適合在LTspice里快速掃參看趨勢但如果要精確提取每組參數(shù)對(duì)應(yīng)的指標(biāo)單個(gè)文件導(dǎo)入會(huì)更省心。如果你確實(shí)需要處理.step生成的raw文件LTspice2Matlab也能讀但返回的數(shù)據(jù)結(jié)構(gòu)會(huì)包含所有step的數(shù)據(jù)需要根據(jù)變量名或者數(shù)據(jù)長度自行切分。我之前試過幾次感覺切分邏輯有點(diǎn)繞后來還是改成了批量生成獨(dú)立文件的方式效率反而更高。4.3 對(duì)齊時(shí)間軸非均勻采樣的處理LTspice的自適應(yīng)步長對(duì)仿真精度很有幫助但對(duì)后期數(shù)據(jù)分析卻是個(gè)障礙。特別是當(dāng)你需要把多個(gè)不同仿真條件的結(jié)果放在同一張圖里對(duì)比或者要把不同仿真的時(shí)間軸對(duì)齊時(shí)必須統(tǒng)一采樣網(wǎng)格。我的標(biāo)準(zhǔn)做法是所有從LTspice導(dǎo)入的數(shù)據(jù)統(tǒng)一用interp1插值到相同的時(shí)間軸。比如所有對(duì)比實(shí)驗(yàn)都重采樣到0.1微秒間隔這樣后面的計(jì)算和繪圖都不用再去處理時(shí)間軸的不一致性。% 定義統(tǒng)一時(shí)間軸 t_target (0 : 1e-7 : 5e-3); vout_resampled interp1(t, vout, t_target, pchip);這里我用pchip而不是linear因?yàn)槿蜨ermite插值在波形轉(zhuǎn)折處的處理更平滑不會(huì)像線性插值那樣引入明顯的棱角。不過如果你的波形本身很平滑兩者差別不大。5. 常見問題與排查技巧實(shí)錄5.1 五類高頻報(bào)錯(cuò)速查表用LTspice2Matlab的過程中我從新手到熟練踩了不少坑總結(jié)成下面這張速查表報(bào)錯(cuò)現(xiàn)象原因解決辦法找不到文件當(dāng)前目錄不對(duì)或文件名拼寫錯(cuò)誤用cd切換目錄檢查后綴是否為.rawInvalid file identifier.raw文件被保存成ASCII文本格式在LTspice控制面板改回二進(jìn)制格式重新仿真變量列表為空仿真沒有保存目標(biāo)變量在LTspice中使用.save指令指定保存變量讀取結(jié)果明顯不對(duì)變量列順序和預(yù)期不一致先用variable_name_list確認(rèn)列順序中文路徑報(bào)錯(cuò)Matlab在中文路徑下讀文件異常把原理圖和.raw文件放到英文路徑第二條值得多說一句。LTspice的“ASCII raw”選項(xiàng)是個(gè)老坑一旦勾上后續(xù)所有仿真都會(huì)輸出ASCII格式文件體積大且LTspice2Matlab讀不了。如果你發(fā)現(xiàn)raw文件比平時(shí)大很多先懷疑這個(gè)設(shè)置。5.2 避坑小貼士文件占用、命名規(guī)范、變量順序除了報(bào)錯(cuò)還有一些比較隱蔽的細(xì)節(jié)第一個(gè)是數(shù)據(jù)文件的占用問題。LTspice仿真結(jié)束后如果波形窗口還開著或者正在查看數(shù)據(jù).raw文件可能被程序鎖定。這時(shí)候Matlab去讀取會(huì)報(bào)錯(cuò)。保險(xiǎn)起見等LTspice完全釋放文件后再執(zhí)行導(dǎo)入。我自己通常先關(guān)掉波形窗口再切到Matlab執(zhí)行讀取。第二個(gè)是命名規(guī)范。.raw文件的文件名最好不要包含中文、空格、特殊符號(hào)。LTspice本身支持中文路徑但Matlab讀取時(shí)很容易因?yàn)榫幋a問題報(bào)錯(cuò)。把工程文件統(tǒng)一用英文命名是省心省力的好習(xí)慣。第三個(gè)是變量順序。這一點(diǎn)前面提過但值得反復(fù)強(qiáng)調(diào)永遠(yuǎn)不要靠記憶猜變量列數(shù)。每換一個(gè)電路或原理圖變量順序很可能就變了。用strcmp自動(dòng)查索引是必須寫進(jìn)腳本的習(xí)慣。如果你要做長期的數(shù)據(jù)分析建議在LTspice2Matlab外面再包一層自己的封裝函數(shù)。比如我寫了一個(gè)loadLTspiceData(fileName, signalName)內(nèi)部自動(dòng)調(diào)LTspice2Matlab然后根據(jù)信號(hào)名自動(dòng)找到對(duì)應(yīng)的列返回時(shí)間軸和信號(hào)數(shù)據(jù)。這樣主腳本里不需要每次都處理變量順序的邏輯代碼可讀性也高。用了一兩年LTspice2Matlab之后我最深的體會(huì)是真正難的不是導(dǎo)入這個(gè)動(dòng)作而是想清楚數(shù)據(jù)導(dǎo)入之后要怎么組織。如果你只是偶爾看一次波形LTspice自帶窗口完全夠用一旦涉及批量掃參、與實(shí)測數(shù)據(jù)對(duì)比、自動(dòng)化分析這套流程會(huì)讓你省下大量時(shí)間。先用最簡單的RC電路把流程跑通確認(rèn)環(huán)境沒問題再把復(fù)雜度逐步加進(jìn)去這個(gè)工具就能變成你仿真流程里一個(gè)很順手的環(huán)節(jié)。本文還有配套的精品資源點(diǎn)擊獲取