Библиотека FFT в android Sdk [закрыто]

33
задан stefy abraham 14 February 2012 в 05:36
поделиться

1 ответ

К сожалению, главный ответ только работает на Массив, что его размер является питанием 2, который очень ограничивает.

я пользовался библиотекой Jtransforms, и она работает отлично, можно сравнить ее с функцией, используемой Matlab.

вот мой код со ссылкой комментариев, как matlab преобразовывает любой сигнал и получает амплитуды частоты ( https://la.mathworks.com/help/matlab/ref/fft.html )

первый, добавьте следующее в build.gradle (приложение)

implementation 'com.github.wendykierp:JTransforms:3.1'

, и здесь это - код для для преобразования простой гармонической волны, работ как очарование

    double Fs = 8000;
    double T = 1/Fs;
    int L = 1600;

    double freq = 338;

    double sinValue_re_im[] = new double[L*2]; // because FFT takes an array where its positions alternate between real and imaginary
    for( int i = 0; i < L; i++)
    {
        sinValue_re_im[2*i] = Math.sin( 2*Math.PI*freq*(i * T) ); // real part
        sinValue_re_im[2*i+1] = 0; //imaginary part
    }

    // matlab
    // tf = fft(y1);

    DoubleFFT_1D fft = new DoubleFFT_1D(L);
    fft.complexForward(sinValue_re_im);
    double[] tf = sinValue_re_im.clone();

    // matlab
    // P2 = abs(tf/L);
    double[] P2 = new double[L];
    for(int i=0; i<L; i++){

        double re = tf[2*i]/L;
        double im = tf[2*i+1]/L;
        P2[i] = sqrt(re*re+im*im);
    }

    // P1 = P2(1:L/2+1);
    double[] P1 = new double[L/2]; // single-sided: the second half of P2 has the same values as the first half
    System.arraycopy(P2, 0, P1, 0, L/2);
    // P1(2:end-1) = 2*P1(2:end-1);
    System.arraycopy(P1, 1, P1, 1, L/2-2);
    for(int i=1; i<P1.length-1; i++){
        P1[i] = 2*P1[i];
    }
    // f = Fs*(0:(L/2))/L;
    double[] f = new double[L/2 + 1];
    for(int i=0; i<L/2+1;i++){
        f[i] = Fs*((double) i)/L;
    }
0
ответ дан 27 November 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: