2011-12-06 2 views
0

나는 안드로이드 용 튜너 응용 프로그램에서 작업 해 왔지만 근본적인 주파수를 얻는 데 어려움을 겪고있다.안드로이드 - AsyncTask에 값을 표시하는 방법

두 가지 가능한 문제점이 있습니다. 1) 기본 주파수를 정확하게 계산하지 않습니다. 2)이 값을 UI에 표시 할 수 있도록이 값을 올바르게 전달하지 않습니다.

Craigy 덕분에 일종의 데이터를 지속적으로 통과 할 수 있었기 때문에 AsyncTask를 성공적으로 구현했습니다. 자, 이제 나는 올바른 값을 얻을 필요가 있습니다. 여기

은 AsyncTask를하다 :

protected class Tune extends AsyncTask<Double, Double, Double> 
{ 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     btnTune.setText("Stop Tuning"); 
    } 

    protected Double doInBackground(Double... params) 
    { 


     while(tuning) 
     { 
      try{ 


       acquire(); 
       hello = computeFFT(); 
       publishProgress(hello); 
       //Thread.sleep(1); 
      } catch(Exception e) { 

      } 

     } 

     return 100.0; 
    } 

    protected void onProgressUpdate(Double...values) 
    { 
     super.onProgressUpdate(values); 

       //DecimalFormat d = new DecimalFormat("#3.65"); 
       freq.setText(values + " Hz");; 



    } 

    protected double onPostExecute(Double...hello) 
    { 
     tuning = false; 
     freq.setText("STOP!"); 
     return 75.0; 
    } 
} 

내가 올바르게 설정되어 있는지 생각하지만, 어떤 이유로 나는 publishProgress 및 onProgressUpdate에 더 이상 표시 아무것도 얻을 수 없습니다. 뭐가 잘못 되었 니? UI를 어떻게 업데이트해야합니까? 나는 그것을 잠시 동안 일했지만, 더 이상은하지 못했습니다. 내가 읽고 공부 한 모든 것을에서

public double computeFFT(){ 

    //Conversion from short to float 
      float[] micBufferData = new float[buffer];//size may need to change 
      final int bytesPerSample = 2; // As it is 16bit PCM 
      final float amplification = 50; // choose a number as you like 
      for (int index = 0, floatIndex = 0; index < buffer - bytesPerSample + 1; index += bytesPerSample, floatIndex++) { 
       float sample = 0; 
       for (int b = 0; b < bytesPerSample; b++) { 
        int v = audioData[index + b]; 
        if (b < bytesPerSample - 1 || bytesPerSample == 1) { 
         v &= 0xFF; 
        } 
        sample += v << (b * 8); 
       } 
       float sample32 = amplification * (sample/32768); 
       micBufferData[floatIndex] = sample32; 
      } 
    sampleRate = sampleRateInHz; 

    //Take FFT of float data 
    fftgdx.forward(micBufferData); 

    //Fill in imaginary and real arrays from FFT data 
    tmpi = fftgdx.getImaginaryPart(); 
    tmpr = fftgdx.getRealPart(); 

    //Create array of magnitude = sqrt(real*real + imag*imag) 
    for(int i=0;i<micBufferData.length;i++) 
     { 
      real[i] = (double) tmpr[i]; 
      imag[i] = (double) tmpi[i]; 
      mag[i] = Math.sqrt((real[i]*real[i]) + (imag[i]*imag[i])); 
     } 

    // find largest peak in power spectrum 
    double max_magnitude = -1.0; 
     int max_index = -1; 
     for(int i = 0; i<(buffer/2.0-1); i++) 
     { if(mag[i] > max_magnitude) 
      max_magnitude = mag[i]; 
      max_index = i; 
     } 

     // convert index of largest peak to frequency 
     frequency = (max_index*sampleRateInHz)/(buffer); 

     return frequency; 
} 

, 이것은 잘 될 것 같다 :

여기 내 FFT입니다. 너 잘되? 내가 다시 값을 전달하고 있습니까?

도움 주셔서 감사합니다. 많이 감사합니다 :)

답변

0

내가 그러나, 당신이 onPostExecute을 무시하지 않는 ... onProgressUpdate에 문제가 표시되지 않습니다, 그것의 반환 형식이 void하지 double 때문이다. @Override

@Override 
protected Object doInBackground(Object ... data) {...} 
+0

그래서 이뿐 아니라 @Override도 추가합니까? – dustinrwh

+0

AsyncTask에는'double onPostExecute (...)'라는 메서드가 없으므로'void onPostExecute (...)'입니다. 반환 유형을 'void'로 변경하십시오. –

+0

또한 Devunwired가 지적했듯이 매개 변수 유형을 변경해야합니다. –

0

시도는 잘못된 서명이, 그래서 당신의 구현이 기본 구현을 재정의하지 않기 때문에 그들은 호출되지 않습니다. 두 방법 모두 Double... 가변 배열이 아닌 Double 인수를 사용해야합니다. 이

protected void onProgressUpdate(Double progress) 

에 모두 정의를 변경하고이

protected void onPostExecute(Double result) 

또한, 당신의 onPostExecute의 반환 값이 잘못 통지 것을 (위의 예와 같이 무효을). 두 가지 방법 중 하나에서 super 번으로 전화 할 필요가 없습니다.

HTH!

0

모두 onPostExecute()onProgressUpdate()를 선언

관련 문제