2015-01-31 13 views
0

나는 shazam과 같은 음악 식별 응용 프로그램을 만들려고합니다. 이것은 안드로이드 응용 프로그램입니다. 먼저 마이크를 통해 오디오 신호를 캡처했습니다. 다음 코드로 그림과 같이 다음으로 오디오 신호에 해닝 윈도우 기능과 FFT를 구현 한 :오디오 신호에 하이 패스 필터를 구현하는 방법은 무엇입니까?

private class RecordAudio extends AsyncTask<Void, double[], Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     started = true; 
     try { 
      DataOutputStream dos = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(
          recordingFile))); 
      int bufferSize = AudioRecord.getMinBufferSize(frequency, 
        channelConfiguration, audioEncoding); 
      audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        frequency, channelConfiguration, audioEncoding, 
        bufferSize); 

      short[] buffer = new short[blockSize]; 
      double[] toTransform = new double[blockSize]; 
      long t = System.currentTimeMillis(); 
      long end = t + 15000; 
      audioRecord.startRecording(); 

      while (started) { 
       //System.currentTimeMillis() < end 
       int bufferReadResult = audioRecord.read(buffer, 0, 
         blockSize); 
       for (int i = 0; i < blockSize && i < bufferReadResult; i++) { 
        toTransform[i] = (double) buffer[i]/32768.0; 
        dos.writeShort(buffer[i]); 
       } 
       toTransform = hann(toTransform); 
       transformer.ft(toTransform); 
       publishProgress(toTransform); 
      } 
      audioRecord.stop(); 
      dos.close(); 
     } catch (Throwable t) { 
      Log.e("AudioRecord", "Recording Failed"); 
     } 
     return null; 
    } 

이제 내 질문에 내 오디오 신호에 하이 패스 필터를 적용해야 할 방법이다. 이것에 대한 API가 있습니까 ?? 이 기능을 수행하는 데 도움을주십시오.

코드 수정 부분

여기
private class RecordAudio extends AsyncTask<Void, double[], Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     started = true; 
     try { 
      DataOutputStream dos = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(
          recordingFile))); 
      int bufferSize = AudioRecord.getMinBufferSize(sampleRate, 
        channelConfiguration, audioEncoding); 
      audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        sampleRate, channelConfiguration, audioEncoding, 
        bufferSize); 

      short[] buffer = new short[blockSize]; 
      double[] toTransform = new double[blockSize]; 
      long t = System.currentTimeMillis(); 
      long end = t + 15000; 
      audioRecord.startRecording(); 

      while (started) { 
       //System.currentTimeMillis() < end 
       int bufferReadResult = audioRecord.read(buffer, 0, 
         blockSize); 
       for (int i = 0; i < blockSize && i < bufferReadResult; i++) { 
        toTransform[i] = (double) buffer[i]/32768.0; 
        dos.writeShort(buffer[i]); 
       } 
       toTransform = hann(toTransform); 
       transformer.ft(toTransform); 
       publishProgress(toTransform); 
       //new part 
       //sample rate = 8000 
       highPassFilter(toTransform, sampleRate); 
      } 
      audioRecord.stop(); 
      dos.close(); 
     } catch (Throwable t) { 
      Log.e("AudioRecord", "Recording Failed"); 
     } 
     return null; 
    } 

내 하이 패스 필터 방법 :

public void highPassFilter(double []frequency, int samplerate){ 
    double [] f = new double[frequency.length]; 
    for (int n=1; n<frequency.length; n++){ 
    f[n] = (double)frequency[n]/samplerate; 
    double x = (double)Math.exp(-2 * Math.PI * f[n]); 
    double []a = new double[] { (1+x)/2, -(1+x)/2 }; 
    double []b = new double[] { x }; 
    } 
} 

감사합니다!

+0

안녕하세요, 하이 패스 필터가 작동하는지 확인 했습니까? 감사합니다 – smoothumut

답변

0

본인은 위의 다음 도움말 SO 답변 this를 시도하지 않는 경우 libs와는 당신이

this (TarsosDSP)

을 시도 할 수있는 신호 처리가 네이티브 수준 (C, C++)에서 할 수있다 생각합니다.

+0

@ Vigneshearan.m 답변 주셔서 감사합니다 ... 내 첫 번째 링크에 따라 내 프로그램에 대한 몇 가지 코드를 시도했다. src 폴더 (TarsosDSP/src/be/tarsos/dsp/filters /) 아래에 HighPass라는 클래스가 있었지만 코드가 맞는지 확실하지 않습니다. 그걸 확인해 주시겠습니까 ?? 위의 코드 수정 부분을 확인하십시오. –