Exemplo n.º 1
0
        public static Image getImage(int[] data, double begin = 0, double end = 1)
        {
            data = FToneAnalysis.getSoundPart(data);

            int sampleLength = data.Length;

            int begink = (int)(sampleLength * begin);
            int endk   = (int)(sampleLength * end);

            int    w      = (endk - begink) * 2;
            int    h      = 200;
            Bitmap bitmap = new Bitmap(w, h);

            Graphics g = Graphics.FromImage(bitmap);

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            //draw x,y
            g.DrawLine(new Pen(Color.Black, 5), new Point(0, 0), new Point(0, h));
            g.DrawLine(new Pen(Color.Black, 5), new Point(0, h / 2), new Point(w, h / 2));

            //draw wave
            for (int i = begink; i < endk; i++)
            {
                Pen p = new Pen(Color.Green, 1);
                g.DrawLine(p,
                           new Point((int)(((double)i - begink) * w / (endk - begink)), h / 2),
                           new Point((int)(((double)i - begink) * w / (endk - begink)), h / 2 + (int)((double)data[i] / 60 / 10)));
            }

            //draw cut

            int[] res = FToneAnalysis.cutIt(data);
            for (int i = 1; i < res.Length; i++)
            {
                if (res[i] > 0.5)
                {
                    g.DrawLine(new Pen(Color.Red, 2),
                               new Point((int)(((double)res[i] - begink) * w / (endk - begink)), 0),
                               new Point((int)(((double)res[i] - begink) * w / (endk - begink)), h));
                }
            }

            return(bitmap);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 用倒谱获得频谱包络
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static double[] GetEnvelopeFD(double[] data)
        {
            int n = data.Length;

            double[] data1  = new double[n];
            double[] data1i = new double[n];
            for (int i = 0; i < n; i++)
            {
                data1[i] = Math.Log(data[i]);
            }
            for (int i = 0; i < n; i++)
            {
                data1i[i] = 0;
            }
            TWFFT.FFT(data1, data1i);
            double therehold = 100;

            double[] data2  = new double[n];
            double[] data2i = new double[n];
            // 低通滤波
            for (int i = 0; i < n; i++)
            {
                if (i < therehold || i > n - therehold)
                {
                    data2[i]  = data1[i];
                    data2i[i] = data1i[i];
                }
                else
                {
                    data2[i]  = 0;
                    data2i[i] = 0;
                }
            }
            //for (int i = 0; i < n; i++) data2i[i] = 0;
            TWFFT.IFFT(data2, data2i);
            var res = FToneAnalysis.MiddleFilter(data2, 3);

            for (int i = 0; i < n; i++)
            {
                res[i] = Math.Pow(Math.E, res[i]);
            }
            return(res);
        }