Beispiel #1
0
        public static SongParametrs Detector(SongData data)
        {
            var parametrs = new SongParametrs();

            parametrs.Song = data;

            double[] signal = new double[data.leng];

            //Объединение сигналов
            for (int i = 0; i < data.leng; i++)
            {
                signal[i] = data.Left[i] + data.Right[i];
            }
            int st        = 10;
            int frameSize = 1 << st;
            int sst       = 0;
            int s         = 1 << sst;
            int step      = 1;
            int HiFilter  = 1 << 3;

            //Преобразование фурье
            parametrs.TransformSong = FastFourierTransform.WindowFFTParalell(signal, frameSize, step, s, st - sst);



            //Диффирационный фильтр
            List <double[]> FrequencyFunctions = new List <double[]>();


            for (int i = 0; i < frameSize / HiFilter; i++)
            {
                double[] func = new double[data.leng / step];
                for (int j = 0; j < data.leng / step; j++)
                {
                    func[j] = parametrs.TransformSong[j, i];
                }
                func = Filters.Differentiator5(func);
                FrequencyFunctions.Add(func);
            }
            ppp = FrequencyFunctions;

            //Суммирование
            parametrs.BeatFunction = new double[data.leng / step];
            for (int i = 0; i < data.leng / step; i++)
            {
                parametrs.BeatFunction[i] = 0;
                for (int j = 1; j < frameSize / HiFilter; j++)
                {
                    parametrs.BeatFunction[i] += Math.Abs(FrequencyFunctions[j][i]);
                }
            }

            var f   = Filters.DellShum(parametrs.BeatFunction);
            var cor = Correlation.Easy(TableFunction.TableToFunction(f, 1, 0, parametrs.BeatFunction.Length), 1, 0, parametrs.BeatFunction.Length / 3);

            var Max = MaxAssistance.LocalMax2(MaxAssistance.LocalMax(MaxAssistance.CompressFunc(cor, 1, 0), 220), 10);

            var BeatMax = MaxAssistance.LocalMax2(MaxAssistance.LocalMax(parametrs.BeatFunction, 220), 10);


            double BPMd = Max[1].Item1 * 1 * step;

            int sd = (int)BeatMax[0].Item1 * step;

            parametrs.Temp = 60 * 44100 / BPMd;

            parametrs.TempD = (int)BPMd;

            parametrs.StartBeat = sd;

            return(parametrs);
        }