Esempio n. 1
0
 private void button4_Click(object sender, EventArgs e)
 {
     WaterLeak.set_PipelineLength(Convert.ToSingle(textBox1.Text));
     WaterLeak.set_WaveNumber(Convert.ToInt32(textBox2.Text));
     WaterLeak.set_CaptureRate(Convert.ToInt32(textBox3.Text));
     MessageBox.Show("参数保存成功!", "消息");
 }
Esempio n. 2
0
        private void button2_Click(object sender, EventArgs e)
        {
            EraseGraph();

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName;
                int    datalength   = 0;
                double dataB_avg    = 0;
                double dataB_avgAbs = 0;
                //double[] dataA;

                FileName = openFileDialog1.FileName;
                //openFileDialog1.FileName = "*.txt";

                if (openFileDialog1.FilterIndex == 0)
                {
                    /*StreamReader sr = new StreamReader(FileName, Encoding.ASCII);
                     * //  int nextChar = sr.Read();
                     * //  nextChar = sr.Read();
                     * //  nextChar -= 0x30;
                     * // 全部读完
                     * string restOfStream = sr.ReadToEnd();
                     * sr.Dispose();
                     * datalength = (restOfStream.Length - 6) / 6;
                     * //  label4.Text = Convert.ToString(nextChar);
                     * //处理数据,计算平均值
                     * // float dataA_avg = 0;
                     * dataA = new double[datalength];
                     * byte[] tmp = new byte[4];
                     * for (int i = 0; i < datalength; i++)
                     * {
                     *  tmp[0] = (byte)restOfStream[3 + i * 6];
                     *  tmp[1] = (byte)restOfStream[3 + i * 6 + 1];
                     *  tmp[2] = (byte)restOfStream[3 + i * 6 + 3];
                     *  tmp[3] = (byte)restOfStream[3 + i * 6 + 4];
                     *
                     *  for (int j = 0; j < 4; j++)
                     *  {
                     *
                     *      if (tmp[j] > 96 && tmp[j] < 103)
                     *          tmp[j] = (byte)((int)tmp[j] - 87);
                     *      else if (tmp[j] > 64 && tmp[j] < 71)
                     *          tmp[j] = (byte)((int)tmp[j] - 55);
                     *      else if (tmp[j] > 47 && tmp[j] < 58)
                     *          tmp[j] = (byte)((int)tmp[j] - 48);
                     *  }
                     *
                     *  dataA[i] = 0;
                     *  for (int j = 0; j < 4; j++)
                     *      dataA[i] = (dataA[i] * 0x10 + tmp[j]);
                     *
                     *  dataA_avg += dataA[i] / datalength;
                     * }*/
                }
                else
                {
                    FileStream fs = new FileStream(FileName, FileMode.Open);
                    datalength = (int)(fs.Length - 2) / 2 - cutNum;
                    dataB      = new double[datalength];
                    byte[] data = new byte[datalength * 2];



                    fs.Seek(cutNum + 1, SeekOrigin.Begin);//跳过第一个字符
                    fs.Read(data, 0, datalength * 2);


                    fs.Dispose();



                    // byte[] adata = new byte[datalength * 2];
                    // adata = data;
                    //data_B = adata;



                    for (int i = 0; i < datalength; i++)
                    {
                        dataB[i] = (double)(data[2 * i] * 0x100 + data[2 * i + 1]);
                    }


                    dataB_avg = 0;
                    for (int i = 0; i < datalength; i++)
                    {
                        dataB_avg += dataB[i] / datalength;
                    }
                }


                for (int i = 0; i < datalength; i++)
                {
                    dataB[i] = (dataB[i] - dataB_avg) / dataB_avg;
                }

                //B平均幅值
                for (int i = 0; i < datalength; i++)
                {
                    dataB_avgAbs += System.Math.Abs(dataB[i]) / datalength;
                }
                textBoxAvgB.Text = dataB_avgAbs.ToString();

                //保存数据
                WaterLeak.set_DataLength(datalength);
                WaterLeak.set_DataB(dataB);
                WaterLeak.set_DataB_Avg(dataB_avg);


                //画图形

                /*panel2.Controls.Clear();
                 *
                 * ZedGraphControl zed2 = new ZedGraphControl();
                 * zed2.Width = MasterPane.Width;
                 * zed2.Height = MasterPane.Height;
                 * panel2.Controls.Add(zed2);
                 *
                 * GraphPane Pane = zed2.GraphPane;*/
                /*Pane.Title = "数据B";
                 * Pane.XAxis.Title = "点数";
                 * Pane.YAxis.Title = "信号强度";*/


                for (int i = 0; i < datalength; i++)
                {
                    listB.Add(i, dataB[i]);
                }

                //LineItem myCurve = Pane.AddCurve("Porsche", list, Color.Blue, SymbolType.None);
                //zed2.AxisChange();

                //开启状态使能
                button3.Enabled = true;
            }
        }
