周超 方哲 宋春苗 胡學強
摘要:光譜信號的處理是光譜系統的關鍵部分,包括插值、光滑、尋峰、提取等步驟,插值是根據已知條件逼近還原真實信號,光滑可以消除統計漲落的影響,尋峰是信號標定的先決條件,信號提取可以得到每一個有用信號單獨的數學表征。這些手段綜合起來應用,可以提高光譜系統的檢出限、精密度、穩定性等主要指標。本文針對上述步驟和方法展開討論,用C#編程語言實現其在一維光譜系統中的應用,取得了良好的效果。
關鍵詞:一維光譜信號;信號處理方法;C#
中圖分類號:TH741;TH842 文獻標識碼:A 文章編號:1007-9416(2019)05-0043-03
1 一維光譜信號處理方法
1.1 插值
插值是離散函數逼近的重要方法,利用它可通過函數在有限個點處的取值狀況,估算出函數在其他點處的近似值。對于常見的高斯信號和高斯疊加多項式的信號,一般需要在譜圖橫軸平均分布的至少7-9個點,才能展現信號的主要特征,在光譜系統中,由于分辨率的問題,我們所得到的譜圖的譜峰往往沒有足夠的數據來表征。這時候就可以使用插值的方法,補足缺失的點。時域上,f(x)是定義在[a,b]上的已知映射關系,x1,x2,x3...xn為區間內n個互不相同的點,G為給定的某一函數類。若G上有函數g(x)滿足:g(xi)=f(xi),i=1,2,...n。則稱g(x)為f(x)關于節點x1,x2,x3...xn在G上的插值函數。頻域插值是將時域的一維光譜信號數據首先轉換成頻域信號,對頻域信號進行低頻插值,一般為補0,然后將頻域信號再轉換成時域信號。頻域插值方法的關鍵代碼如下:
ifftResult = FreqAnalyzer.FFT(data, true).ToList();//傅里葉逆變換
for (int i = 0; i < data.Count(); i++)
{
ifftResult[i].Real = ifftResult[i].Real / data.Count();
ifftResult[i].Image = ifftResult[i].Image / data.Count();
}
ListShift(ifftResult);//序列前后兩段換位
fftExpand = ZeroFilling(ifftResult);//補0
fftResult = FreqAnalyzer.FFT(fftExpand.ToArray(), false).ToList();//傅里葉變換
List
1.2 光滑
在實際光譜系統中,當信號較弱的時候,信號的統計漲落比較大,往往不是高斯或類高斯分布的期望值,有用信號被淹沒在統計漲落之中,從而影響整個系統的精密度。通過光滑處理方法可以解決上述問題。常用的光滑方法有算術平均法、多項式最小二乘法、離散函數褶積變換法、傅里葉變換法等。光滑的目的是通過數學方法,消除信號中統計漲落的影響,同時保留原有信號的特征信息。其方法的過程可以概括為以當前點為中心,利用其左右n個點的測量數據,通過算法修正當前點的值。比如,算術平均法就是用當前點及其左右2n個點的算術平均數的值來替換當前點的值。傅里葉變換法則是通過頻域低通濾波,將統計漲落看作是高頻的噪聲從原始信號中消除。頻域濾波方法的關鍵代碼如下:
fftResult = FreqAnalyzer.FFT(data,false);//傅里葉變換
ListShift(fftResult);//序列前后兩段換位
for (int i = 0; i < data.Length; i++)
{
fftResult[i].Real = fftResult[i].Real * Hd[i];
fftResult[i].Image = fftResult[i].Image * Hd[i];
}
fftResult = FreqAnalyzer.FFT(fftResult, true);//傅里葉逆變換
data = FreqAnalyzer.Cmp2Mdl(fftResult);//各項再除以項數得到結果數組
1.3 尋峰
一維光譜信號的尋峰是信號標定的先決條件。信號的形狀可用信號峰位、峰強、半高寬加以描述,必要時還應考慮非對稱因子[1]。首先判定信號峰是否存在,如果存在就確定峰的位置和邊界,然后才能根據信號峰的特征進行定性分析。常用的尋峰方法有算術比較法、導數法、協方差法、對稱零面積法等。有信號重疊現象時,算術比較法不能使用。信號較弱時,協方差法的效果會受到較大影響。導數法尋峰會導致一定程度的峰位偏移。對各種情況綜合比較,對稱零面積法的準確度較好。通過窗函數與一維光譜信號進行褶積變換,當變換譜與它的標準偏差之比出現正極值,且大于固定的閾值,即可判定為峰,然后通過探測器響應函數或數學擬合方法確定峰的邊界。對稱零面積法的關鍵代碼如下:
int m = (int)(hFWHM + 1);//hFWHM半峰寬
if (i - m > 0)
{
W = 2 * m + 1; //窗寬
double[] G = new double[W];
double[] C = new double[W];
for (int j = 0; j < W; j++){G[j] = Math.Cos(Math.PI * (j-m) / 2 / hFWHM);}
double d = G.Sum() / W;
for (int j = 0; j < W; j++){C[j] = G[j] - d;}
for (int j = 0; j < W; j++)
{
y[i] += C[j] * netSpectrum[i - m + j];
dy[i] += C[j] * C[j] * netSpectrum[i - m + j];
}
dy[i] = Math.Sqrt(dy[i]);
SSi[i] = y[i] / dy[i];//SSi[i]和閾值比較定峰
}
1.4 提取
光譜信號重疊是光譜自身物理特性和光譜系統分辨率不足的結果。受制于光路設計和探測器的響應曲線,光譜系統不能把兩個臨近的一維光譜信號完全分開時,就需要用數學方法進行提取。一維光譜信號一般可以認為是某種特定分布信號的疊加,如常見的高斯信號和高斯加多項式的信號。提取的目的是通過數學方法,找到用來表征每個峰的最優函數,計算機處理時,可以轉化為求矩陣的最優解[2][3]。常用的方法有最小二乘法、剝譜法、小波變換法等。如果提取后出現殘差較大的情況,需要再次對所得到的函數參數進行調優。最小二乘法提取方法的關鍵代碼如下:
CalCoefArray();//計算系數矩陣
CalConstArray();//計算常數矩陣
lEquations.Init(coefArray, constArray);//coefArray系數矩陣,constArray常數矩陣
lEquations.GetRootsetGauss(resultMatrix);//求方程組的解
for (int i = 0; i < peakNumber; i++)
{
List
for (int j = 0; j < spectrum.Count(); j++)
{
singlePeak.Add(resultMatrix[i, 0] * Math.Exp(-Math.Pow((positionList[j] - peakList[i].position) / peakList[i].peakWidth, 2)));
}
peakList[i].singlePeakSpectrum = singlePeak;
}
2 實際應用
2.1 單個一維光譜信號的一般處理過程
為了方便敘述信號處理過程,本文設計了一組復雜的一維光譜信號,一共9個峰,32個數據點。由于數據量少,難以進行后續的數學運算,首先對原始信號進行8倍的插值處理,如圖1所示。
我們利用上述方法對插值后的結果進行平滑、尋峰、提取,并通過對提取結果與原始信號的殘差分析優化提取過程參數,即可得到每個峰最終的數學表達,通過函數曲線表示,如圖2所示。
2.2 消除信號統計漲落的效果分析
圖3是實際光譜系統在同樣條件下采集的10組信號,我們對235-243范圍內的數據放大后可以看到信號統計漲落的影響,我們從每組信號中選取10個相同位置的有用信號,利用上文提到的插值和光滑方法進行數據處理,結果如表1所示,可以看到不同組之間相同位置的信號的相對標準偏差均有減小,提高了精密度指標。
2.3 信號提取的效果分析
圖4是實際光譜系統采集的1組信號,可以看到信號Sig.1和Sig.2之間有小部分的信號重疊,信號Sig.3的一大部分被信號Sig.4覆蓋,如果不進行信號提取,就無法對信號進行下一步的分析和利用。應用上文提到的尋峰和提取方法,可以得到每個信號的數學表達,并通過函數曲線表示在圖上。提取信號與實際信號的相對偏差如表2所示,相對大的信號提取效果好,相對小的信號提取效果略差,但是總體上能夠控制在3%以內,可以滿足一般的信號處理要求。
3 結語
本文介紹了基于C#的一維光譜信號處理方法與應用,介紹了插值、光滑、尋峰、提取的方法,給出了優選方法的相關代碼,并在數據逼近還原、消除統計漲落、信號尋找、信號提取等步驟成功應用。
參考文獻
[1] 吉昂,陶光儀,卓尚軍,等.X射線熒光光譜分析[M].北京:科學出版社,2003:251-262.
[2] 王婷婷.發射光譜儀中光譜干擾校正方法的應用和研[D].杭州:杭州電機科技大學,2011.
[3] 肖筱南.現代數值計算方法[M].北京:北京大學出版社,2003:186-195.