分析逻辑分析仪CSV数据中最大最小脉宽
功能说明 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.csvb.创建 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_pulse0): 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, errorsignore).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_pulseMIN_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, reverseTrue) # 最大5个 top5 sorted_desc[:5] print(\n 最大5个正脉宽(us) ) for idx, val in enumerate(top5, start1): print(fTOP{idx}: {val*1e6:.3f} us) # 最小5个 bottom5 sorted_desc[-5:] print(\n 最小5个正脉宽(us) ) for idx, val in enumerate(bottom5, start1): print(fMIN{idx}: {val*1e6:.3f} us) # 导出全部脉宽 out_path os.path.join(script_dir, pulse_out.txt) with open(out_path, w, encodingutf-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
上一篇/下一篇内容由系统自动关联
返回资讯列表 →