Esempio n. 3
0
        private void button3_Click(object sender, EventArgs e)
        {
            EraseGraph();

            CreateGraph();

            panel3.Controls.Clear();

            /*Label label13 = new Label();
             * Label label14 = new Label();
             * label13.Font = label14.Font = new System.Drawing.Font("宋体", 15.75F, System.Drawing.FontStyle.Bold);
             * label13.ForeColor = label14.ForeColor = Color.Red;
             * label13.Location = new System.Drawing.Point(100, 30);
             * label14.Location = new System.Drawing.Point(900, 30);
             * label13.AutoSize = label14.AutoSize = true;
             * panel3.Controls.Add(label13);
             * panel3.Controls.Add(label14);*/

            ZedGraphControl zed3 = new ZedGraphControl();

            zed3.Width  = panel3.Width;
            zed3.Height = panel3.Height;

            //读取数据
            int datalength = WaterLeak.get_DataLength();

            double[] dataA     = WaterLeak.get_DataA();
            double[] dataB     = WaterLeak.get_DataB();
            double   dataA_avg = WaterLeak.get_DataA_Avg();
            double   dataB_avg = WaterLeak.get_DataB_Avg();


            if (比较ToolStripMenuItem.Checked == true)
            {
                byte[] A = data_A;
                byte[] B = data_B;

                int[] m = new int[2 * datalength];
                int   j;
                int   k = 0;
                for (int i = 0; i < 2 * datalength; i++)
                {
                    if (A[i] != B[i])
                    {
                        j    = i;
                        m[k] = j;
                        k++;
                    }
                }

                int index = 0;
                for (int i = 0; i < 2 * datalength; i++)
                {
                    if (m[i] == 0)
                    {
                        index = i;
                    }
                }
                int[] n = new int[index];
                for (int i = 0; i < index; i++)
                {
                    n[i] = m[i];
                }
                MessageBox.Show("" + index);
            }


            //处理数据,采用均方差算法
            if (算术平均ToolStripMenuItem.Checked == true)
            {
                progressBar1.Value = 0;

                int      j    = 0;
                double   MINC = 0;
                int      bias = 5000;
                int      w    = 5000;
                double[] C    = new double[2 * bias];
                for (int i = -bias; i < bias; i++)
                {
                    C[i + bias] = 0;
                    for (int k = w; k < datalength - w; k++)
                    {
                        C[i + bias] += Math.Abs(dataA[k + i] - dataB[k]);  //曼哈顿距离
                    }
                    if (i == -bias)
                    {
                        MINC = C[0];
                    }
                    else if (C[bias + i] < MINC)
                    {
                        j    = i;
                        MINC = C[bias + i];
                    }
                    Application.DoEvents();
                    progressBar1.Value = (i + bias) * 50 / bias;
                }
                progressBar1.Value += 1;  //进度条

                double w_avg;
                w_avg = 0;
                for (int i = 0; i < 2 * bias; i++)
                {
                    w_avg += C[i] / (2 * bias);
                }

                for (int i = 0; i < 2 * bias; i++)
                {
                    C[i] = (C[i] - w_avg) / w_avg;
                }

                panel3.Controls.Add(zed3);
                GraphPane Pane = zed3.GraphPane;

                /*Pane.Title = "偏差结果";
                 * Pane.XAxis.Title = "";
                 * Pane.YAxis.Title = "";*/

                PointPairList list1 = new PointPairList();
                for (int i = 0; i < 2 * bias; i++)
                {
                    list1.Add(i, C[i]);
                }

                LineItem myCurve1 = Pane.AddCurve("Porsche", list1, Color.Blue, SymbolType.None);
                zed3.AxisChange();

                //计算漏水点位置
                double positon = (WaterLeak.get_PipelineLength() + WaterLeak.get_WaveNumber() * j / (1000 * WaterLeak.get_CaptureRate())) / 2;

                /*label14.Text = "漏水点距离A探头" + positon.ToString() + "米!";
                 *
                 * //显示标注数据
                 * if (j > 0)
                 *  label13.Text = "A探头滞后B探头" + j.ToString("G") + "个基点!";
                 * if (j < 0)
                 *  label13.Text = "A探头超前B探头" + (-j).ToString() + "个基点!";
                 * if (j == 0)
                 *  label13.Text = "A探头与B探头无偏移!";*/

                //显示基点
                textBoxOffSet.Text = j.ToString();

                //保存参数
                WaterLeak.set_dataC_factor(500);
                WaterLeak.set_dataC_shift(100);
                WaterLeak.set_Bias(bias);
                WaterLeak.set_Min_Position(j);
                WaterLeak.set_Min_Value(MINC);
                WaterLeak.set_DataC(C);
            }

            //if (LMSToolStripMenuItem.Checked == true)
            //{
            //    progressBar1.Value = 0;


            //    MatlabClass mat = new MatlabClass();
            //    MWNumericArray dataA_m = new MWNumericArray(1, datalength, dataA);
            //    MWNumericArray dataB_m = new MWNumericArray(1, datalength, dataB);
            //    MWArray M_m = 100;
            //    MWArray mu_m = 0.00001;
            //    MWArray W_m = mat.my_LMS(dataA_m, dataB_m, M_m, mu_m);
            //    Array W = ((MWNumericArray)W_m).ToArray();
            //    int M = ((MWNumericArray)M_m).ToScalarInteger();
            //    int W_length = W.Length;
            //    int d = 0;
            //    double temp = Convert.ToDouble(W.GetValue(0, 0));

            //    for (int i = 1; i < W_length; i++)
            //    {
            //        if (temp < Convert.ToDouble(W.GetValue(i, 0)))
            //        {
            //            temp = Convert.ToDouble(W.GetValue(i, 0));
            //            d = i - 2 * M;
            //        }
            //    }

            //    panel3.Controls.Add(zed3);
            //    GraphPane Pane = zed3.GraphPane;
            //    Pane.Title = "偏差结果";
            //    Pane.XAxis.Title = "";
            //    Pane.YAxis.Title = "";

            //    PointPairList list = new PointPairList();
            //    for (int i = 0; i < W_length; i++)
            //    {
            //        list.Add(i - 2 * M, Convert.ToDouble(W.GetValue(i, 0)));
            //    }

            //    LineItem myCurve = Pane.AddCurve("Porsche", list, Color.Blue, SymbolType.None);
            //    zed3.AxisChange();

            //    //计算漏水点位置
            //    double positon = (WaterLeak.get_PipelineLength() + WaterLeak.get_WaveNumber() * d / (1000 * WaterLeak.get_CaptureRate())) / 2;
            //    label14.Text = "漏水点距离A探头" + positon.ToString() + "米!";

            //    //显示标注数据
            //    if (d > 0)
            //        label13.Text = "A探头滞后B探头" + d.ToString("G") + "个基点!";
            //    if (d < 0)
            //        label13.Text = "A探头超前B探头" + (-d).ToString() + "个基点!";
            //    if (d == 0)
            //        label13.Text = "A探头与B探头无偏移!";
            //}

            if (广义互相关ToolStripMenuItem.Checked == true)
            {
                DateTime startDT = System.DateTime.Now;
                progressBar1.Value = 0;
                int len = 262144;


                double[] A = new double[len];
                double[] B = new double[len];

                for (int i = 0; i < len; i++)
                {
                    A[i] = dataA[i];
                    B[i] = dataB[i];
                }

                CrossCorrelation ccorr = new CrossCorrelation();
                double[]         R     = ccorr.Rxy(A, B);
                int R_length           = R.Length;

                Position p        = new Position();
                int      location = p.max(R);
                int      d        = location - R_length / 2;

                panel3.Controls.Add(zed3);
                GraphPane Pane = zed3.GraphPane;


                /*Pane.Title = "互相关系数";
                 * Pane.XAxis.Title = "";
                 * Pane.YAxis.Title = "";*/

                PointPairList list = new PointPairList();
                for (int i = 0; i < R_length; i++)
                {
                    list.Add(i, R[i]);
                }

                LineItem myCurve = Pane.AddCurve("Porsche", list, Color.Blue, SymbolType.None);
                zed3.AxisChange();

                //计算漏水点位置
                double positon = (WaterLeak.get_PipelineLength() + WaterLeak.get_WaveNumber() * d / (1000 * WaterLeak.get_CaptureRate())) / 2;

                /*label14.Text = "漏水点距离A探头" + positon.ToString() + "米!";
                 * //显示标注数据
                 * if (d > 0)
                 *  label13.Text = "A探头滞后B探头" + d.ToString("G") + "个基点!";
                 * if (d < 0)
                 *  label13.Text = "A探头超前B探头" + (-d).ToString() + "个基点!";
                 * if (d == 0)
                 *  label13.Text = "A探头与B探头无偏移!";*/

                //显示基点
                textBoxOffSet.Text = d.ToString();

                DateTime endDT = System.DateTime.Now;
                TimeSpan time  = endDT.Subtract(startDT);
                //MessageBox.Show(time.TotalMilliseconds.ToString() + "ms");
            }

            //if (互功率谱ToolStripMenuItem.Checked == true)
            //{
            //    progressBar1.Value = 0;


            //    MatlabClass mat = new MatlabClass();
            //    MWNumericArray dataA_m = new MWNumericArray(1, datalength, dataA);
            //    MWNumericArray dataB_m = new MWNumericArray(1, datalength, dataB);
            //    MWArray datalength_m = datalength;
            //    MWArray R_m = mat.my_xcorrPow(dataA_m, dataB_m);
            //    Array R = ((MWNumericArray)R_m).ToArray();
            //    int R_length = R.Length;

            //    int d = 0;
            //    double temp = Convert.ToDouble(R.GetValue(0, 0));

            //    for (int i = 1; i < R_length; i++)
            //    {
            //        if (temp < Convert.ToDouble(R.GetValue(0, i)))
            //        {
            //            temp = Convert.ToDouble(R.GetValue(0, i));
            //            d = i - datalength + 1;
            //        }
            //    }

            //    panel3.Controls.Add(zed3);
            //    GraphPane Pane = zed3.GraphPane;
            //    Pane.Title = "偏差结果";
            //    Pane.XAxis.Title = "";
            //    Pane.YAxis.Title = "";

            //    PointPairList list = new PointPairList();
            //    for (int i = 0; i < R_length; i++)
            //    {
            //        list.Add(i - datalength + 1, Convert.ToDouble(R.GetValue(0, i)));
            //    }

            //    LineItem myCurve = Pane.AddCurve("Porsche", list, Color.Blue, SymbolType.None);
            //    zed3.AxisChange();

            //    //计算漏水点位置
            //    double positon = (WaterLeak.get_PipelineLength() + WaterLeak.get_WaveNumber() * d / (1000 * WaterLeak.get_CaptureRate())) / 2;
            //    label14.Text = "漏水点距离A探头" + positon.ToString() + "米!";

            //    //显示标注数据
            //    if (d > 0)
            //        label13.Text = "A探头滞后B探头" + d.ToString("G") + "个基点!";
            //    if (d < 0)
            //        label13.Text = "A探头超前B探头" + (-d).ToString() + "个基点!";
            //    if (d == 0)
            //        label13.Text = "A探头与B探头无偏移!";
            //}
            //int bias = 5000;
            //int w = 2500;
            //double[] C = new double[bias];
            //double minc = 0;
            //int d = 0;
            //int n = 5;//计算次数
            //int sp = datalength / n;//每次计算的间隔
            //int[] T = new int[n];//时延点数
            //double[] S = new double[n];//离A点距离
            //DataTable dt = new DataTable();
            //dt.Columns.Add("A探头超前点数", typeof(int));
            //dt.Columns.Add("漏水点离A探头距离", typeof(double));
            //for (int m = 0; m < n; m++)
            //{
            //    for (int i = 0 + m * sp; i < bias + m * sp; i++)
            //    {
            //        C[i - m * sp] = 0;
            //        for (int j = w + m * sp; j < w + bias + m * sp; j++)
            //        {
            //            C[i - m * sp] += Math.Abs(dataA[i + j - w - m * sp] - dataB[j]);
            //        }
            //        if (i == 0) minc = C[0];
            //        else if (C[i - m * sp] < minc)
            //        {
            //            d = i - m * sp;
            //            minc = C[i - m * sp];
            //        }
            //    }
            //    T[m] = w - d;
            //    S[m] = 500 - (double)T[m] / 10;
            //    DataRow dr = dt.NewRow();
            //    dr[0] = T[m].ToString();
            //    dr[1] = S[m].ToString();
            //    dt.Rows.Add(dr);
            //    Application.DoEvents();
            //    progressBar1.Value = (m - 1) * 100 / n;
            //}
            //dataGridView1.DataSource = dt;
            //dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

            /*
             *
             * //处理数据,采用LMS算法
             * //初始化
             * int M=1000;
             * float mu = (float)0.1;
             * float[] en = new float[datalength];
             * for (int i = 0; i < datalength; i++)
             *  en[i] = 0;
             * double[] w = new double[M];
             * for (int i = 0; i < M; i++)
             *  w[i] = 0;
             * float y;
             * //迭代运算
             * for (int k = M - 1; k < datalength; k++)
             * {
             *  y=0;
             *  for (int i = 0; i < M; i++)
             *      y += (float)(w[i]) * dataB[k - i];
             *  if (double.IsNaN(y)) y = 0;
             *  en[k] =dataA[k] - y;
             *
             *  for (int i = 0; i < M; i++)
             *  {
             *      w[i] = w[i] + 2 * mu * en[k] * dataB[k - i];
             *      if (double.IsNaN(w[i])) w[i] = 0;
             *      // w[i] = Math.Round(w[i], 6);
             *  }
             *
             *  progressBar1.Value = (k-M) * 100 / (datalength - M-1);
             *
             *  Application.DoEvents();
             *
             * }
             *
             *
             * float w_avg;
             * w_avg = 0;
             * for (int i = 0; i < M; i++)
             * w_avg += (float)w[i];
             *
             * w_avg /= M;
             * // w_avg = Math.Round(w_avg, 6);
             *
             * // w[0] = Math.Round(w[0], 10);
             * textBox1.Text = w[0].ToString("G");
             */
        }
