안녕하세요 안드로이드 소리분석어플을 만들려고하는 학생인데요,
여러 데시벨분석,주파수분석 예제들 보면서 공부중인데
package com.example.giu.projec160401;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.provider.MediaStore;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
class AnalyzeSound extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
mThread thread;
private RealDoubleFFT fft;
int blockSize = 256;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
short[] buffer;
double[] toTransform;
boolean started=true;
AudioRecord ar;
// Canvas c;
public AnalyzeSound(Context context) {
super(context);
mHolder=getHolder();
mHolder.addCallback(this);
int bufferSize = AudioRecord.getMinBufferSize(8000, channelConfiguration, audioEncoding);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, channelConfiguration, audioEncoding, bufferSize);
buffer=new short[blockSize];
toTransform=new double[blockSize];
thread=new mThread(mHolder);
ar.startRecording();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
public class mThread extends Thread {
SurfaceHolder mHolder;
public mThread(SurfaceHolder mHolder) {
this.mHolder=mHolder;
}
public void run() {
while(started) {
int bufferResult = ar.read(buffer, 0, blockSize);
//buffer에다가 마이크로 인식한 오디오데이터를 집어넣는다.
for (int i = 0; i < blockSize && i < bufferResult; i++) {
toTransform[i] = (double) buffer[i];
// short 형데이터를 더블로 형변환
}
try {
fft.ft(toTransform);//주파수로 변환하는 내부알고리즘함수사용
} catch (Exception e) {
System.out.println("FFT Error");
}
Canvas c = null;
c = mHolder.lockCanvas(null);
c.drawColor(Color.WHITE);
for(int i=0;i<blockSize;i++)
{
c.drawText(i+":"+buffer[i],100,i*10,new Paint());
}
//onDraw(c, toTransform);
// c.drawCircle(50,500,30,new Paint(Color.RED));
mHolder.unlockCanvasAndPost(c);
}
}
public void onDraw(Canvas c, double[] trans)
{
Paint paint=new Paint();
c.drawColor(Color.BLACK);//배경 블랙으로 초기화
paint.setColor(Color.RED);
for(int i=0;i<blockSize;i++)
{
c.drawCircle(i, (float) trans[i],5,paint);
}
}
}
}
공부중인 코드인데요..
AudioRecord클래스의 read 함수로 받은 오디오데이터 short형배열을 이용해서
어떻게 특정소리를 들어서 데시벨을 측정하는지,
FFT의 ft()함수를 통해 바뀐 double배열을 이용해서
어떻게 주파수를 알아내는지를 모르겠습니다..ㅠㅠ
관련홈페이지나 알수있는곳좀 알려주세요..