You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何滤除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:05:23