Member 12576199 Ответов: 0

Результаты ошибок : получить БПФ от микрофона


привет, так что мне нужно получить частоту от микрофона в android-устройстве .. на большинстве частот я получаю правильные результаты, но на некоторых частотах я получаю половину частоты или частоты *1.5 .. пример, если реальная частота равна 200, то несколько раз я получаю 100, а несколько раз 300

это мой код

enter code here         async Task voicein()
    {

        int intsizee = AudioRecord.GetMinBufferSize(11025, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit);
        recorder = new AudioRecord(AudioSource.Mic,11025, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, intsizee);
        recorder.StartRecording();
        short[] buffer3 = new short[(256*64)];
        while (true)
        {
            // start recording
            int count = await recorder.ReadAsync(buffer3, 0, buffer3.Length);
            System.Numerics.Complex[] x = new System.Numerics.Complex[buffer3.Length];
            int i = 0;
            // put short buffer3 in complex array
            foreach (short n in buffer3)
            {
                    x[i] = new System.Numerics.Complex(n , 0.0);
                    i++; 
            }
           int a = 0;

            int index = 0;
            int temp = 0;
            //  fourier transformation using MathNet librrary
            Fourier.BluesteinForward(x, FourierOptions.Matlab);
            //  gave me the largest value
            foreach (System.Numerics.Complex c in x)
            {
                if (c.Magnitude >(int) a )
                {
                    a = (int)c.Magnitude;
                    index = temp;
                }
                temp++;

            }
            // and thats should be the last frequency
            int lastfrequency = Convert.ToInt32 ( 11025- index * 0.6729);
            if ((11024 - index) > (11025 / 2))
            lastfrequency = Convert.ToInt32( index * 0.6729);
            RunOnUiThread(() => button.Text = lastfrequency + ":" + index);
        }    
   }


Я использую xamarin android его почти такая же java так что любой знает что там происходит спасибо

Примечание: метод FFT работает нормально, я проверил результат, используя чистый синусоидальный сигнал, и результаты идеальны, проблема появляется только тогда, когда я использую микрофон .

Что я уже пробовал:

изменение алгоритма БПФ, изменение частоты дискретизации и размера буфера

0 Ответов