Взаимная корреляция и БПФ в C# для голосовой аутентификации

Это вопрос, аналогичный другим вопросам, но не дублирующий. Тем не менее, я все еще не могу получить правильный результат.

Я в основном пытаюсь записать два файла Wav (1 - базовый файл 2 - временный файл), а затем преобразовать его в байт и передать в Aforge FFT, а затем в корреляцию.

Путаницы немного. Когда я записываю файл, я использую 44100 кГц с 16 битами. Поэтому я считаю, что он вернет 44100 байт в секунду. FFT принимает байты в степени 2, поэтому я передаю 16384 байта за раз и сохраняю их в родительском массиве, а затем использую алгоритм кросс-корреляции для просмотра сходства, и он все время возвращает только около 0,30. Я снова не слишком уверен, правильно ли я следовал.

Я прилагаю пример кода и относительные ссылки.

        static void Start()
        {

            waveSource = new WaveInEvent();
            //waveSource.WaveFormat = new WaveFormat(44100, 1);//44khz rate
            waveSource.WaveFormat = new WaveFormat(44100, 16, 1);


            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
            Random rnd = new Random();

            int card = rnd.Next(52);
            waveFile = new WaveFileWriter(@Environment.CurrentDirectory.ToString() + @"\Recording" + card.ToString() + "0001.wav", waveSource.WaveFormat);

            waveSource.StartRecording();
        }

        private static void FileCompare(string file1, string file2)
        {
            double[] r1;


             // readWav(file1, out permanent, out r);
              //readWav(file2, out temp, out l);
               openWav(file1, out permanent, out r1);
               openWav(file2, out temp, out r1);

              double[] odoubledata = new double[163840];
              double[] odoubledata1 = new double[163840];
              int n = 0;
              int k = 0;
            for (int lk = 0; lk <10; lk++)
            {

             //   if (lk != 0   || lk != 9)
                {
                    AForge.Math.Complex[] c = new AForge.Math.Complex[16384];
                    for (int i = 0; i < 16384; i++)
                    {


                        c[i].Re = permanent[i];
                        c[i].Im = 0;

                    }

                    AForge.Math.Complex[] c1 = new AForge.Math.Complex[16384];
                    for (int i = 0; i < 16384; i++)
                    {

                        c1[i].Re = temp[i];
                        c1[i].Im = 0;

                    }

                  FourierTransform.FFT(c, FourierTransform.Direction.Forward);
                    FourierTransform.FFT(c1, FourierTransform.Direction.Forward);
                    //   FourierTransform.DFT(c1, FourierTransform.Direction.Forward);
                    double[] doubledata = new double[c.Length];
                    double[] doubledata1 = new double[c1.Length];
                    for (int i = 0; i < c.Length; i++)
                    {
                        doubledata[i] = c[i].Re;
                        odoubledata[k] = c[i].Re;
                        k = k + 1;
                    }

                    for (int i = 0; i < c1.Length; i++)
                    {
                        doubledata1[i] = c1[i].Re ;
                        odoubledata1[n] = c1[i].Re;
                        n = n + 1;
                    }

                }


            }


            double temq2;
            int off;
            CalcCrossCorrelation(odoubledata, odoubledata1, out off, out temq2);
            Console.WriteLine("Similarity  " + temq2);

        }

Ссылки - Хранение файла Wav https://stackoverflow.com/a/17983876/4124478

Чтение файла Wav https://stackoverflow.com/a/11162668/4124478

Взаимная корреляция https://stackoverflow.com/a/27277120/4124478

Код БПФ https://stackoverflow.com/a/170413/4124478

Обновить

Я храню образцы файлов с одинаковыми байтами, чтобы их было легко сравнивать. Запись остановится через 4 секунды.

static void Start()
        {

            waveSource = new WaveInEvent();
            //waveSource.WaveFormat = new WaveFormat(44100, 1);//44khz rate

            waveSource.WaveFormat = new WaveFormat(8192, 16, 1);

            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
            Random rnd = new Random();

            int card = rnd.Next(52);
            waveFile = new WaveFileWriter(@Environment.CurrentDirectory.ToString() + @"\Recording" + card.ToString() + "0001.wav", waveSource.WaveFormat);

            waveSource.StartRecording();
        }

static void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
            {
                waveFile.Write(e.Buffer, 0, e.BytesRecorded);
                int seconds = (int)(waveFile.Length / waveFile.WaveFormat.AverageBytesPerSecond);
                if (seconds > 4)
                {
                    waveFile.Flush();
                    Stop();

                }

            }
        }

Кроме того, я не смог отправить все байты, так как общая длина не была равна степени 2. Поэтому я отправляю только 2 байта за раз и обычно получаю сходство 0,60.

private static void FileCompare(string file1, string file2)
        {
            double[] l;
            double[] r;
            double[] r1;


            // readWav(file1, out permanent, out r);
            //  readWav(file2, out temp, out l);

            openWav(file1, out permanent, out r1);
            openWav(file2, out temp, out r1);

            double[] odoubledata = new double[41769];
            double[] odoubledata1 = new double[41769];

            Console.WriteLine("-------cross correlation--------");

            int n = 0;
            int k = 0;
            for (int i = 0; i < permanent.Length; i = i + 2)
            {

                Complex[] test1 = new Complex[2];
                test1[0].Re = permanent[n];
                test1[0].Im = 0;
                test1[1].Re = permanent[n + 1];
                test1[1].Im = 0;
                FourierTransform.FFT(test1, FourierTransform.Direction.Forward);
                odoubledata[n] = test1[0].Magnitude + test1[0].SquaredMagnitude;
                odoubledata[n + 1] = test1[1].Magnitude + test1[1].SquaredMagnitude;
                n = n + 1;
            }
            for (int i = 0; i < temp.Length; i = i + 2)
            {

                Complex[] test1 = new Complex[2];
                test1[0].Re = temp[k];
                test1[0].Im = 0;
                test1[1].Re = temp[k + 1];
                test1[1].Im = 0;
                FourierTransform.FFT(test1, FourierTransform.Direction.Forward);
                odoubledata1[k] = test1[0].Magnitude + test1[0].SquaredMagnitude;
                odoubledata1[k + 1] = test1[1].Magnitude + test1[1].SquaredMagnitude;
                k = k + 1;
            }
            double temwe2;
            int offs;
            CalcCrossCorrelation(odoubledata, odoubledata1, out offs, out temwe2);
            Console.WriteLine("Similarity Total together " + temwe2);
}

Я не уверен, сохраняю ли я правильные выходные значения, суммируя значение Magnitude и Squared Magnitude.


person Ravi Vyas    schedule 19.10.2016    source источник
comment
44100 кГц 16-битный (я полагаю, моно) звук составляет 88200 байт в секунду. Однако я не думаю, что это действительно повлияет на вашу взаимную корреляцию.   -  person ioctlLR    schedule 20.10.2016
comment
Да ты прав. Это 88200 байт в секунду. Однако вопрос все же остался. Что я пропустил?   -  person Ravi Vyas    schedule 21.10.2016
comment
У меня нет ответа, поэтому комментарий. Я надеюсь, что кто-то еще отзовется   -  person ioctlLR    schedule 21.10.2016
comment
Эй, у вас есть пример кода для этого?   -  person Neel    schedule 05.11.2017
comment
не могли бы вы вставить тело этой функции? CalcCrossCorrelation(odoubledata, odoubledata1, out off, out temq2);   -  person Fraga    schedule 09.05.2019