나는 안드로이드 용 튜너 응용 프로그램에서 작업 해 왔지만 근본적인 주파수를 얻는 데 어려움을 겪고있다.안드로이드 - 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입니다. 너 잘되? 내가 다시 값을 전달하고 있습니까?
도움 주셔서 감사합니다. 많이 감사합니다 :)
그래서 이뿐 아니라 @Override도 추가합니까? – dustinrwh
AsyncTask에는'double onPostExecute (...)'라는 메서드가 없으므로'void onPostExecute (...)'입니다. 반환 유형을 'void'로 변경하십시오. –
또한 Devunwired가 지적했듯이 매개 변수 유형을 변경해야합니다. –