如何滤除TTL信号二进制数组中的短波动噪声?
平滑TTL信号中的短尖峰噪声
我们需要处理0/1组成的TTL信号数组,过滤掉持续时间少于4个采样点的短波动(即噪声尖峰),只保留长度≥4的有效脉冲。
示例
输入信号:
[0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1]
处理后输出:
[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1]
实现思路与代码
核心思路是先识别信号中的连续值区间,再对短区间(长度<4)根据前后有效脉冲进行替换,最后重建平滑后的信号:
def smooth_ttl_signal(signal, min_length=4): if not signal: return [] # 提取所有连续值区间(起始索引、结束索引、值) intervals = [] current_val = signal[0] start_idx = 0 for i in range(1, len(signal)): if signal[i] != current_val: intervals.append((start_idx, i-1, current_val)) current_val = signal[i] start_idx = i intervals.append((start_idx, len(signal)-1, current_val)) # 处理短区间,替换为前后有效区间的取值 processed = [] for idx, (start, end, val) in enumerate(intervals): length = end - start + 1 if length >= min_length: processed.append((start, end, val)) continue # 查找前一个有效区间的值 prev_valid = None for j in range(idx-1, -1, -1): if intervals[j][2] != val and (intervals[j][1] - intervals[j][0] + 1) >= min_length: prev_valid = intervals[j][2] break # 查找后一个有效区间的值 next_valid = None for j in range(idx+1, len(intervals)): if intervals[j][2] != val and (intervals[j][1] - intervals[j][0] + 1) >= min_length: next_valid = intervals[j][2] break # 确定替换值 if prev_valid is not None and next_valid is not None: replace_val = prev_valid if prev_valid == next_valid else next_valid else: replace_val = prev_valid if prev_valid is not None else next_valid if next_valid is not None else val processed.append((start, end, replace_val)) # 生成最终信号 result = [0]*len(signal) for start, end, val in processed: for i in range(start, end+1): result[i] = val return result # 测试示例 input_signal = [0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1] output_signal = smooth_ttl_signal(input_signal) print("输入:", input_signal) print("输出:", output_signal)
说明
- 代码会自动识别所有连续的0/1区间,对长度不足4的短区间,优先替换为前后一致的有效脉冲值;若前后有效脉冲不同,则默认取后一个区间的值。
- 可以根据实际需求调整短区间的替换规则,比如当前后有效脉冲不同时的处理逻辑。
内容的提问来源于stack exchange,提问作者Celongar
相关产品推荐
相关产品推荐

