/// <summary> /// 频域修正 /// </summary> /// <param name="data1"></param> /// <param name="begin1"></param> /// <param name="end1"></param> /// <param name="data2"></param> /// <param name="begin2"></param> /// <param name="end2"></param> /// <returns></returns> public static int[] MiddleFilterCorrection(int[] data1, int begin1, int end1, int[] data2, int begin2, int end2) { int[] res = new int[end1 - begin1]; int k = Math.Max(end1 - begin1, end2 - begin2); int dx = FToneAnalysis.getmin2x(k); //double dl = (double)NNAnalysis.samplingRate / dx; double[] fftdata1 = new double[dx]; double[] fftdataimag1 = new double[dx]; Array.Copy(data1, begin1, fftdata1, 0, Math.Min(k, end1 - begin1)); TWFFT.FFT(fftdata1, fftdataimag1); double[] fftdata2 = new double[dx]; double[] fftdataimag2 = new double[dx]; Array.Copy(data2, begin2, fftdata2, 0, Math.Min(k, end2 - begin2)); TWFFT.FFT(fftdata2, fftdataimag2); int num = 15; double[] lineori1 = new double[dx]; double[] lineori2 = new double[dx]; for (int i = 0; i < dx; i++) { lineori1[i] = Math.Abs(fftdata1[i]); lineori2[i] = Math.Abs(fftdata2[i]); //lineori1[i] = Math.Sqrt(Math.Pow(fftdata1[i], 2) + Math.Pow(fftdataimag1[i], 2)); //lineori2[i] = Math.Sqrt(Math.Pow(fftdata2[i], 2) + Math.Pow(fftdataimag2[i], 2)); } double[] line1 = FToneAnalysis.MiddleFilter(lineori1, num); //double[] linei1 = FToneAnalysis.MiddleFilter(fftdataimag1, num); double[] line2 = FToneAnalysis.MiddleFilter(lineori2, num); //double[] linei2 = FToneAnalysis.MiddleFilter(fftdataimag2, num); for (int i = 0; i < line1.Length; i++) { //Complex c1 = new Complex(fftdata1[i], fftdataimag1[i]); //Complex cl1 = new Complex(line1[i], linei1[i]); //Complex cl2 = new Complex(line2[i], linei2[i]); //c1 = c1.Multiply(cl1.Division(cl2)); fftdata1[i] = (int)((double)fftdata1[i] * (line2[i] / line1[i])); //fftdataimag1[i] += (int)(linei2[i]-linei1[i]); } for (int i = dx / 4; i < dx / 2; i++) { if (line2[i] < line1[i]) { fftdata1[i] = fftdata2[i]; fftdata1[dx - i] = fftdata2[dx - i]; } } TWFFT.IFFT(fftdata1, fftdataimag1); for (int i = 0; i < res.Length; i++) { res[i] = (int)fftdata1[i]; } return(res); }
/// <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, 5); for (int i = 0; i < n; i++) { res[i] = Math.Pow(Math.E, res[i]); } return(res); }