作嵌入式開發,常常須要經過邏輯分析儀對數字信號進行數據分析。若是信號源附近有強幹擾源,而且邏輯分析儀濾波效果很差的話,獲取到的數字信號,常常帶有一些「毛刺」,這些「毛刺」信號根據干擾的強弱不一樣,持續時間可能會由幾納秒到幾百納秒不等。嘗試過在數字口加電容進行硬件濾波,電容加得過小,濾波不乾淨;電容加得太大,信號失真嚴重。
經過觀察邏輯分析儀獲取到的波形能夠看到,干擾信號通常是在信號跳變以後的一小段時間內出現(這是我所遇到的信號的狀況),以下圖1所示信號由低變成高,2us內,都是干擾信號。實際上前面2 us內的電平信號應該是高電平。軟件濾波的目的,就是要將干擾信號還原成它原來的電平。
先將邏輯分析儀獲取到的數據,轉成csv格式的文件,命名爲src_data.csv。src_data.csv 文件記錄的是每一個信號跳變瞬間的時間和對應的電平狀態(0或1),以下圖2爲src_data.csv的格式。
git
若是沒有邏輯分析儀,也能夠經過將其餘途徑獲取到的數據,以相似的格式保存。
實現算法:
1. 將信號產生的時間,轉換成統一的計時單位。
2. 截取每個信號週期內高電平和低電平所佔的時間。並按照信號產生的順序,依次存放在同一個列表(信號描述表)中。
3. 遍歷一遍信號描述列表,把小於xxns的低電平都認爲是干擾信號。把這個低電平持續的時間,加到上一個高電平持續的時間裏,並把這個低電平從列表中去掉。
4. 遍歷一遍信號描述表,把可能連續出現的連續相同電平合併。此時,信號描述表中的元素,都是按照高低高低這樣的排列。算法
源碼地址以下:https://git.oschina.net/liujiangyi123/digital_signal_filter/blob/master/digital_signal_filtering.py.net