繪制天線方向圖:從坐標(biāo)變換到渲染調(diào)參全流程)
簡(jiǎn)介MATLAB三維繪圖常用surf或mesh但兩者均基于笛卡爾坐標(biāo)缺少三維極坐標(biāo)繪制函數(shù)。針對(duì)這一缺口這份代碼包以天線三維方向圖為例演示了先將極坐標(biāo)數(shù)據(jù)轉(zhuǎn)換為笛卡爾坐標(biāo)、再通過(guò)surf繪制的完整流程所得結(jié)果與HFSS仿真方向圖一致適用于需繪制球面坐標(biāo)或方向圖類(lèi)數(shù)據(jù)的學(xué)生、科研與工程人員。壓縮包共2個(gè)文件僅320KB包含一個(gè).m繪圖腳本和一個(gè).csv數(shù)據(jù)文件腳本承擔(dān)坐標(biāo)轉(zhuǎn)換與出圖csv保存已導(dǎo)出的方向圖數(shù)據(jù)便于直接運(yùn)行并替換成自己的數(shù)據(jù)目前已有16174人學(xué)習(xí)。通過(guò)示例可快速獲得三維極坐標(biāo)繪制的核心思路以及可修改復(fù)用的繪圖腳本并能與HFSS對(duì)比驗(yàn)證減少盲目摸索時(shí)間。1. 三維極坐標(biāo)繪圖天線方向圖可視化繞不開(kāi)的工程難題天線方向圖是天線設(shè)計(jì)中最直觀的性能載體一張三維方向圖能同時(shí)表達(dá)主瓣寬度、旁瓣電平、前后比和波束指向比任何表格數(shù)據(jù)都高效。很多人在拿到仿真軟件導(dǎo)出的 theta、phi、gain 數(shù)據(jù)后第一反應(yīng)是用plot3硬畫(huà)結(jié)果畫(huà)出來(lái)的是一團(tuán)亂麻——曲線在空間里來(lái)回穿插看不出波束形狀更別說(shuō)做設(shè)計(jì)評(píng)審了。之所以出現(xiàn)這種翻車(chē)場(chǎng)面是因?yàn)榉较驁D數(shù)據(jù)本質(zhì)上是球坐標(biāo)系下的標(biāo)量場(chǎng)而plot3只接受笛卡爾坐標(biāo)的散點(diǎn)或曲線二者之間存在一個(gè)坐標(biāo)映射的鴻溝。這篇方案以「MATLAB 三維極坐標(biāo)繪制天線方向圖」為例從數(shù)據(jù)格式解析、坐標(biāo)變換、曲面重建到渲染調(diào)參給出一套能直接落地的完整流程。適合正在做天線課設(shè)、陣列綜合畢設(shè)的學(xué)生也適合需要快速出圖做技術(shù)評(píng)審的射頻工程師——這套方法不依賴商業(yè)仿真軟件用 MATLAB 基礎(chǔ)函數(shù)就能完成從數(shù)據(jù)到可交互三維圖形的全過(guò)程。2. 需求分析與技術(shù)選型先搞清楚數(shù)據(jù)長(zhǎng)什么樣再?zèng)Q定用哪個(gè)函數(shù)2.1 天線方向圖數(shù)據(jù)的三層結(jié)構(gòu)天線方向圖的原始數(shù)據(jù)通常來(lái)自電磁仿真軟件或?qū)崪y(cè)暗室格式上逃不出三種第一種是規(guī)則網(wǎng)格即 theta 和 phi 各自等間隔采樣增益值按二維矩陣存儲(chǔ)這是最常見(jiàn)、也最好處理的格式第二種是極坐標(biāo)掃描格式即每個(gè) phi 角下記錄一組 theta 方向上的幅度值本質(zhì)上是把二維矩陣按角度拆成了多段折線第三種是稀疏散點(diǎn)格式即仿真軟件只在關(guān)鍵角度輸出數(shù)據(jù)數(shù)據(jù)點(diǎn)之間沒(méi)有規(guī)則排布。我在處理實(shí)測(cè)數(shù)據(jù)時(shí)遇到過(guò)第三種情況那種格式最坑——表面上看數(shù)據(jù)量很大實(shí)際上有效信息密度極低如果不做網(wǎng)格化重建直接繪圖出來(lái)的圖形會(huì)像「刺猬」一樣滿是毛刺。因此在開(kāi)始寫(xiě)繪圖代碼之前第一件事是確認(rèn)數(shù)據(jù)屬于哪一種格式而不是急著調(diào)色、調(diào)視角。通常的做法是先用whos檢查變量維度再用size確認(rèn)矩陣形態(tài)最后用min和max掃一遍角度范圍。這一步花不了五分鐘卻能省掉后面至少兩小時(shí)的排查時(shí)間。% 檢查數(shù)據(jù)結(jié)構(gòu)theta、phi、gain 三個(gè)變量 whos theta phi gain disp([min(theta(:)), max(theta(:))]); % theta 范圍通常 0~pi disp([min(phi(:)), max(phi(:))]); % phi 范圍通常 0~2*pi disp(size(gain)); % 判斷是否為 [len(theta), len(phi)] 網(wǎng)格這段代碼的核心目的是判斷數(shù)據(jù)是否能直接用于曲面重建。如果 gain 是二維矩陣且尺寸與 theta、phi 的長(zhǎng)度匹配說(shuō)明是規(guī)則網(wǎng)格可以直接走下一步坐標(biāo)變換如果 gain 是一維向量說(shuō)明是散點(diǎn)數(shù)據(jù)需要先做插值網(wǎng)格化。這里有個(gè)容易被忽略的細(xì)節(jié)很多仿真軟件導(dǎo)出的 theta 是 0 到 180 度但存成弧度后會(huì)包含 0 和 pi 兩個(gè)端點(diǎn)這兩個(gè)點(diǎn)在球坐標(biāo)系中對(duì)應(yīng)的是北極和南極如果插值算法不當(dāng)極點(diǎn)附近會(huì)出現(xiàn)明顯的畸變后面會(huì)專(zhuān)門(mén)講這個(gè)問(wèn)題。2.2 三條繪圖路線surf、polarplot3d 與自定義映射確定了數(shù)據(jù)結(jié)構(gòu)之后繪圖路線的選擇直接決定出圖質(zhì)量。目前主流的方案有三條。第一條是用surf配合sph2cart坐標(biāo)變換這條路完全基于 MATLAB 內(nèi)置函數(shù)不依賴任何第三方工具箱。優(yōu)點(diǎn)是可控性強(qiáng)從坐標(biāo)變換到著色全部自己掌控適合需要深度定制渲染效果的場(chǎng)景缺點(diǎn)是代碼量稍微大一些而且要自己處理網(wǎng)格生成和坐標(biāo)映射細(xì)節(jié)。第二條是使用 File Exchange 上的polarplot3d函數(shù)這是專(zhuān)門(mén)為三維極坐標(biāo)可視化設(shè)計(jì)的工具輸入 theta、phi、r 就能直接出圖內(nèi)部已經(jīng)處理好了球坐標(biāo)映射和曲面重建。優(yōu)點(diǎn)是上手快代碼量可以壓縮到十幾行缺點(diǎn)是這個(gè)函數(shù)不在 MATLAB 官方工具箱里需要手動(dòng)下載并添加到路徑而且它的返回參數(shù)比較「黑匣子」后期要調(diào)整顏色映射或光照時(shí)往往得翻源碼。第三條是完全自定義坐標(biāo)映射和patch繪制用surf2patch把網(wǎng)格轉(zhuǎn)成面片再手動(dòng)控制繪制。這條路適合特殊投影方式或非標(biāo)準(zhǔn)球面坐標(biāo)系統(tǒng)一般場(chǎng)景用不上。我一般首選第一條路線因?yàn)閟urf是 MATLAB 最成熟的繪圖函數(shù)之一渲染性能穩(wěn)定而且對(duì)后續(xù)的顏色映射、光照、視角調(diào)整都有完整的文檔支持。polarplot3d適合快速出初稿看趨勢(shì)但到了要交圖、出報(bào)告的時(shí)候還是sph2cart加surf的組合最可靠。% 路線一sph2cart surf 的完整骨架 [Theta, Phi] meshgrid(theta, phi); GainLinear 10.^(gain / 20); % 若 gain 為 dB 值先轉(zhuǎn)線性幅度 [X, Y, Z] sph2cart(Phi, pi/2 - Theta, GainLinear); surf(X, Y, Z, GainLinear, EdgeColor, none); axis equal; % 保持球面形狀不變形這段代碼里有三個(gè)設(shè)計(jì)決策值得說(shuō)明。第一gain / 20的換算只在增益以 dB 為單位時(shí)需要如果是線性幅度值則跳過(guò)這一步第二sph2cart的第二個(gè)參數(shù)是仰角而非俯仰角所以要用pi/2 - Theta做轉(zhuǎn)換第三EdgeColor設(shè)為none是為了消除網(wǎng)格線對(duì)面片顏色信息的干擾否則密集網(wǎng)格下整個(gè)圖形會(huì)變成一張黑網(wǎng)。2.3 為什么不用polar函數(shù)硬拼三維很多剛接觸這個(gè)需求的人會(huì)嘗試直接用二維polar函數(shù)畫(huà)多個(gè) phi 截面圖然后疊加在一起冒充三維方向圖。這條路在視覺(jué)上勉強(qiáng)能看出波束指向但本質(zhì)上是個(gè)平面圖的堆疊無(wú)法旋轉(zhuǎn)視角也無(wú)法從任意角度觀察旁瓣形態(tài)更致命的是它不能直觀展示主瓣和旁瓣的空間關(guān)系。用作中期匯報(bào)的過(guò)渡圖可以但作為最終交付成果是不過(guò)關(guān)的。正確的思路是把三維極坐標(biāo)繪圖拆成兩個(gè)步驟先做坐標(biāo)變換把球坐標(biāo)系下的(theta, phi, r)映射到笛卡爾坐標(biāo)系的(X, Y, Z)再用surf做曲面渲染。這個(gè)拆法聽(tīng)起來(lái)簡(jiǎn)單但實(shí)際工程里 80% 的問(wèn)題都出在坐標(biāo)映射這一步——角度范圍搞錯(cuò)、坐標(biāo)軸方向反了、增益值的歸一化范圍不對(duì)都會(huì)讓最終的圖形出現(xiàn)「變形」或「穿?!埂@斫饬诉@一點(diǎn)后面所有的實(shí)現(xiàn)細(xì)節(jié)都是在圍繞「讓坐標(biāo)變換正確、讓渲染結(jié)果可讀」這兩個(gè)目標(biāo)展開(kāi)。3. 總體架構(gòu)設(shè)計(jì)數(shù)據(jù)預(yù)處理、坐標(biāo)映射、曲面渲染與交互控制四大模塊3.1 模塊劃分與數(shù)據(jù)流把完整的三維方向圖繪制流程拆解開(kāi)可以歸納為四個(gè)模塊數(shù)據(jù)預(yù)處理、坐標(biāo)映射、曲面渲染、交互控制。這四個(gè)模塊按照「數(shù)據(jù)輸入 → 清洗重排 → 坐標(biāo)變換 → 繪制 → 后處理」的順序串聯(lián)形成一個(gè)可復(fù)用的管線。這個(gè)管線設(shè)計(jì)的好處是當(dāng)數(shù)據(jù)源從仿真軟件換成實(shí)測(cè)數(shù)據(jù)時(shí)只需要替換第一個(gè)模塊的讀取邏輯后面的坐標(biāo)映射和渲染模塊完全不用動(dòng)。數(shù)據(jù)預(yù)處理模塊承擔(dān)三件事格式判別、范圍裁剪、單位統(tǒng)一。格式判別就是前面提到的判斷數(shù)據(jù)是規(guī)則網(wǎng)格還是散點(diǎn)范圍裁剪是把不需要的角度區(qū)間切掉比如只關(guān)心上半空間時(shí)可以把 theta 大于 90 度的數(shù)據(jù)剔除單位統(tǒng)一是把可能混用的 dB、dBm、線性幅度全部換算到同一個(gè)量綱。這個(gè)模塊的輸出是一份「干凈」的網(wǎng)格化數(shù)據(jù)即 theta 向量、phi 向量和對(duì)應(yīng)的增益矩陣。坐標(biāo)映射模塊是核心中的核心它把預(yù)處理后的球坐標(biāo)數(shù)據(jù)通過(guò)sph2cart變換到笛卡爾坐標(biāo)系同時(shí)完成兩個(gè)關(guān)鍵的輔助操作一是增益歸一化把增益值映射到 [0,1] 區(qū)間用于顏色映射二是半徑補(bǔ)償當(dāng)天線方向圖存在極深的零點(diǎn)時(shí)比如 -40 dB 以下直接映射會(huì)導(dǎo)致圖形在零點(diǎn)處塌縮成尖刺需要做動(dòng)態(tài)范圍壓縮或設(shè)置底噪電平。我通常的做法是把低于某個(gè)閾值的增益全部拉平到底噪電平避免零點(diǎn)處的數(shù)值爆炸。% 坐標(biāo)映射模塊計(jì)入動(dòng)態(tài)范圍壓縮 dynamic_range 40; % 動(dòng)態(tài)范圍 40 dB gain_clipped max(gain, -dynamic_range); % 低于底噪的增益拉平 gain_norm (gain_clipped dynamic_range) / dynamic_range; % 歸一化到 [0,1]這段代碼代表了一個(gè)真實(shí)工程中幾乎必然遇到的場(chǎng)景。實(shí)測(cè)天線方向圖的動(dòng)態(tài)范圍往往遠(yuǎn)超 40 dB主瓣峰值可能比旁瓣高 25 dB 以上如果不對(duì)數(shù)據(jù)做裁剪顏色映射會(huì)變得毫無(wú)區(qū)分度——主瓣一片紅旁瓣全是藍(lán)中間過(guò)渡信息全部丟失。動(dòng)態(tài)范圍壓縮的本質(zhì)是「犧牲極低電平處的細(xì)節(jié)換取主要波束的可視性」這在方向圖可視化中是合理且必要的取舍。3.2 曲面渲染模塊從網(wǎng)格到實(shí)體的視覺(jué)參數(shù)渲染模塊的核心是surf函數(shù)但這只是起點(diǎn)真正決定輸出質(zhì)量的是圍繞surf的一組后處理參數(shù)。顏色映射用colormap控制常用的方案是jet或parula前者對(duì)比強(qiáng)烈適合凸顯旁瓣差異后者漸變平滑適合展示主瓣細(xì)節(jié)光照用light和lighting控制合理的布光能讓曲面產(chǎn)生明暗過(guò)渡增強(qiáng)立體感視角用view控制默認(rèn)的三維視角view(3)是 -37.5 度方位角和 30 度仰角但天線方向圖的最佳視角通常需要手動(dòng)調(diào)整把主瓣對(duì)準(zhǔn)視線方向。此外還要考慮坐標(biāo)軸的顯示問(wèn)題。默認(rèn)的笛卡爾坐標(biāo)軸在三維方向圖中會(huì)顯得突兀通常的做法是用axis off隱藏坐標(biāo)軸再用xlabel、ylabel、zlabel手動(dòng)添加帶單位的標(biāo)注或者用axis tight收緊坐標(biāo)軸范圍讓曲面填滿整個(gè)畫(huà)布。我做交付圖時(shí)一般傾向于隱藏原始坐標(biāo)軸線改用箭頭標(biāo)注三個(gè)坐標(biāo)方向這樣圖面更干凈也更容易聚焦到方向圖本身的形態(tài)上。% 渲染參數(shù)設(shè)置顏色、光照、視角一體化 colormap(jet(256)); light(Position, [1 1 1], Style, infinite); % 從右上方向打光 lighting gouraud; % 平滑光照過(guò)渡更自然 xlabel(X / 波長(zhǎng)單位); ylabel(Y / 波長(zhǎng)單位); zlabel(增益幅度); material dull; % 漫反射材質(zhì)避免過(guò)亮高光每一個(gè)參數(shù)都有可調(diào)的空間。lighting gouraud比f(wàn)lat更平滑但更耗資源數(shù)據(jù)量大時(shí)可能出現(xiàn)卡頓material dull讓曲面呈現(xiàn)磨砂質(zhì)感適合顯示增益漸變?nèi)绻胱屩靼陞^(qū)域更亮可以把光源位置調(diào)到[0 0 1]的正上方。這些參數(shù)沒(méi)有絕對(duì)的對(duì)錯(cuò)取決于最終圖要表達(dá)什么信息量。3.3 交互控制模塊旋轉(zhuǎn)、縮放與數(shù)據(jù)探針靜態(tài)的三維圖在報(bào)告里夠用但在桌面端評(píng)審時(shí)交互能力是剛需。MATLAB 的rotate3d開(kāi)箱即用允許鼠標(biāo)拖拽旋轉(zhuǎn)視角這是最基礎(chǔ)的交互。進(jìn)階的交互包括兩個(gè)方向一是數(shù)據(jù)探針用datacursormode點(diǎn)擊曲面上的點(diǎn)直接讀取該點(diǎn)的 theta、phi 和增益值這對(duì)評(píng)審時(shí)快速定位主瓣峰值位置和旁瓣電平非常有用二是動(dòng)態(tài)截面切換通過(guò)滑塊控件uicontrol或uislider實(shí)時(shí)切換 phi 截面的方向圖曲線相當(dāng)于在三維視圖里嵌入一個(gè)二維掃描工具。% 開(kāi)啟旋轉(zhuǎn)與數(shù)據(jù)探針 rotate3d on; datacursormode on;這兩行代碼看似簡(jiǎn)單實(shí)際工程價(jià)值很大。評(píng)審時(shí)最常被問(wèn)到的問(wèn)題就是「這個(gè)旁瓣在哪個(gè)方位、電平是多少」如果沒(méi)有數(shù)據(jù)探針你得回頭查矩陣索引慢慢算有了探針直接鼠標(biāo)點(diǎn)上去就能讀數(shù)。我在做陣列天線設(shè)計(jì)的仿真評(píng)審時(shí)每次都開(kāi)著數(shù)據(jù)探針現(xiàn)場(chǎng)回答這類(lèi)問(wèn)題可以省掉大量尷尬的沉默時(shí)間。4. 核心實(shí)現(xiàn)從方向圖數(shù)據(jù)到可交付三維曲面的完整代碼與參數(shù)調(diào)優(yōu)4.1 規(guī)則網(wǎng)格數(shù)據(jù)的全流程實(shí)現(xiàn)這是最標(biāo)準(zhǔn)、最高頻的場(chǎng)景仿真軟件導(dǎo)出的方向圖數(shù)據(jù)是規(guī)則的二維矩陣theta 從 0 到 180 度每 1 度一個(gè)點(diǎn)phi 從 0 到 360 度每 1 度一個(gè)點(diǎn)增益矩陣是 181×361 的二維數(shù)組。針對(duì)這種數(shù)據(jù)完整流程分五步加載數(shù)據(jù)、生成網(wǎng)格、坐標(biāo)變換、繪制曲面、添加標(biāo)注。下面給出一個(gè)完整的參考實(shí)現(xiàn)。% 規(guī)則網(wǎng)格方向圖三維繪制完整流程 theta linspace(0, pi, 181); % 俯仰角 0~180 度轉(zhuǎn)弧度 phi linspace(0, 2*pi, 361); % 方位角 0~360 度 [Phi, Theta] meshgrid(phi, theta); % 生成角度網(wǎng)格 % 仿真軟件導(dǎo)出的增益矩陣 gain_db維度 [181, 361] gain_lin 10.^(gain_db / 20); % dB 轉(zhuǎn)線性幅度電壓比 % 球坐標(biāo)轉(zhuǎn)笛卡爾坐標(biāo)注意仰角 pi/2 - theta [X, Y, Z] sph2cart(Phi, pi/2 - Theta, gain_lin); % 繪制曲面用增益值控制顏色 figure(Color, w); surf(X, Y, Z, gain_db, EdgeColor, none, FaceAlpha, 0.95); colormap(parula(256)); colorbar; % 顯示增益刻度 axis equal; % 保持球面比例不變 xlabel(X); ylabel(Y); zlabel(Z); title(天線三維方向圖規(guī)則網(wǎng)格); view(45, 25); % 設(shè)置初始視角 light(Position, [1 1 1]); lighting gouraud;這段代碼中有三個(gè)細(xì)節(jié)需要特別說(shuō)明。第一sph2cart輸入的是仰角而非俯仰角所以用pi/2 - Theta做轉(zhuǎn)換這是最容易寫(xiě)錯(cuò)的地方寫(xiě)反了圖形會(huì)上下顛倒而且由于球坐標(biāo)的對(duì)稱(chēng)性上下顛倒后可能還看不出明顯異常直到對(duì)增益讀數(shù)才發(fā)現(xiàn)對(duì)不上。第二surf的顏色數(shù)據(jù)用的是gain_db而不是gain_lin這意味著顏色反映的是 dB 值而非線性值在方向圖場(chǎng)景里這是正確的選擇因?yàn)?dB 值才能讓旁瓣之間的細(xì)小差異在顏色上可見(jiàn)。第三FaceAlpha設(shè)為 0.95 而不是 1這樣可以略微透出背面的輪廓增強(qiáng)立體感知但值太小時(shí)會(huì)顯得「虛」0.9 到 0.95 是一個(gè)比較穩(wěn)妥的區(qū)間。4.2 散點(diǎn)數(shù)據(jù)的網(wǎng)格化重建從「刺猬圖」到光滑曲面處理散點(diǎn)數(shù)據(jù)是另一個(gè)常見(jiàn)的痛點(diǎn)。實(shí)測(cè)暗室掃描時(shí)往往是不規(guī)則的采樣點(diǎn)某些角度密、某些角度疏直接surf根本畫(huà)不出來(lái)。此時(shí)需要先做插值網(wǎng)格化。最穩(wěn)妥的路徑是用scatteredInterpolant它對(duì)二維散點(diǎn)插值支持良好而且能選擇插值方法。下面給出一個(gè)標(biāo)準(zhǔn)處理流程。% 散點(diǎn)方向圖數(shù)據(jù)網(wǎng)格化重建 theta_s data(:, 1); % 散點(diǎn)的 theta 角度弧度 phi_s data(:, 2); % 散點(diǎn)的 phi 角度弧度 gain_s data(:, 3); % 對(duì)應(yīng)增益值dB % 將角度映射到平面坐標(biāo)用 theta 和 phi 構(gòu)造插值空間 F scatteredInterpolant(theta_s, phi_s, gain_s, linear, linear); % 生成規(guī)則網(wǎng)格用于重建 theta_q linspace(0, pi, 181); phi_q linspace(0, 2*pi, 361); [Theta_q, Phi_q] meshgrid(theta_q, phi_q); Gain_q F(Theta_q, Phi_q); % 在規(guī)則網(wǎng)格上采樣 % 后續(xù)繪圖流程與規(guī)則網(wǎng)格數(shù)據(jù)一致 Gain_lin_q 10.^(Gain_q / 20); [X, Y, Z] sph2cart(Phi_q, pi/2 - Theta_q, Gain_lin_q); surf(X, Y, Z, Gain_q, EdgeColor, none);這里有一個(gè)關(guān)鍵陷阱scatteredInterpolant的插值是在 theta-phi 平面上做的由于 theta 在 0 和 pi 兩個(gè)極點(diǎn)處是奇異點(diǎn)直接在平面插值會(huì)在極點(diǎn)處產(chǎn)生明顯失真。解決方法是把插值空間從(theta, phi)改成笛卡爾坐標(biāo)下的(x, y)即先把散點(diǎn)數(shù)據(jù)轉(zhuǎn)到直角坐標(biāo)再插值。具體做法是把 theta、phi 映射到單位球面上的 x、y 坐標(biāo)忽略 z因?yàn)?z 可以用增益值表達(dá)然后用 x、y 做插值自變量。這個(gè)方法在極區(qū)附近的插值精度優(yōu)于直接在角度平面做因?yàn)?x、y 在極點(diǎn)附近是連續(xù)的。4.3 方向圖歸一化與底噪設(shè)置天線方向圖的原始數(shù)據(jù)中主瓣峰值通常在 0 dB 附近而旁瓣可能低到 -30 dB 甚至更低。如果直接用原始增益映射到半徑圖形中旁瓣會(huì)變得非常小幾乎貼到球心視覺(jué)上主瓣一支獨(dú)秀旁瓣信息徹底丟失。這是三維方向圖繪制中最常見(jiàn)的「信息丟失」問(wèn)題。解決思路是做歸一化和動(dòng)態(tài)范圍截?cái)唷w一化的基準(zhǔn)是最大增益值把主瓣峰值映射到 1或單位半徑動(dòng)態(tài)范圍截?cái)鄤t是把低于某個(gè)閾值的增益全部拉平讓旁瓣區(qū)域在視覺(jué)上呈現(xiàn)為一個(gè)「底座」而非尖刺。這個(gè)閾值通常取 -25 dB 到 -40 dB 之間取決于你要突出什么信息。% 歸一化與底噪截?cái)?gain_max max(gain_db(:)); gain_norm gain_db - gain_max; % 峰值歸一到 0 dB floor_level -30; % 底噪閾值 gain_cut max(gain_norm, floor_level); % 低于底噪的拉平 radius 10.^(gain_cut / 20); % 歸一化后轉(zhuǎn)半徑這個(gè)做法的本質(zhì)是在「保留真實(shí)動(dòng)態(tài)范圍」和「增強(qiáng)弱信號(hào)可見(jiàn)性」之間取平衡。底噪閾值設(shè)得越高旁瓣越可見(jiàn)但形狀越失真設(shè)得越低形狀越真實(shí)但旁瓣越不顯眼。我一般會(huì)先讓同學(xué)用 -30 dB 跑一版再用 -20 dB 跑一版對(duì)比著看旁瓣信息量選一個(gè)信息呈現(xiàn)最平衡的版本。4.4 多個(gè)方向圖的疊加對(duì)比與動(dòng)畫(huà)生成在陣列天線設(shè)計(jì)中經(jīng)常需要對(duì)比不同激勵(lì)幅度、相位配置下的方向圖差異。此時(shí)逐張出圖不如把多張圖疊加在同一個(gè)坐標(biāo)系里通過(guò)透明度或顏色區(qū)分更進(jìn)一步可以用for循環(huán)生成一組幀配合exportgraphics輸出 GIF 動(dòng)畫(huà)動(dòng)態(tài)展示波束掃描過(guò)程。這個(gè)功能在答辯演示時(shí)特別加分因?yàn)樵u(píng)審人能看到波束隨參數(shù)變化的連續(xù)過(guò)程而不是靜態(tài)的幾張圖。% 生成波束掃描動(dòng)畫(huà)的幀循環(huán) for idx 1:length(phase_configs) % 更新相位配置重新計(jì)算方向圖并繪制 surf(X, Y, Z, gain_db_current, EdgeColor, none); view(45, 25); title(sprintf(波束指向角%d°, beam_angle(idx))); drawnow; frame getframe(gcf); [A, map] rgb2ind(frame2im(frame), 256); if idx 1 imwrite(A, map, beam_scan.gif, gif, LoopCount, Inf, DelayTime, 0.1); else imwrite(A, map, beam_scan.gif, gif, WriteMode, append, DelayTime, 0.1); end end動(dòng)畫(huà)生成時(shí)有幾個(gè)性能方面的坑。第一surf在數(shù)據(jù)量較大超過(guò) 500×500 網(wǎng)格時(shí)每幀渲染耗時(shí)較長(zhǎng)動(dòng)畫(huà)會(huì)卡頓解決方法是先用reducepatch降低面片數(shù)量動(dòng)畫(huà)用簡(jiǎn)化模型出靜態(tài)圖再用全精度模型第二getframe捕獲的是當(dāng)前坐標(biāo)區(qū)內(nèi)容如果圖形窗口被遮擋或最小化抓出來(lái)的是黑幀建議在生成動(dòng)畫(huà)期間把窗口置頂并固定大小第三GIF 的DelayTime設(shè) 0.05 到 0.15 秒之間比較合適太短看起來(lái)閃太長(zhǎng)節(jié)奏拖沓。5. 避坑與排查三維方向圖繪制中最容易翻車(chē)的五個(gè)問(wèn)題5.1 圖形出現(xiàn)「直線條」與「棱邊」不像是光滑曲面現(xiàn)象用surf繪制出來(lái)的方向圖有明顯的棱邊看起來(lái)像低多邊形模型而不是光滑的曲面。原因網(wǎng)格數(shù)據(jù)分辨率不夠是首要原因。theta 和 phi 的采樣間隔太大曲面重建時(shí)相鄰網(wǎng)格點(diǎn)之間的漸變被線性插值處理肉眼能分辨出折痕。另一個(gè)原因是FaceAlpha設(shè)置過(guò)低導(dǎo)致透明背景下網(wǎng)格輪廓疊在一起形成干涉紋路。解決優(yōu)先加密采樣網(wǎng)格。theta 和 phi 至少各取 181 和 361 個(gè)點(diǎn)如果原始數(shù)據(jù)稀疏先用scatteredInterpolant插值到上述密度。另外把FaceAlpha調(diào)回 0.9 以上EdgeColor保持none。檢查時(shí)用size(gain)確認(rèn)矩陣維度低于 100×100 的網(wǎng)格通常都會(huì)出現(xiàn)可見(jiàn)棱邊。5.2 方向圖上下顛倒或者鏡像翻轉(zhuǎn)現(xiàn)象繪制結(jié)果與仿真軟件或天線理論計(jì)算的方向圖在圖像上呈鏡像關(guān)系主瓣指向了錯(cuò)誤的方向。原因幾乎全是sph2cart的角度轉(zhuǎn)換寫(xiě)錯(cuò)了。MATLAB 的sph2cart定義中第二個(gè)輸入是仰角從 x-y 平面向上為正而天線方向圖中 theta 通常定義為與 z 軸的夾角俯仰角二者相差一個(gè)pi/2。忘記轉(zhuǎn)換就會(huì)導(dǎo)致上下顛倒。解決確認(rèn)轉(zhuǎn)換公式為sph2cart(Phi, pi/2 - Theta, R)并且校驗(yàn) theta 的零點(diǎn)方向。用一組已知指向的天線數(shù)據(jù)做單點(diǎn)驗(yàn)證如果主瓣方向是thetapi/2, phipi/2轉(zhuǎn)換后的笛卡爾坐標(biāo)應(yīng)為(0, 1, 0)方向附近對(duì)照這個(gè)基準(zhǔn)即可快速定位問(wèn)題。5.3 輸出圖片保存后顏色偏淡或分辨率模糊現(xiàn)象屏幕顯示正常但用saveas或print導(dǎo)出 PNG 后顏色失真、文字模糊、曲面出現(xiàn)鋸齒。原因MATLAB 圖形默認(rèn)使用 OpenGL 渲染器屏幕顯示經(jīng)過(guò)了抗鋸齒處理但導(dǎo)出圖片時(shí)如果采用默認(rèn)的-r150分辨率或者figure的Renderer設(shè)置不對(duì)細(xì)節(jié)就會(huì)丟失。另外colorbar上的刻度文字在低分辨率下容易糊成一片。解決導(dǎo)出前統(tǒng)一設(shè)置圖形參數(shù)分辨率至少 300 DPI渲染器固定為painters對(duì)矢量元素友好或opengl對(duì)復(fù)雜曲面友好。推薦的做法是一律用exportgraphics函數(shù)導(dǎo)出它對(duì)分辨率和格式的控制更直觀。exportgraphics(gcf, direction_pattern.png, Resolution, 300);5.4 動(dòng)態(tài)范圍壓縮導(dǎo)致旁瓣形狀畸變現(xiàn)象底噪閾值設(shè)得太高比如 -15 dB導(dǎo)致旁瓣被大面積拉平方向圖看起來(lái)像個(gè)「圓臺(tái)」主瓣之外全是平的。原因這是動(dòng)態(tài)范圍壓縮過(guò)度的典型表現(xiàn)。閾值設(shè)得越高被拉平的數(shù)據(jù)越多旁瓣的真實(shí)形狀被掩蓋的程度越大。特別是對(duì)低旁瓣天線拉平效果會(huì)直接把旁瓣的電平信息抹掉。解決底噪閾值從 -40 dB 開(kāi)始逐步上調(diào)每調(diào)一檔觀察一次旁瓣形態(tài)變化直到旁瓣輪廓開(kāi)始清晰但還沒(méi)有影響底部圓潤(rùn)度的臨界點(diǎn)。通常 -30 dB 是一個(gè)比較可靠的起點(diǎn)。要時(shí)刻記得這張圖的核心目的是用視覺(jué)表達(dá)方向圖的形狀特性而不是精確的數(shù)值讀數(shù)。5.5 數(shù)據(jù)點(diǎn)稀疏時(shí)插值結(jié)果出現(xiàn)「振鈴」或負(fù)值現(xiàn)象用scatteredInterpolant插值后增益值出現(xiàn)了超過(guò)原始數(shù)據(jù)范圍的異常值比如旁瓣區(qū)域出現(xiàn)正的尖峰或者主瓣附近出現(xiàn)了假的凹陷。原因插值方法選擇了natural或linear而數(shù)據(jù)點(diǎn)在角度空間分布嚴(yán)重不均勻時(shí)插值會(huì)產(chǎn)生局部過(guò)沖。極區(qū)附近的插值更是重災(zāi)區(qū)因?yàn)?theta 接近 0 時(shí)很小的角度差對(duì)應(yīng)了球面上很大的面積差。解決改用linear方法并用笛卡爾坐標(biāo)作為插值空間。前面提過(guò)的做法是先把角度數(shù)據(jù)映射到單位球面的 x、y 坐標(biāo)再做插值這樣極區(qū)附近的數(shù)據(jù)點(diǎn)之間的距離度量更合理振鈴現(xiàn)象會(huì)大幅減少。實(shí)測(cè)中這個(gè)改動(dòng)能把極區(qū)失真從肉眼可見(jiàn)降低到基本無(wú)感。6. 驗(yàn)收與答辯從「能出圖」到「能交差」的關(guān)鍵四步6.1 數(shù)值對(duì)拍用主瓣峰值和旁瓣電平做定量驗(yàn)收繪圖完成后最容易犯的錯(cuò)是只看「圖好看」就認(rèn)為完成實(shí)際上圖上的顏色漸變、曲面形狀很可能因?yàn)樽鴺?biāo)變換或歸一化處理引入了誤差。驗(yàn)收的第一步是把圖上讀到的數(shù)值和仿真軟件的原始數(shù)據(jù)做對(duì)拍用datacursormode點(diǎn)擊主瓣峰值位置記錄增益讀數(shù)再點(diǎn)擊最高旁瓣位置記錄旁瓣電平把兩組數(shù)據(jù)與仿真結(jié)果比較誤差超過(guò) ±1 dB 就要回頭檢查歸一化公式或坐標(biāo)變換是否有誤。6.2 理論一致性關(guān)鍵截面的方向圖對(duì)照三維圖只能看到「面」無(wú)法精確判斷每個(gè) phi 截面上的方向圖形態(tài)。驗(yàn)收的第二步是提取三維圖中特定 phi 值的截面數(shù)據(jù)與二維方向圖曲線疊加對(duì)比。比如提取 phi0 平面的增益隨 theta 變化曲線和仿真軟件直接輸出的 E 面方向圖對(duì)比主瓣寬度和第一零點(diǎn)位置應(yīng)當(dāng)吻合。這一步能揪出坐標(biāo)軸方向反了、角度映射錯(cuò)誤等視覺(jué)上不易發(fā)現(xiàn)的問(wèn)題。% 提取 phi0 截面的方向圖數(shù)據(jù)并與理論值對(duì)比 phi_idx find(abs(phi - 0) eps); pattern_cut gain_db(:, phi_idx(1)); % 三維數(shù)據(jù)中提取截面 figure; polarplot(theta, pattern_cut); % 二維對(duì)比視圖6.3 答辯展示的三個(gè)設(shè)計(jì)習(xí)慣答辯時(shí)評(píng)審人一定會(huì)問(wèn)「你這張圖展示了什么物理含義」。提前準(zhǔn)備好三個(gè)設(shè)計(jì)習(xí)慣會(huì)有很大幫助。第一用gca的CLim手動(dòng)設(shè)定顏色范圍確保主瓣和旁瓣的顏色對(duì)比在投影環(huán)境下仍然清晰第二在圖中用text標(biāo)注主瓣峰值和旁瓣電平的具體數(shù)值讓評(píng)審人一眼看到關(guān)鍵讀數(shù)而不需要在腦海中換算顏色條第三準(zhǔn)備一張帶坐標(biāo)軸的線框版本和一張帶顏色映射的著色版本線框版展示坐標(biāo)系著色版展示數(shù)據(jù)特性兩份圖配合講解信息量最大。6.4 交付時(shí)的文件組織習(xí)慣從驗(yàn)收角度講最終的交付應(yīng)該是一個(gè)能復(fù)現(xiàn)的完整工程而不只是一張 PNG 圖片。我通常的組織習(xí)慣是主腳本plot_main.m負(fù)責(zé)數(shù)據(jù)加載和調(diào)用繪圖函數(shù)data/目錄存放原始仿真數(shù)據(jù)figs/目錄存放導(dǎo)出圖片另外寫(xiě)一個(gè)README.md記錄數(shù)據(jù)來(lái)源、單位、歸一化方式和動(dòng)態(tài)范圍閾值。這樣做的好處是評(píng)審人如果要驗(yàn)證結(jié)果可以直接跑腳本復(fù)現(xiàn)而不是靠口頭描述「我當(dāng)時(shí)是這么調(diào)的」。從那以后我每次出方向圖都強(qiáng)制走一遍「數(shù)值對(duì)拍 → 截面對(duì)比 → 標(biāo)注關(guān)鍵點(diǎn) → 整理工程目錄」這四步花不了半小時(shí)但能擋掉絕大多數(shù)答辯現(xiàn)場(chǎng)的突發(fā)提問(wèn)。希望這套流程能幫你的三維方向圖方案一步到位少走彎路。本文還有配套的精品資源點(diǎn)擊獲取