/*************************
Author:崔泽鹏
data : 2018.10.13,Saturday
code_version : First edition
2018.10.14 Second
2018.10.15 Third
Features:实现最小二乘法的直线拟合
Design ideas :
(1)输入量:由matlab获取了带滤波信号的时域幅度采样点和滤波器的系数,采样频率为30Hz;
(2)卷积公式:
Y(n)=x(n)*h(n)=x(0)h(n)+x(1)h(n-1)+...+x(i)h(n-i)+...;
(3)输出量:经滤波后的输出信号的150个采样点,与matlab的进行对比;并把输入量和输出量用matlab仿真,对比滤波前后的信号变化;
*************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int x= 151, y = 40,k;
//输入混合信号的151个采集数据
float sig_in_buff[151] = {
0,64.0924392709979,-2.62760588164191,58.7785252292473,117.615752736961,43.3012701892220,95.1056516295153,142.753459726049,56.1509193476054,95.1056516295153,129.903810567666,31.0132123585176,
58.7785252292473,83.9749344968019,-22.5101011074459,0,22.5101011074461,-83.9749344968020,-58.7785252292474,-31.0132123585174,-129.903810567666,-95.1056516295154,-56.1509193476053,-142.753459726049,
-95.1056516295155,-43.3012701892220,-117.615752736961,-58.7785252292475,2.62760588164203,-64.0924392709979,0,64.0924392709979,-2.62760588164178,58.7785252292476,117.615752736961,43.3012701892220,
95.1056516295152,142.753459726049,56.1509193476056,95.1056516295156,129.903810567666,31.0132123585175,58.7785252292472,83.9749344968022,-22.5101011074456,0,22.5101011074464,-83.9749344968019,
-58.7785252292475,-31.0132123585173,-129.903810567666,-95.1056516295159,-56.1509193476054,-142.753459726049,-95.1056516295156,-43.3012701892218,-117.615752736961,-58.7785252292479,2.62760588164181,
-64.0924392709976,0,64.0924392709979,-2.62760588164182,58.7785252292474,117.615752736962,43.3012701892219,95.1056516295158,142.753459726049,56.1509193476053,95.1056516295148,129.903810567666,
31.0132123585179,58.7785252292471,83.9749344968026,-22.5101011074457,0,22.5101011074465,-83.9749344968020,-58.7785252292469,-31.0132123585173,-129.903810567665,-95.1056516295146,-56.1509193476054,
-142.753459726049,-95.1056516295157,-43.3012701892220,-117.615752736961,-58.7785252292474,2.62760588164166,-64.0924392709976,0,64.0924392709978,-2.62760588164143,58.7785252292465,117.615752736961,
43.3012701892218,95.1056516295149,142.753459726049,56.1509193476057,95.1056516295139,129.903810567666,31.0132123585178,58.7785252292463,83.9749344968015,-22.5101011074462,0,22.5101011074464,
-83.9749344968013,-58.7785252292477,-31.0132123585176,-129.903810567666,-95.1056516295154,-56.1509193476049,-142.753459726049,-95.1056516295166,-43.3012701892211,-117.615752736962,-58.7785252292482,
2.62760588164205,-64.0924392709979,0,64.0924392709982,-2.62760588164174,58.7785252292454,117.615752736962,43.3012701892222,95.1056516295155,142.753459726049,56.1509193476062,95.1056516295145,
129.903810567666,31.0132123585173,58.7785252292480,83.9749344968012,-22.5101011074457,0,22.5101011074461,-83.9749344968008,-58.7785252292482,-31.0132123585172,-129.903810567666,-95.1056516295148,
-56.1509193476045,-142.753459726049,-95.1056516295160,-43.3012701892207,-117.615752736960,-58.7785252292459,2.62760588164245,-64.0924392709975 };
//由matlab获得的滤波器系数
float h_in_buff[40]= { 0.00130429120284417 ,0.000738580954819562 ,-0.000941711345276583 ,-0.00255666711985490 ,-0.00176657745140809,0.00242657899648755,0.00656307162521964,0.00435935056749066 ,-0.00569520834113830 ,-0.0146713909866737 ,-0.00934557724587893,
0.0118194010205744 ,0.0298048057280094 ,0.0188307042410627 ,-0.0240153136758817 ,-0.0624760609530328 ,-0.0421830019391123 ,0.0612436964738735 ,0.209114270652515 ,0.317446757595360,0.317446757595360,0.209114270652515,0.0612436964738735 ,
-0.0421830019391123, -0.0624760609530328 ,-0.0240153136758817,0.0188307042410627,0.0298048057280094 ,0.0118194010205744 ,-0.00934557724587893, -0.0146713909866737 ,-0.00569520834113830,0.00435935056749066,0.00656307162521964,0.00242657899648755 ,
-0.00176657745140809, -0.00255666711985490 ,-0.000941711345276583,0.000738580954819562,0.00130429120284417 };
//卷积滤波后的输出数据
float sig_out_buff[151] = {0};
float xx[500] = { 0 };
float sig_in_buff2[500];
for (int i = 0; i < y; i++)
{
sig_in_buff2[i] = h_in_buff[i];
}
for (int i = y; i < x + y - 1; i++)
{
sig_in_buff2[i] = 0.0;
}
//卷积过程
for (int i = 0; i < x + y - 1; i++)
{
xx[i] = 0.0;
int tem = (min(i, x)) == x ? x - 1 : min(i, x);
for (int j = 0; j <= tem; j++)
{
xx[i] += (sig_in_buff[j] * sig_in_buff2[i - j]);
}
}
for (int i = 0; i < x + y - 1; i++)
sig_out_buff[i] = xx[i];
for (int i = 0; i < 151; i++)
{
printf("%f\t", sig_out_buff[i]);
k = i % 15;
if (k == 0)
printf("\n");
}
system("pause");
}