0

저는 대학생입니다. 나는 내년 프로젝트를위한 음악 식별 시스템을 개발 중이다. "2 차원 크로마를 기반으로 한 강력한 오디오 지문 추출 알고리즘"연구 논문에 따르면, 다음과 같은 함수가 내 시스템에 포함되어야합니다.오디오 샘플에 해닝 기능을 적용하려면 어떻게해야합니까?

캡처 오디오 신호 ----> 프레임 창 (해닝 창) -----> FFT ----->

하이 패스 필터 -----> 등 .....

오디오 캡처 기능을 코딩 할 수 있었고 코드에 FFT 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(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(); 
      double[] w = new double[blockSize]; 

      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]); 
       } 
       // new part 
       toTransform = hanning (toTransform); 
       transformer.ft(toTransform); 
       publishProgress(toTransform); 
      } 
      audioRecord.stop(); 
      dos.close(); 
     } catch (Throwable t) { 
      Log.e("AudioRecord", "Recording Failed"); 
     } 
     return null; 
    } 

이러한 링크는 해닝 창 알고리즘과 코드 조각을 제공하고 있습니다 : :이

WindowFunction.java

Hanning - MATLAB

을 다음 여기에

는 내 오디오 캡처 코드와 적용 FFT 코드 코드 난 내 응용 프로그램에 기능을 해닝을 적용하는 데 사용하고 그것은 나를 위해 일합니다 ....

public double[] hanningWindow(double[] recordedData) { 

    // iterate until the last line of the data buffer 
    for (int n = 1; n < recordedData.length; n++) { 
     // reduce unnecessarily performed frequency part of each and every frequency 
     recordedData[n] *= 0.5 * (1 - Math.cos((2 * Math.PI * n) 
       /(recordedData.length - 1))); 
    } 
    // return modified buffer to the FFT function 
    return recordedData; 
} 
+0

제발 좀 도와주세요이 기능을 수행하십시오. 왜냐하면 그것은 매우 시급하기 때문입니다. –

+0

긴급한 것은 당신 자신의 문제입니다. 이런 방식으로 현장에서 자원 봉사자를 격려하려고해서는 안됩니다. –

+0

그것에 대해 ....... : ( –

답변

1

처음에는 FFT 길이를 고정시켜야한다고 생각합니다. 코드를 올바르게 이해하면 FFT 길이와 같은 종류의 최소 버퍼 크기를 사용하게됩니다. FFT 길이는 계산의 성능과 해상도에 큰 영향을 미칩니다.

WindowFunction.java에 대한 링크를 사용하면 FFT 길이와 동일한 길이의 배열을 생성 할 수 있습니다 (필자의 경우 blockSize라고 생각합니다). 그런 다음 배열의 동일한 ID를 가진 WindowFunction에서 반환 된 값으로 버퍼의 각 샘플을 곱해야합니다.

FFT를 수행하기 전에 수행해야합니다.

+0

예 내가 어떻게 그것을하고 싶어하는지. 당신은 코드 스 니펫을 통해 설명 할 수 있습니까? –

+0

@ Mikael이 제 편집 된 코드를 확인합니다. 어떻게 해닝 함수를 시도했는지, 어떻게 코드에 추가되었는지 보여주었습니다.하지만 문제는 지금입니다. 아주 작은 빈도와 나는 그것이 정확하다고 생각하지 않는다. 뭔가 잘못 되었기 때문에. –

+0

@ Mikael 나는 마지막 부분에 대해 언급하지 않았다. 배열의 동일한 ID를 가진 WindowFunction에서 반환 된 값을 사용하여 버퍼의 각 샘플. " –