private static List <KeyValuePair <int, int> > CheckSame(double[,] fft1, double[,] fft2, List <int> hash1, List <int> hash2, int size) { Dictionary <int, List <int> > pos = new Dictionary <int, List <int> >(); for (int i = 0; i + size < fft2.GetLength(0); i++) { int h = hash2[i]; if (!pos.ContainsKey(h)) { pos[h] = new List <int>(); } pos[h].Add(i); } //Console.WriteLine(Environment.TickCount); //List<int> pos = new List<int>(); var ret = new List <KeyValuePair <int, int> >(); for (int i = 0; i + size < fft1.GetLength(0); i += size) { int h = hash1[i]; if (pos.ContainsKey(h)) { double best = 0; int bp = 0; foreach (var p in pos[h]) { double s = LSH.sim(fft1, fft2, i, p, size); if (s > best) { best = s; bp = p; } } if (best > 0.85) { ret.Add(new KeyValuePair <int, int>(i, bp)); } //sw.WriteLine("{0}\t{1}\t{2}", i, bp, best); } //pos.Add(a); } return(ret); }
//输入候选,输出时间区间 private static void FineTune(double[,] fft1, double[,] fft2, List <int> hash1, List <int> hash2, List <Range> range1, List <Range> range2, int size, List <KeyValuePair <int, int> > sames) { int len1 = fft1.GetLength(0); int len2 = fft2.GetLength(0); foreach (var same in sames) { int p1 = same.Key; int p2 = same.Value; if (InRange(range1, p1) && InRange(range2, p2)) //两个区域都已经识别过 // Console.WriteLine("."); { continue; } //错位选择最佳位置 double best = 0; int bp = 0; for (int i = Math.Max(0, p1 - 5); i < Math.Min(p1 + 5, len1 - size); i++) { double s = LSH.sim(fft1, fft2, i, p2, size); if (s > best) { best = s; bp = i; } } p1 = bp; int step = 2;//切割精度 int next = 0; int prev = 0; int size2 = step * 2; // double change = 1.08; //改变量大于这个,就认为是不同的 double threshold = 0.82;// LSH.sim(fft1, fft2, p1, p2, size2) / change - 0.01; List <double> ss = new List <double>(); for (; p1 + next + size2 < len1 && p2 + next + size2 < len2; next += step) { double s = LSH.sim(fft1, fft2, p1 + next, p2 + next, size2); if (s < threshold) { break; } ss.Add(s); } for (; p1 + prev >= 0 && p2 + prev >= 0; prev -= step) { double s = LSH.sim(fft1, fft2, p1 + prev, p2 + prev, size2); if (s < threshold) { prev += size2 - 1; break; } ss.Add(s); } //if (ss.Count > 0) // Console.WriteLine("{0} {1} {2} {3}", p1 + prev, p1 + next, next - prev, ss.Average()); CreateRange(range1, len1, new Range(p1 + prev, p1 + next)); CreateRange(range2, len2, new Range(p2 + prev, p2 + next)); } }