Почему DFT из AForge.Math не работает? - PullRequest
0 голосов
/ 01 апреля 2012

Я попытался получить fft, а затем получить dft волны, используя этот код:

        string s = textBox1.Text;
        double[] source = SourceToDouble(s);
        listBox2.DataSource = source;
        ToPowerOfTwo(ref source);
        List<Complex> Source = DoubleToComplex(source);
        Complex[] sou = Source.ToArray();
        FourierTransform.FFT(sou, FourierTransform.Direction.Forward);
        listBox1.DataSource = sou;
        FourierTransform.DFT(sou, FourierTransform.Direction.Forward);
        DoPlaySound(sou);

SourceToDouble(s):

private double[] SourceToDouble(string s)
    {
        List<double> Final = new List<double>();

        EricOulashin.WAVFile audioFile = new EricOulashin.WAVFile();
        String warning = audioFile.Open(s, WAVFile.WAVFileMode.READ);
        if (warning == "")
        {
            short audioSample = 0;
            for (int sampleNum = 0; sampleNum < audioFile.NumSamples; ++sampleNum)
            {
                audioSample = audioFile.GetNextSampleAs16Bit();
                Final.Add((double)audioSample);
            }
        }
        else
        {
            throw new Exception(warning);
        }

        return Final.ToArray();
    }

ToPowerOfTwo(ref source)

private void ToPowerOfTwo(ref double[] source)
    {
        List<long> TwoPowers = GetTwoPowers(100);
        long pCount = 0;

        for (int i = 0; i <= 100; i++)
        {
            if (source.Count() <= TwoPowers[i])
            {
                pCount = TwoPowers[i];
                break;
            }
        }

        List<double> f = new List<double>(source);

        while (f.Count < pCount)
        {
            f.Add(0.0);
        }
        //f.Add(0.0);
        source = f.ToArray();
    }

DoubleToComplex(source):

private static List<Complex> DoubleToComplex(double[] source)
    {
        List<Complex> Source = new List<Complex>();
        foreach (double dob in source)
        {
            Complex c = new Complex(dob, 0.0);
            Source.Add(c);
        }
        return Source;
    }

DoPlaySound(sou)

 private void DoPlaySound(Complex[] c)
        {
            FourierTransform.DFT(c, FourierTransform.Direction.Forward);
            double wav = c[0].Re;
            List<double> Big = ToBigger(100000, new double[] { wav });
            MakeWavFile(Big, "tmp.wav");
            System.Media.SoundPlayer s = new SoundPlayer("tmp.wav");
            s.PlayLooping();
        }

проблема заключается в следующем: когда я передаю wav-файл в общий код, через долгое время метод пытается воспроизвести финальный wav (tmp.wav), но он не похож на общий файл.

Обновление 1:

Я также пытался FourierTransform.DFT(sou, FourierTransform.Direction.Backward);, но это тоже не сработало!

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

БПФ всего аудиофайла не является хорошим способом анализа голосовой или другой нестационарной информации. Это также будет очень медленно. Более распространенным методом будет анализ коротких перекрывающихся кадров длительностью от нескольких до нескольких десятков миллисекунд с использованием более коротких БПФ или обработка последовательных кадров с использованием быстрой свертки с добавлением / сохранением БПФ с перекрытием.

Один IFFT будет правильной обратной функцией для FFT. В противном случае вы можете получить неправильный обратный результат.

2 голосов
/ 01 апреля 2012

Кажется, вы запускаете DFT-файл три раза вперед между чтением и воспроизведением. Поэтому, конечно, это не будет звучать как оригинал.

1 голос
/ 17 апреля 2012

Я бы переписал функцию DoubleToComplex следующим образом:

    private static Complex[] DoubleToComplex(double[] source)
    {
        Complex[] complexSource = new Complex[source.Length];
        for(int i =0; i< source.Length; i++ )
        {
            complexSource[i] = new Complex(source[i], 0.0);                
        }
        return complexSource;
    }

Зачем сначала создавать список, чтобы создать весь сложный объект, чтобы потом вернуть его обратно в массив?Использовать массив с самого начала более эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...