마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 데시벨,주파수 분석질문입니다.

0 추천
안녕하세요 안드로이드 소리분석어플을 만들려고하는 학생인데요,

여러 데시벨분석,주파수분석 예제들 보면서 공부중인데

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배열을 이용해서

어떻게 주파수를 알아내는지를 모르겠습니다..ㅠㅠ

관련홈페이지나 알수있는곳좀 알려주세요..
CGU (160 포인트) 님이 2016년 4월 9일 질문

1개의 답변

0 추천
http://www.masterqna.com/android/19225/fft-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A3%BC%ED%8C%8C%EC%88%98

를 참고하시면 해당 소소의 주파수대역은 어느정도 감을 잡으실듯 싶네요.

DB 계산의 경우
http://susemi99.tistory.com/1017 를 참고하시면 좋을듯 싶네요.
이카르테 (3,570 포인트) 님이 2016년 4월 12일 답변
위 링크보고 공부해가고 있는데요..

AudioRecord로 읽은 오디오데이터 short형 데이터 256개를 받고,

이 short형데이터는

0~15.625hz/31.25hz~46.875hz/....3984.375hz~4000hz에서 사운드레벨값을 받는다고하는데

여기서사운드레벨이란것은 각해당주파수범위내에서의 소리의크기값을 의미하는건가요?

두번쨰로는,위에서 이해하는게맞다면,

각주파수범위내에서의 사운드레벨값배열을 이용해서,데시벨값을 구하는 공식이라던가,함수를 알수있는곳이 있을까요?

너무많은 질문죄송합니다;;특정 소리분석하는데 이런공부하는법은 도서관이랑 구글링밖에없는데

FFT함수사용이랑,소리크기측정하는법만 단순하게만나오고 이걸이용해서 특정소리를 파악하거나 하는이런 책같은건 별로없더라구요 ㅠㅠ
...