-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] Android. 1

, 17 2017 . 14:58 +

, . , . , . , , (). , , . : . , , . , .

, Android AudioRecord.

, . JTransforms.


, - (PCM), . 19- , , . , , , , . (-) (-). .

(), .

Java. , , () 100 880 .

private double someFun(int index, int sampleRate) {
    final int amplitudeOfFirstHarmonic = 15;
    final int amplitudeOfSecondHarmonic = 1;
    final int frequencyOfFirstHarmonic = 100;
    final int frequencyOfSecondHarmonic = 880;

    return amplitudeOfFirstHarmonic * Math.cos((frequencyOfFirstHarmonic * 2 * Math.PI  * index ) / sampleRate)
            + amplitudeOfSecondHarmonic *Math.cos((frequencyOfSecondHarmonic * 2 * Math.PI  * index) / sampleRate);
}

8000 8000 , someFunc()

final int sampleRate = 8000;
final int someFuncSize = 8000;
double[] someFunc = new double[someFuncSize];
for (int i = 0; i < someFunc.length; i++) {
    someFunc[i] = someFun(i, sampleRate);
}

, , . , , , .csv Excel


, 100 15, amplitudeOfFirstHarmonic. 100 15, 880 .
. ,

private double cos(int index, int frequency, int sampleRate) {
    return Math.cos((2 * Math.PI * frequency * index) / sampleRate);
}
private double sin(int index, int frequency, int sampleRate) {
    return Math.sin((2 * Math.PI * frequency * index) / sampleRate);
}

, , . , , , .

private double[] dft(double[] frame, int sampleRate) {
    final int resultSize = sampleRate / 2;
    double[] result = new double[resultSize * 2];
    for (int i = 0; i < result.length / 2; i++) {
        int frequency = i;
        for (int j = 0; j < frame.length; j++) {
            result[2*i] +=frame[j] * cos(j, frequency, sampleRate);
            result[2*i + 1] +=frame[j] * sin(j, frequency, sampleRate);
        }
        result[2*i] =result[2*i] / resultSize;
        result[2*i + 1] = result[2*i + 1] / resultSize;
    }

    return result;
}

, , , , . , , $inline$A=\sqrt{a^2+b^2}$inline$.

double[] result;
long start = System.currentTimeMillis();
result = dft(someFunc, sampleRate);
long finish = System.currentTimeMillis();
long timeConsumedMillis = finish - start;
System.out.println("Time's dft: " + timeConsumedMillis);
double[] amplitude = new double[sampleRate/2];
for (int i = 0; i < result.length / 2; i++) {
    amplitude[i] = Math.sqrt(result[2*i]*result[2*i] + result[2*i+1]*result[2*i+1]);
    System.out.println(i + ": " + "Projection on cos: " + result[2*i] + " Projection on sin: " + result[2*i + 1]
            + " amplitude: "+ amplitude[i] + "\n");
}

, someFunc() , , .

, 100 880 , , , amplitudeOfFirstHarmonic amplitudeOfSecondHarmonic someFunc(). , 3998, , , someFunc(), .




, someFunc(), .csv Excel. ,



$inline$O(n^2)$inline$, . , (). , , , , $inline$O(n*\lg{n})$inline$. Java, JTransforms.

. AudioRecord


PCM Android AudioRecord.
AudioRecord, AudioRecord, :
  • audioSource , .
  • sampleRateInHz .
  • channelConfig .
  • audioFormat .
  • minBufferSize .

AudioRecord, startReading(), . AudioRecord , minBufferSize . AudioRecord, read() AudioRecord.
, , , , .csv , Excel


AudioRecord, 8000 1024.

, Android.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/333514/

:  

: [1] []
 

:
: 

: ( )

:

  URL