# Kingst VIS 3 通道边沿流分段: 按占空比签名分段, 输出各通道占空比 # 用法: python la_wave_analyzer3.py (列: Time[s], ch8, ch9, ch10) import csv, time, statistics import sys PATH = sys.argv[1] if len(sys.argv) else r"E:\Hulk-Coding\LT8619C_DLPC3421_HDMI\tools\wave\A1_RGB-SWAP.csv" t0 = time.time() rows = [] with open(PATH, encoding='utf-8-sig', errors='replace') as f: r = csv.reader(f) hdr = next(r) print('header:', hdr) for row in r: if len(row) < 4: continue rows.append((float(row[0]) * 1e9, int(row[1]), int(row[2]), int(row[3]))) n = len(rows) t_last = rows[-1][0] + 1000.0 print('rows=%d span=%.2fs' % (n, (t_last - rows[0][0]) / 1e9)) W = 50_000_000.0 wins = [] acc = {'t0': rows[0][0], 'hi': [0.0, 0.0, 0.0]} for i in range(n - 1): t, a, b, c = rows[i] dt = min(rows[i + 1][0], t_last) - t if dt <= 0: continue acc['hi'][0] += dt if a else 0.0 acc['hi'][1] += dt if b else 0.0 acc['hi'][2] += dt if c else 0.0 if rows[i + 1][0] - acc['t0'] >= W: span = rows[i + 1][0] - acc['t0'] wins.append((acc['t0'], tuple(x / span for x in acc['hi']))) acc = {'t0': rows[i + 1][0], 'hi': [0.0, 0.0, 0.0]} def sig(d): hi = [x > 0.5 for x in d] return ('D7' if hi[0] else '--') + '/' + ('D15' if hi[1] else '--') + '/' + ('D23' if hi[2] else '--') segs = [] for t, d in wins: s = sig(d) if segs and segs[-1][0] == s: segs[-1][1].append((t, d)) else: segs.append((s, [(t, d)])) print('\n%-16s %10s %9s %9s %9s' % ('活动组签名', '时长(s)', 'D7占空', 'D15占空', 'D23占空')) for s, ws in segs: dur = ws[-1][0] - ws[0][0] m = [statistics.mean(x[1][k] for x in ws) for k in range(3)] print('%-16s %10.2f %8.1f%% %8.1f%% %8.1f%%' % (s, dur, m[0] * 100, m[1] * 100, m[2] * 100)) # 每段行结构抽查(第一段一次即可) s0, ws0 = segs[0] ch = 0 starts = [] seg_t0 = ws0[0][0] - W / 2 for j in range(n - 1): t = rows[j][0] if t < seg_t0: continue if rows[j][1] and rows[j + 1][0] - t >= 15000.0: starts.append(t) if len(starts) >= 5 or t > seg_t0 + 0.3e9: break if len(starts) >= 2: p = statistics.median([b - a for a, b in zip(starts, starts[1:])]) print('\n行周期抽查: %.0fns (%.1f clk @40MHz)' % (p, p / 25.0)) print('耗时 %.1fs' % (time.time() - t0))