本發(fā)明屬于電源信號處理的技術(shù)領(lǐng)域,特別涉及一種小信號的采集和濾波處理方法。
背景技術(shù):
生活離不開信號的處理,在數(shù)字計算機飛速發(fā)展的時代,幾乎所有的事物都可以作為信號,信號只有經(jīng)過處理才能變成有用的信息被采用,于是信號的處理尤為重要。信號處理的主要目的就是削弱信號中的多余內(nèi)容,濾除混雜的噪聲和干擾,或者將信號變換成容易處理、傳輸、分析與識別的形式,以便后續(xù)的其他處理。對于信號處理,在我們面前出現(xiàn)了不受物理制約的純數(shù)學的加工,即算法,并確立了信號處理的領(lǐng)域。
對于小信號的處理,由于信號越小時,對其測量的精度要求就越高,但由于小信號很容易受到噪聲干擾,故而經(jīng)常會出現(xiàn)采集到的小信號數(shù)據(jù)受到噪聲干擾產(chǎn)生很多的跳變信號的情況,例如MCU在采集小電流信號時,由于內(nèi)部ADC模塊本身也存在OFFSET,而且電路上的其他干擾也會導致產(chǎn)生較大噪聲,影響小電流信號的AD檢測,導致進一步影響產(chǎn)品的其他功能,所以對于小信號的AD采集和處理算法尤為重要。
例如,專利申請201410589811.X公開了一種電源剩余電量的檢測方法和裝置,實現(xiàn)移動電源實時電量的精確測量。所述方法包括:定義執(zhí)行目標次數(shù)的信號采樣流程為一組循環(huán),在一組循環(huán)中,執(zhí)行當前信號采樣流程;其中,所述信號采樣流程包括:按照預設(shè)采樣周期對電源的充電電流進行多次采樣得到多個采樣值;取所述多個采樣值的均值;對所述均值進行平衡濾波;每執(zhí)行完一組循環(huán),輸出一次實時電源電量。
然而上述的方法僅僅能實現(xiàn)電量的計算,并不能解決不同PCBA板上噪聲帶來小信號AD采集數(shù)據(jù)噪聲大,不準確的問題。
技術(shù)實現(xiàn)要素:
基于此,因此本發(fā)明的首要目地是提供一種小信號去噪的ADC濾波方法,該方法可以去除小信號采集過程中的一些跳動噪聲,使采集到的小信號ADC更加精確,避免因為AD值跳動導致程序處理的遲滯或錯誤。
本發(fā)明的另一個目地在于提供一種小信號去噪的ADC濾波方法,該方法不僅濾除AD數(shù)據(jù)中的噪聲,還能根據(jù)實際情況,通過跳變閾值的調(diào)整,來控制跳變范圍,得到較為穩(wěn)定的小信號AD數(shù)據(jù)。
經(jīng)研究發(fā)現(xiàn),小信號AD采集不準主要原因為:采集小信號時,ADC采集模塊容易受電路上的微小噪聲影響,當受到噪聲影響時,會導致采集到的AD值不準確,出現(xiàn)跳動,比如突然出現(xiàn)一個很大的采集值,而實際上這種跳動的信號是不存在的,所以需要將這些跳動值通過算法去掉。
為實現(xiàn)上述目的,本發(fā)明的技術(shù)方案為:
一種小信號去噪的ADC濾波方法,其特征在于該方法采用了兩個窗口對AD數(shù)據(jù)進行加強濾波處理,利用兩個窗口對AD數(shù)據(jù)的對比判斷出跳變點,并將跳變點前一點的數(shù)值賦值給跳變點,從而去信號采集過程中的除跳動噪聲。
由此,該方法的具體實現(xiàn)步驟如下:
步驟1、完成AD檢測模塊的配置,這里所描述的完成配置,包括配置好AD檢測通道,配置好ADC模塊的時鐘源和ADC轉(zhuǎn)換時間;
步驟2、小信號采集;第一次采集數(shù)據(jù)時,連續(xù)采集N1筆小信號數(shù)據(jù),并把這些數(shù)據(jù)存儲在寄存器中,獲得臨時數(shù)據(jù);并定義這組臨時數(shù)據(jù)即為窗口1的數(shù)據(jù),其中N1即為窗口1的窗口大??;
上述步驟中,每采集的一筆數(shù)據(jù)都是通過連續(xù)采8次AD后求8次平均得到一個小信號數(shù)據(jù),這樣連續(xù)采集N1個小信號數(shù)據(jù),然后對這幾個數(shù)據(jù)進行進一步處理,具體處理步驟在后文闡述,然后再對N1個小信號數(shù)據(jù)的前M1個數(shù)據(jù)求平均得到均值R1(M1﹤N1)。
步驟3、通過窗口1獲得的數(shù)據(jù)進一步采集AD數(shù)據(jù),獲得第二組數(shù)據(jù),定義這組臨時數(shù)據(jù)即為窗口1的數(shù)據(jù),N2即為窗口2的窗口大??;
具體地說,由窗口1得到一個均值R1后,繼續(xù)采集AD數(shù)據(jù),把新采到的AD數(shù)據(jù)繼續(xù)存儲在窗口1中,并把原來第一個采到的AD數(shù)據(jù)替代掉,相當于把窗口向后滑動,然后再對此時的窗口1求均值,得到均值R2;然后再采集新的AD數(shù)據(jù),以此類推,得到N2個窗口1的均值。
步驟4、把步驟2中得到的窗口1的均值R1存入窗口2的寄存器,窗口2有N2個寄存器存儲數(shù)據(jù);最終由窗口2的處理得出一個最終輸出值。
在算法驗證過程中,采用N2(N2﹤N1)進行驗證,即窗口2每次進行處理時,存儲N2個窗口1的均值數(shù)據(jù)。得到這N2個數(shù)據(jù)后,窗口2同樣對這些數(shù)據(jù)進行進一步處理,這種處理與窗口1數(shù)據(jù)的處理類似,但是不盡相同,在后文中會對處理方法進行具體闡述。
通過這樣兩個窗口先后的處理和均值濾波,輸出的AD數(shù)據(jù)可以把跳動的數(shù)據(jù)去除,得到較為穩(wěn)定的數(shù)據(jù)。上述步驟中,都會對窗口1和窗口2中的數(shù)據(jù)先進行處理,這種處理主要為去除跳變值處理。
對于窗口1中數(shù)據(jù)的處理方法,具體為:
101、窗口1存儲的臨時數(shù)據(jù)為N1個,并對應于N1個數(shù)據(jù)寄存器,定義這些數(shù)據(jù)寄存器分別為Sdata[0-N1-1],當每8次平均采集到一個小信號數(shù)據(jù)時,會把這個小信號數(shù)據(jù)存進最后一個寄存器Sdata[N1-1],在存入Sdata[N1-1]之前,必須先把原來寄存器里的值都往前面的寄存器存儲,即用后一個寄存器的值替代前一個寄存器的值,這樣會把第一個寄存器的值淘汰出去,并把最新的AD小信號數(shù)據(jù)存儲進來,相當于把窗口向后滑動,把原來的數(shù)據(jù)移出窗口,把最新的數(shù)據(jù)包含進來,由此窗口1得到新的一組臨時數(shù)據(jù)。
102、對于新采集到的窗口1中的數(shù)據(jù)組,要進行去除跳變值處理,首先是去除單個跳變,方法為將相鄰三個寄存器的值兩兩作對比,設(shè)置跳變閾值TH,若發(fā)現(xiàn)中間寄存器的值有跳變超過閾值的,則把中間寄存器的值判定為跳變值,并把前一個寄存器的值賦給中間寄存器,把原來中間寄存器的值淘汰掉;若跳變不超過閾值,則判定為非跳變值,對這三個寄存器的值不做處理,并進入下一個比較。例如在N1=5的情況下,首先要比較Sdata[0],Sdata[1],Sdata[2]這三個寄存器的值,若Sdata[1]相對Sdata[0]和Sdata[2]的跳變都超過閾值,則判定為跳變值,把Sdata[0]的值賦給Sdata[1],然后進入下一個比較,即比較Sdata[1],Sdata[2],Sdata[3];若Sdata[1]不是跳變值,則直接進入下一個比較。
103、判定單挑變并處理數(shù)據(jù)后,再進行雙跳變值的判定和處理。判定方法為將相鄰的四個寄存器的值兩兩作比較,設(shè)置跳變閾值TH,若發(fā)現(xiàn)中間兩個寄存器的值相近,相差在閾值范圍內(nèi),但相比兩邊寄存器的值有跳變,且跳變超過閾值的,則判定中間兩個寄存器的值為雙跳變值,并把雙跳變值的前一個寄存器的值賦給這兩個雙跳變的寄存器,把原來雙跳變的值淘汰掉;若跳變不超過閾值的,則判定為非跳變值,對四個寄存器的值不做處理,并進入下一個比較。例如在N1=5的情況下,首先要比較Sdata[0],Sdata[1],Sdata[2],Sdata[3]這四個寄存器的值,若Sdata[1]與Sdata[2]的值相近,即跳變不超過閾值,而Sdata[1]與Sdata[0]的值比較,跳變超過閾值,同時Sdata[2]與Sdata[3]的值比較,跳變也超過閾值,則把Sdata[1]和Sdata[2]判定為雙跳變值,并把寄存器Sdata[0]的值賦給Sdata[1]和Sdata[2],然后進入下一個比較,即比較Sdata[1],Sdata[2],Sdata[3],Sdata[4];若Sdata[1]和Sdata[2]不是雙跳變值,則直接進入下一個比較。
104、對窗口1的AD數(shù)據(jù)進行去單跳變和雙跳變處理后,取前四個寄存器的值進行求平均得到均值R1,并把R1存入窗口2的寄存器中,進行窗口2的處理。
以上為在窗口1中所做的數(shù)據(jù)處理方法,經(jīng)過窗口1處理的數(shù)據(jù)會被存入窗口2,在窗口2中再進行處理,窗口2的數(shù)據(jù)具體處理方法為:
201、窗口2存儲的臨時數(shù)據(jù)為N2(通常N2﹤N1)個,并對應于N2個數(shù)據(jù)寄存器,定義這些數(shù)據(jù)寄存器分別為Bdata[0-N2-1]。每當窗口1處理完得到一個新的數(shù)據(jù)R1輸出到窗口2時,會把這個數(shù)據(jù)存進最后一個寄存器Bdata[N2-1],在存入Bdata[N2-1]之前,必須把原來寄存器里的值都往前面的寄存器存儲,即用后一個寄存器的值替代前一個寄存器的值,這樣會把第一個寄存器的值淘汰出去,把最新的數(shù)據(jù)R1存儲進來,相當于把窗口向后滑動,由此窗口2得到一組新的臨時數(shù)據(jù)。
202、與窗口1的處理類似的,窗口2首先也要進行單跳變值的判斷,判定方法與窗口1一致,若遇到跳變點,同樣把前一個寄存器的值賦給跳變點寄存器,而把跳變值淘汰,并輸出寄存器Bdata[0]的值作為最終的AD數(shù)據(jù)。若不是跳變點,則進入雙跳變值的判斷。
203、判斷完單跳變后,接著對窗口2進行雙跳變值判斷,判斷方法同樣和窗口1的一致,若Bdata[1]和Bdata[2]為雙跳變值,則把Bdata[0]的值賦給這兩個寄存器,并輸出Bdata[0]的值作為最終的AD數(shù)據(jù)。若不是雙跳變點,則說明Bdata[0]之后的數(shù)據(jù)有整體向偏大跳動或整體向偏小跳動的趨勢,則把窗口2的4個數(shù)據(jù)直接求平均,并把這個均值賦給窗口2的每一個寄存器,然后輸出Bdata[0]的值作為最終AD數(shù)據(jù)。
上述步驟中,窗口1和窗口2的窗口大小N1、N2和判定跳變的跳變閾值TH這幾個值都是客戶可以自行根據(jù)情況設(shè)定的。已經(jīng)驗證過在N1、N2越大的情況下,去噪效果會相對更好,但是會占用更多的寄存器。
本發(fā)明不僅實現(xiàn)對小信號AD數(shù)據(jù)中的不正常跳變數(shù)值的去除,濾除AD數(shù)據(jù)中的噪聲,還能根據(jù)實際情況,通過跳變閾值的調(diào)整,來控制跳變范圍,得到較為穩(wěn)定的小信號AD數(shù)據(jù)。
附圖說明
圖1是本發(fā)明所實施的處理流程圖。
圖2是濾波之前的AD數(shù)據(jù)波形圖。
圖3為本發(fā)明濾波效后的波形圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
圖1為本發(fā)明所實現(xiàn)的流程圖,圖中所示,本發(fā)明實現(xiàn)的具體步驟如下:
1、配置好ADC采集模塊的寄存器配置,包括AD檢測通道,時鐘源和ADC轉(zhuǎn)換時間等;
2、開啟AD轉(zhuǎn)換,連續(xù)采集8個AD值并求平均,得到一個臨時AD值,這一步驟是做簡單濾波,得到的臨時AD值將存入窗口1中;
3、窗口1存儲的臨時數(shù)據(jù)為5個,每個數(shù)據(jù)對應一個數(shù)據(jù)寄存器,定義這5個數(shù)據(jù)寄存器分別為Sdata[0-4]。將窗口1窗口向后滑動,即將每個寄存器的值賦給前一個寄存器,把Sdata[1]的值賦給Sdata[0],把Sdata[2]賦給Sdata[1],以此類推,把窗口1的數(shù)據(jù)都向前遞推一個寄存器,這樣淘汰了最前面的寄存器的數(shù)據(jù),也是使用了最久的數(shù)據(jù),而空出了最后一個寄存器Sdata[4]來存儲新采集到的AD值;
4、對窗口1做單跳變值判斷,求Sdata[1]-Sdata[0]的絕對值是否大于閾值TH,此處把閾值設(shè)為0.5,即只要AD值有一個值的跳變都會被抑制。同時求Sdata[2]-Sdata[1]的絕對值是否大于TH,如果這兩個條件同時滿足了,則認為Sdata[1]為跳變值,把Sdata[0]的值賦給Sdata[1],從而把Sdata[1]的跳變值覆蓋掉,如果有其中一個條件不滿足,則進入下一個判斷,判斷Sdata[3]-Sdata[2]的絕對值,以此類推,判斷完三組數(shù)據(jù);
5、當進行單跳變值判斷時,可以同時進行雙跳變值的判斷,如若Sdata[1]-Sdata[0]的絕對值大于閾值TH,則繼續(xù)判斷Sdata[2]-Sdata[1]的絕對值是否大于TH,若是則說明Sdata[1]為單跳變值,若不是則有可能為雙跳變值,接著判斷Sdata[3]-Sdata[2]的絕對值是否大于TH,如果是則說明Sdata[2]和Sdata[1]為雙跳變值,把寄存器Sdata[0]的值賦給Sdata[2]和Sdata[1],覆蓋掉雙跳變值,若不是,則仍進入下一個判斷;
6、對窗口1做去跳變值處理后,最后對窗口1前四個寄存器的值做求平均處理,得到一個臨時數(shù)據(jù)R1;
7、窗口2存儲的臨時數(shù)據(jù)為4個,每個數(shù)據(jù)對應一個數(shù)據(jù)寄存器,定義這四個數(shù)據(jù)寄存器分別為Bdata[0-3]。對窗口2作步驟三的操作,空出最后一個寄存器Bdata[3],并把步驟6中得到的均值R1存入Bdata[3]中;
8、對窗口2同樣進行單跳變值的判斷,但在窗口2中只需要判斷一次,即判斷前三個寄存器,判斷Bdata[1]-Bdata[0]的絕對值是否大于TH,若不是則說明沒有單跳變也沒有雙跳變,直接輸出Bdata[0]的值作為這一次AD采集的最終值;若是則說明有跳動,繼續(xù)判斷Bdata[2]-Bdata[1]的絕對值是否大于TH,若是則說明Bdata[1]為跳變值,把Bdata[0]的值賦給Bdata[1],然后輸出Bdata[0]作為這一次AD采集的最終值;若不是則可能有雙跳變值,繼續(xù)判斷Bdata[3]-Bdata[2]的絕對值是否大于TH,若是則說明Bdata[2]和Bdata[1]為雙跳變值,把Bdata[0]的值賦給這兩個寄存器,覆蓋掉雙跳變值,然后輸出Bdata[0]作為這一次AD采集的最終值;
9、接著上一個步驟,若Bdata[3]-Bdata[2]的絕對值不大于TH,則說明AD數(shù)據(jù)已經(jīng)整體發(fā)生變化,需要對原來的值進行更新,把窗口2的四個值進行求平均處理,并把得到的均值賦給窗口2的四個寄存器,然后輸出Bdata[0]作為這一次AD采集的最終值,即輸出的為均值。
窗口1和窗口2的窗口大小N1、N2和判定跳變的跳變閾值TH這幾個值都是客戶可以自行根據(jù)情況設(shè)定的。為了節(jié)省數(shù)據(jù)存儲空間和程序空間,這里采用N1=5,N2=4這兩種值進行驗證。其中N1選擇5是為了在窗口1中多一次判斷雙跳變的情況,但實際上做平均時,窗口1只選擇前四個數(shù)據(jù)做平均處理。而閾值TH的選擇直接影響了數(shù)據(jù)的波動,故TH的值不能選值過大,選值太大會導致算法對跳變的判定范圍變大,無法達到去噪聲的效果,所以應當選擇合適的閾值以保證算法的效果。
可以發(fā)現(xiàn),每一次采集新AD數(shù)據(jù)并進行處理后,窗口2的數(shù)據(jù)不一定會有改動,只有到有跳變值出現(xiàn)時才有值被改動,或當數(shù)據(jù)整體發(fā)生變化時,所有數(shù)據(jù)才會發(fā)生變化,在每次采集中,最后輸出的數(shù)據(jù)為Bdata[0],Bdata[0]在這次采集中很難被改動,它是上一次采集AD時的Bdata[1],所以這種方法輸出的數(shù)據(jù)是有一定滯后的,可以更加充分的去除AD小信號數(shù)據(jù)的噪聲,保證了數(shù)據(jù)的穩(wěn)定性。
如圖2、圖3所示,圖2為原始AD數(shù)據(jù),圖3為算法處理后輸出的AD數(shù)據(jù),采集的數(shù)據(jù)量有一萬個以上,為了清晰顯示,這里圖片只截取六千個數(shù)據(jù),從圖2的波形可以看出原來的數(shù)據(jù)跳動噪聲非常大,而經(jīng)過算法處理后,數(shù)據(jù)基本穩(wěn)定在一個較為準確的小范圍,如圖3所示。
因此,本發(fā)明不僅實現(xiàn)對小信號AD數(shù)據(jù)中的不正常跳變數(shù)值的去除,濾除AD數(shù)據(jù)中的噪聲,還能根據(jù)實際情況,通過跳變閾值的調(diào)整,來控制跳變范圍,得到較為穩(wěn)定的小信號AD數(shù)據(jù)。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。