//小波变换函数
private void mwavelet1D(double[] scl0,double[] p,double[] q,out double[] scl1,out double[] wvl1)
{
int temp = 0;
int scllen = scl0.Length;
int plen = p.Length;
scl1=new double[scllen/2];
wvl1=new double[scllen/2];
for (int i = 0; i < scllen / 2;i++ )
{
scl1[i] = 0;
wvl1[i] = 0;
for (int j = 0; j < plen;++j )
{
temp = (j + i * 2) % scllen;
scl1[i]+=p[j]*scl0[temp];
wvl1[i]+=q[j]*scl0[temp];
}
}
}
private void button2_Click(object sender, EventArgs e)
{
//低通滤波器
double[] lowFilter = new double[] { 0.48296291314453, 0.83651630373780, 0.22414386804201, -0.12940952255126 };
//高通滤波器
double[] highFilter = new double[lowFilter.Length];
for (int i = 0; i < lowFilter.Length;++i )
{
highFilter[i]=Math.Pow(-1,i)*lowFilter[lowFilter.Length-1-i];
}
//测试数据
double[] src = new double[] { 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0, 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0, 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0, 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0, 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0, 0, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 0 };
double[] dst1=null;
double[] dst2=null;
mwavelet1D(src, lowFilter, highFilter, out dst1,out dst2);
Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
Pen pen = Pens.Blue;
Pen pen2 = Pens.Red;
Pen pen3= Pens.Green;
//画出原始数据
for (int i = 0; i < src.Length-1;++i )
{
Point p1=new Point(i*10+10,(int)(src[i]));
Point p2=new Point((i+1)*10+10,(int)(src[i+1]));
g.DrawLine(pen,p1,p2);
}
//画出低频分量
for (int i = 0; i < dst1.Length - 1; ++i)
{
Point p1 = new Point(i*10 + 10, 200+(int)(dst1[i] ));
Point p2 = new Point((i+1)*10 + 10, 200+(int)(dst1[i + 1] ));
g.DrawLine(pen2, p1, p2);
}
//画出高频分量
for (int i = 0; i < dst2.Length - 1; ++i)
{
Point p1 = new Point(i * 10 + 500, 200 + (int)(dst2[i] ));
Point p2 = new Point((i + 1) * 10 + 500, 200 + (int)(dst2[i + 1] ));
g.DrawLine(pen3, p1, p2);
}
}
最后效果图如下:
![](http://static.oschina.net/uploads/space/2013/0523/204117_G2je_83492.jpg)