2020年7月14日 星期二

輸出目錄底下所有S參數的頻率範圍

一個使用者被老闆要求找出特定目錄底下每一個S參數的頻率範圍。該目錄當中存放超過上千個S參數檔案,port數從兩個到上百個的都有。有的是廠商提供的,有的是模擬得到的,有的則是網路分析儀量測結果。使用的單位有的是MHz, 有的是GHz,都不盡相同。如果要用文字編輯器一個一個打開來看,並手動紀錄檔名及頻率範圍,估計一整個禮拜也完成不了老闆交付的工作。於是該使用者找我詢問看有沒有辦法在AEDT當中一次讀取所有的S參數檔案並輸出頻率範圍。很遺憾的是AEDT並沒有這樣的功能。於是筆者花了點時間寫了下面的腳本來完成上述的工作。不到40行的程式碼讓原本預估要一整周的工作時間最後花費不到十分鐘便完成。該使用者的工作獲得了老闆的讚許,也讓他開始嘗試學習編寫腳本來提高工作的效率。

各位有興趣不妨試試看下面的程式碼。將下面程式碼複製到檔名為getSnpFreqRange.py的文字檔當中,修改程式當中snp_dir的目錄,在AEDT當中執行。待工作結束即可在路徑當中找到output.txt(如圖一),當中記錄了目錄底下每個S參數及對應的頻率範圍。

import os

snp_dir = 'd:/demo2'

def getSnpRange(snp_path):
    ext = snp_path.split('.')[-1]
    N=int(ext[1:-1])
    
    with open(snp_path) as f:
        text = f.readlines()
    
    unit_mapping = {'hz':1e0, 'khz':1e3, 'mhz':1e6, 'ghz':1e9}
    values = []
    for i in text:
        if i[0] == '!':
            continue
        elif i[0] =='#':
            unit = i.split()[1]
            scale = unit_mapping[unit.lower()]
        else:
            x = i.split()
            values += map(float, x)
    freq = [i*scale for i in values[::N*N*2+1]]
    freq_range = (freq[0], freq[-1])
    return freq_range

files = os.listdir(snp_dir)
failed = []
result = []
for i in files:
    try:
        frange = getSnpRange(snp_dir+'/'+i)
        result.append('{:80}:{}\n'.format(i, frange))
    except:
        failed.append(i)

with open(snp_dir + '/output.txt', 'w') as f:
    f.writelines(result)
    f.writelines('_'*120 + "\nFailed:\n{}".format('\n'.join(failed)))


(圖一) output.txt記錄S參數檔及其頻率範圍

沒有留言:

張貼留言