Пример #1
0
        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);
        }
Пример #2
0
        //输入候选,输出时间区间
        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));
            }
        }