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); }
/// <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); }