功能说明:
""" ================================================================================ DSView逻辑分析仪CSV脉宽分析工具 功能简介: 1. 解析 DSView(libsigrok4DSL)导出的逻辑分析仪CSV波形文件,统计高电平正脉宽 2. 自动跳过CSV中以分号';'开头的注释信息行、表头行、空行、异常格式行 3. 二进制模式读取文件,自动清除文件内NULL空字节,兼容UTF‑16LE编码导出文件, 避免 embedded null character 报错 4. 过滤毛刺脉冲:小于min_pulse设定阈值的脉冲会被丢弃 5. 计算输出:脉冲总数、最大正脉宽、平均正脉宽 6. 输出排序后【最大5个】、【最小5个】正脉宽(单位us) 7. 将全部识别到的正脉宽导出至 pulse_out.txt,可直接导入Excel查看 8. 自动读取脚本同目录下 wave.csv;文件不存在时Windows弹出提示框,控制台环境打印提示 输入文件要求: - 文件名固定为 wave.csv,与本py脚本放在同一个文件夹 - DSView导出CSV,通道格式:Time(s), 通道名,例如 Time(s), SCL - 支持大采样点数流式逐行解析,不会一次性把全部数据加载进内存 配置参数: MIN_PULSE:最小有效脉冲宽度,单位秒,小于该值判定为毛刺过滤,默认1e‑9 s 输出: 1. 控制台打印:脉冲总数、最大/平均脉宽、TOP5最大脉宽、MIN5最小脉宽 2. 输出文件:pulse_out.txt,每行为一个脉宽,单位us 使用说明: 1. 将DSView导出的波形另存为 wave.csv 2. 把 wave.csv 和本 pulse_analyze.py 放在同一个文件夹 3. 双击 pulse_analyze.py 直接运行;或者cmd命令行执行 python pulse_analyze.py 4. 运行完成查看控制台结果,pulse_out.txt在同目录生成 5. 程序执行完毕按回车键关闭窗口 注意事项: 1. 如果原始CSV文件过大,DSView建议先框选需要分析的波形片段再导出,减少处理时间 2. 只分析高电平正脉冲(上升沿→下降沿),负脉冲不做统计 3. 采样率不足会造成脉宽计算存在误差,保证逻辑分析仪采样率远高于信号频率 ================================================================================ """1.导出逻辑分析仪数据为CSV文件
2.创建一个文件夹"wave"用于存放CSV和Python代码
a.CSV文件重命名为 wave.csv
b.创建 pulse_analyze.py 文件,将Python代码复制到文件。
3.Python代码
""" ================================================================================ DSView逻辑分析仪CSV脉宽分析工具 功能简介: 1. 解析 DSView(libsigrok4DSL)导出的逻辑分析仪CSV波形文件,统计高电平正脉宽 2. 自动跳过CSV中以分号';'开头的注释信息行、表头行、空行、异常格式行 3. 二进制模式读取文件,自动清除文件内NULL空字节,兼容UTF‑16LE编码导出文件, 避免 embedded null character 报错 4. 过滤毛刺脉冲:小于min_pulse设定阈值的脉冲会被丢弃 5. 计算输出:脉冲总数、最大正脉宽、平均正脉宽 6. 输出排序后【最大5个】、【最小5个】正脉宽(单位us) 7. 将全部识别到的正脉宽导出至 pulse_out.txt,可直接导入Excel查看 8. 自动读取脚本同目录下 wave.csv;文件不存在时Windows弹出提示框,控制台环境打印提示 输入文件要求: - 文件名固定为 wave.csv,与本py脚本放在同一个文件夹 - DSView导出CSV,通道格式:Time(s), 通道名,例如 Time(s), SCL - 支持大采样点数流式逐行解析,不会一次性把全部数据加载进内存 配置参数: MIN_PULSE:最小有效脉冲宽度,单位秒,小于该值判定为毛刺过滤,默认1e‑9 s 输出: 1. 控制台打印:脉冲总数、最大/平均脉宽、TOP5最大脉宽、MIN5最小脉宽 2. 输出文件:pulse_out.txt,每行为一个脉宽,单位us 使用说明: 1. 将DSView导出的波形另存为 wave.csv 2. 把 wave.csv 和本 pulse_analyze.py 放在同一个文件夹 3. 双击 pulse_analyze.py 直接运行;或者cmd命令行执行 python pulse_analyze.py 4. 运行完成查看控制台结果,pulse_out.txt在同目录生成 5. 程序执行完毕按回车键关闭窗口 注意事项: 1. 如果原始CSV文件过大,DSView建议先框选需要分析的波形片段再导出,减少处理时间 2. 只分析高电平正脉冲(上升沿→下降沿),负脉冲不做统计 3. 采样率不足会造成脉宽计算存在误差,保证逻辑分析仪采样率远高于信号频率 ================================================================================ """ import csv import os import ctypes import sys def show_msg_box(title, text): """弹窗提示,无GUI环境则控制台打印""" if sys.platform == "win32": try: ctypes.windll.user32.MessageBoxW(0, text, title, 0) except Exception: print(f"\n【{title}】{text}") else: print(f"\n【{title}】{text}") def calc_max_pos_pulse_stream(csv_path, min_pulse=0): pulse_widths = [] rise_time = None with open(csv_path, 'rb') as f: header_skipped = False while True: raw_line = f.readline() if not raw_line: break raw_line = raw_line.replace(b'\x00', b'') line = raw_line.decode('utf-8', errors='ignore').strip() if not line: continue if line.startswith(';'): continue if not header_skipped: header_skipped = True continue row = next(csv.reader([line])) if len(row) < 2: continue try: t = float(row[0]) lv = int(float(row[1])) except ValueError: continue if lv == 1 and rise_time is None: rise_time = t elif lv == 0 and rise_time is not None: width = t - rise_time if width >= min_pulse: pulse_widths.append(width) rise_time = None if not pulse_widths: return 0, 0, 0, [] max_w = max(pulse_widths) avg_w = sum(pulse_widths) / len(pulse_widths) cnt = len(pulse_widths) return max_w, avg_w, cnt, pulse_widths if __name__ == "__main__": # 脚本所在目录自动寻找 wave.csv script_dir = os.path.dirname(os.path.abspath(__file__)) CSV_FILE = os.path.join(script_dir, "wave.csv") MIN_PULSE = 1e-9 if not os.path.exists(CSV_FILE): show_msg_box("文件缺失", "未找到 wave.csv\n请把 wave.csv 和本脚本放在同一目录后重试!") input("\n按回车键退出...") sys.exit(1) try: max_width, avg_width, pulse_num, all_pulses = calc_max_pos_pulse_stream(CSV_FILE, min_pulse=MIN_PULSE) if pulse_num == 0: print("未识别到有效脉冲!") else: print(f"脉冲总数: {pulse_num}") print(f"最大正脉宽: {max_width:.6e} s = {max_width * 1e6:.3f} us") print(f"平均正脉宽: {avg_width:.6e} s = {avg_width * 1e6:.3f} us") # 全部从大到小排序 sorted_desc = sorted(all_pulses, reverse=True) # 最大5个 top5 = sorted_desc[:5] print("\n===== 最大5个正脉宽(us) =====") for idx, val in enumerate(top5, start=1): print(f"TOP{idx}: {val*1e6:.3f} us") # 最小5个 bottom5 = sorted_desc[-5:] print("\n===== 最小5个正脉宽(us) =====") for idx, val in enumerate(bottom5, start=1): print(f"MIN{idx}: {val*1e6:.3f} us") # 导出全部脉宽 out_path = os.path.join(script_dir, "pulse_out.txt") with open(out_path, "w", encoding="utf-8") as fw: for w in all_pulses: fw.write(f"{w * 1e6:.3f}\n") print(f"\n✅ 所有脉宽数值已保存到 {out_path}") except Exception as e: import traceback traceback.print_exc() input("\n按回车键退出...")4.运行代码
如已经安装Python,右键点击 pulse_analyze.py 文件,打开方式选择 Python。
运行结果
5.逻辑分析仪数据格式
“ ; ”开始的行没有影响不用关注
; CSV, generated by libsigrok4DSL 0.2.0 on Wed Sep 30 16:09:43 2026 ; Channels (1/16) ; Sample rate: 100 MHz ; Sample count: 500.768 M Samples Time(s), 0 0,0 0.05,1 0.05002011,0 0.05329454,1 0.05331472,0 0.0565119,1 0.05651277,0 0.06002889,1 0.06002977,0 0.06332523,1 0.0633261,0 0.06661908,1 0.06661995,0 0.06861961,1 0.06864432,0