Esempio n. 4
0
        private void button1_Click(object sender, EventArgs e)
        {
            EraseGraph();

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName;
                int    datalength   = 0;
                double dataA_avg    = 0;
                double dataA_avgAbs = 0;
                //double[] dataA;

                FileName = openFileDialog1.FileName; //选取的文件

                //openFileDialog1.FileName = "*.txt";

                if (openFileDialog1.FilterIndex == 0)                             //文件筛选器的索引,第一项
                {
                    StreamReader sr = new StreamReader(FileName, Encoding.ASCII); //输入流用于从外部源读取数据
                    //  int nextChar = sr.Read();
                    //  nextChar = sr.Read();
                    //  nextChar -= 0x30;
                    // 全部读完
                    string restOfStream = sr.ReadToEnd();  //从流的当前位置到末尾读取流。
                    datalength = (restOfStream.Length - 6) / 6;
                    //  label4.Text = Convert.ToString(nextChar);
                    //处理数据,计算平均值
                    byte[] tmp = new byte[4];
                    dataA = new double[datalength];

                    for (int i = 0; i < datalength; i++)
                    {
                        tmp[0] = (byte)restOfStream[3 + i * 6];
                        tmp[1] = (byte)restOfStream[3 + i * 6 + 1];
                        tmp[2] = (byte)restOfStream[3 + i * 6 + 3];
                        tmp[3] = (byte)restOfStream[3 + i * 6 + 4];

                        for (int j = 0; j < 4; j++)
                        {
                            if (tmp[j] > 96 && tmp[j] < 103)
                            {
                                tmp[j] = (byte)((int)tmp[j] - 87);
                            }
                            else if (tmp[j] > 64 && tmp[j] < 71)
                            {
                                tmp[j] = (byte)((int)tmp[j] - 55);
                            }
                            else if (tmp[j] > 47 && tmp[j] < 58)
                            {
                                tmp[j] = (byte)((int)tmp[j] - 48);
                            }
                        }

                        dataA[i] = 0;
                        for (int j = 0; j < 4; j++)
                        {
                            dataA[i] = (dataA[i] * 0x10 + tmp[j]);
                        }

                        dataA_avg += dataA[i] / datalength;
                    }

                    sr.Dispose();
                }
                else
                {
                    FileStream fs = new FileStream(FileName, FileMode.Open);
                    //datalength = (int)(fs.Length-2)/2;

                    datalength = (int)((fs.Length - 2) / 2) - cutNum;
                    dataA      = new double[datalength];
                    byte[] data = new byte[datalength * 2];



                    fs.Seek(cutNum + 1, SeekOrigin.Begin);//跳过字符
                    fs.Read(data, 0, datalength * 2);

                    fs.Dispose();


                    //byte[] adata = new byte[datalength * 2];
                    //adata = data;
                    //data_A = adata;


                    for (int i = 0; i < datalength; i++)
                    {
                        dataA[i] = (double)(data[2 * i] * 0x100 + data[2 * i + 1]);
                    }
                    dataA_avg = 0;
                    for (int i = 0; i < datalength; i++)
                    {
                        dataA_avg += dataA[i] / datalength;
                    }
                }

                double variance = ComputeVariance2(dataA);

                //double[] data1 = dataA;
                //double[] data2 = dataA;
                //MyMath mm = new MyMath();
                //double fc = mm.mse(data1);
                //double[] maxten = new double[10];
                //maxten = mm.maxten(data1);
                //double[] minten = new double[10];
                //minten = mm.minten(data2);

                for (int i = 0; i < datalength; i++)//归一处理
                {
                    dataA[i] = (dataA[i] - dataA_avg) / dataA_avg;
                }



                //A平均幅值
                for (int i = 0; i < datalength; i++)
                {
                    dataA_avgAbs += System.Math.Abs(dataA[i]) / datalength;
                }
                textBoxAvgA.Text = dataA_avgAbs.ToString();

                //保存数据
                WaterLeak.set_DataLength(datalength);
                WaterLeak.set_DataA(dataA);
                WaterLeak.set_DataA_Avg(dataA_avg);

                //画图形

                /*MasterPane.Controls.Clear();  //清空
                 *
                 * ZedGraphControl zed1 = new ZedGraphControl();
                 * zed1.Width = MasterPane.Width;
                 * zed1.Height = MasterPane.Height;
                 * MasterPane.Controls.Add(zed1);
                 *
                 * GraphPane Pane = zed1.GraphPane;
                 * /*Pane.Title = "数据A";
                 * Pane.XAxis.Title = "点数";
                 * Pane.YAxis.Title = "信号强度";*/

                //PointPairList list = new PointPairList();

                for (int i = 0; i < datalength; i++)
                {
                    listA.Add(i, dataA[i]);
                }

                //LineItem myCurve = Pane.AddCurve("Porsche", list, Color.Blue, SymbolType.None);
                //zed1.AxisChange();

                //开启状态使能
                button2.Enabled = true;
            }
        }