Python中如何给信号添加延时?信号上界生成问题求助
问题解决:修正带延时的信号上界生成逻辑
您好,这是我在Stack Overflow的第一个问题,请多包涵。我有一组类字典结构的时间戳与对应值的列表,需要基于这些值生成带延时的信号上界和下界。目前下界已经实现,但上界的生成一直有问题。
期望信号示例(简化版)
timeList= [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] myGeneratedHigherBound=[0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0] signalDataList= [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0] myGeneratedLowerBound= [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
已实现的下界代码
####### 创建下界 ###### def CalcExpResultL(commandSignal): # 生成的结果列表 dataListL = [] # 时间戳列表 timeListL=commandSignal[0] for i in range(len(commandSignal[0])): if (commandSignal[1][i] == 0 or (commandSignal[1][i] == 1 and commandSignal[1][i-25] == 0)): dataListL.append(500) elif (commandSignal[1][i] == 1 and not commandSignal[1][i+25] == 0): dataListL.append(2025) else: dataListL.append(500) return [timeListL,dataListL]
尝试实现的上界代码(存在问题)
####### 创建上界 ###### def CalcExpResultH(commandSignal): dataListH = [] timeListH=commandSignal[0] length = len(commandSignal[0])-25 for i in range(length): if (commandSignal[1][i] == 0 and not commandSignal[1][i+25] == 0): dataListH.append(540) elif(commandSignal[1][i] == 1 or (commandSignal[1][i] == 0 and commandSignal[1][i-25] ==1)): dataListH.append(2045) else: dataListH.append(540) # 解决索引越界问题的临时方案 remainder = len(timeListH) - len(dataListH) for i in range(remainder): dataListH.append(540) return [timeListH,dataListH]
我试过各种条件组合,但都没成功——要么上界的前一段延时是对的,后一段出不来;要么反过来。目前实现的效果如图:
问题分析与修正方案
你的上界代码主要存在两个问题:
- 索引越界未完全处理:使用
i-25时,当i<25会访问负数索引,直接报错;原代码仅限制了i+25的范围,但忽略了i-25的边界情况。 - 条件逻辑覆盖不全:上界需要同时覆盖「信号上升沿提前25单位触发」和「信号下降沿延后25单位结束」的场景,原条件组合没有完整覆盖这两个逻辑。
修正后的上界生成代码:
####### 创建上界(修正版)###### def CalcExpResultH(commandSignal): dataListH = [] timeListH, signal = commandSignal signal_len = len(signal) for i in range(signal_len): # 检查25单位后是否会变为1(处理索引超出范围的情况) future_trigger = False if i + 25 < signal_len: future_trigger = signal[i+25] == 1 # 检查25单位前是否是1(处理索引为负数的情况) past_trigger = False if i - 25 >= 0: past_trigger = signal[i-25] == 1 # 满足任一条件则设为上界高值2045 if signal[i] == 1 or future_trigger or past_trigger: dataListH.append(2045) else: dataListH.append(540) return [timeListH, dataListH]
逻辑说明
- 上升沿提前:当当前位置的25个单位后信号会变为1时,上界提前切换为高值;
- 下降沿延后:当当前位置的25个单位前信号是1时,上界保持高值,延后切换为低值;
- 边界处理:对
i+25超出列表长度、i-25小于0的情况做了判断,避免索引越界错误; - 完整覆盖:只要当前信号是1、或满足提前触发、或满足延后结束的条件,上界就保持高值,否则为低值。
内容的提问来源于stack exchange,提问作者ErrorEye
相关产品推荐
相关产品推荐

