IC解密SG平滑滤波:IC解密Savitzky-Golay滤波器(通常简称为S-G滤波器)最初由Savitzky和Golay于1964年提出,发表于Analytical Chemistry 杂志。之后被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时可以确保信号的形状、宽度不变。对IIR滤波后的数据进行SG平滑处理。在本设计中硬件端发送的数据虽然经过了0.5HZ高通滤波和50HZ陷波但是信号还是存在一定的毛刺,为了得到平滑的信号需要对信号进行平滑滤波。在本设计中使用长度为11阶数为5的SG平滑滤波,滤波器需要先在Matlab平台上面进行仿真,通过对样本数据的处理,可以验证SG平滑算法的效果,再将其在上位机上实现。
C#代码:
- _Matrix_Calc m_c = new _Matrix_Calc();
- _Matrix s = new _Matrix(N, D + 1);
- _Matrix s_tran = new _Matrix(D + 1, N);
- _Matrix F = new _Matrix(4, 4);
- _Matrix F_inv = new _Matrix(4, 4);
- _Matrix b1 = new _Matrix(N, 4);
- _Matrix b2 = new _Matrix(N, N);
- s.init_matrix();
- s_tran.init_matrix();
- F.init_matrix();
- F_inv.init_matrix();
- b1.init_matrix();
- b2.init_matrix();
- for (m = -M; m <= M; m++) //得到矩阵s
- {
- for (i = 0; i <= D; i++)
- {
- s.write(m + M, i, (float)Math.Pow(m, i));
- }
- }
- m_c.transpos(ref s,ref s_tran);
- m_c.multiply(ref s_tran, ref s, ref F);
- m_c.inverse(ref F, ref F_inv);
- m_c.multiply(ref s, ref F_inv , ref b1);
- m_c.multiply(ref b1, ref s_tran , ref b2);
- for (int i = 0; i <= M; i++) //第0到M,一共M+1个点
- {
- for (int j = 0; j < N; j++)
- EcgDataNew[ i] = EcgDataNew[ i] + B.read(j, i) * EcgDataOld[j];
- }
- for (int i = M + 1; i <= L - M - 2; i++) //第M+1到L-M-2,一共L-2M-2个点
- {
- for (int j = 0; j < N; j++)
- EcgDataNew[ i] = EcgDataNew[ i] + B.read(j, M) * EcgDataOld[i - M + j - 1];
- }
- for (int i = 0; i <= M; i++) //第L-M-1到L-1个点,一共M+1个点
- {
- for (int j = 0; j < N; j++)
- EcgDataNew[L - M + i - 1] = EcgDataNew[L - M + i - 1] + B.read(j, M + i) * EcgDataOld[L - N + j];
- }