2017-02-11 6 views
0

루미어 응용 프로그램을 개발 중입니다. 나는 특정 주파수의 반송파 신호 (19.2 kHz가 더 정확한 경우)를 가지고 있으며 오디오가 재생되는 동안 진폭을 알아야합니다. 나는 오디오 처리에 대한 몇 가지 정보를 봤는데 주파수 스펙트럼을 얻기 위해서는 FFT 알고리즘을 사용해야한다는 것을 알았다.특정 주파수 오디오 신호의 진폭을 실시간으로 얻는 방법 android

TarsosDSP 라이브러리 및 FFT 클래스를 사용해 보았습니다.

TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false); 
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format); 

float[] buff = new float[bufferFloatSize]; 
final float[] amps = new float[fftSize]; 

converter.toFloatArray(tmpBuffer, buff); 

FFT fft = new FFT(bufferFloatSize, new HannWindow()); 
fft.forwardTransform(buff); 
fft.modulus(buff, amps); 

은 그럼 주파수 대역 인덱스를 얻을 진폭

int amp = (int) (10 * Math.log10(amps[index]); 

을 계산하지만 내가 잘못 진폭을 얻을. 19.2kHz 신호의 오디오 파일이 있는데, 0dB의 일정 진폭을 갖지만 19207Hz 진폭의 결과 값은 -39dB에서 -46dB까지 다양합니다. 나는 이웃 주파수를 확인했다. 그들 중 일부는 0dB를 가지고 있을지도 모른다. 또한 -36 dB 및 -60 dB로 파일을 검사했지만 결과는 각각 -39에서 -48 dB 및 -44에서 -61 dB였습니다.

마지막 파일에서 볼 수 있듯이 파일은 가깝지만 일정하지 않으며 올바른 시점과 잘못되었을 때 예측할 수 없습니다.

이 문제에 직면 한 사람이 있으면 저를 도우십시오. 좋아, 내가 추가 한 TSG의 기능과 결과를 비교하기 위해 내 fft.forwardTransform (전에 호출) 이후; - 당신은 확실히 가능한 어떤 다른 좋은 FFT lib 디렉토리를 알고 있다면 나에게

UPDATE에게 결과는 같다 : 0dB 19.2kHz 오디오 파일 : 전에 : -39 dB 후 - 10dB

-36 dB 19.2kHz 오디오 파일 : 전에 : -75 dB 후 : -46 dB -60 dB 19.2kHz 오디오 파일에 대한

: 전에 : -97.7 dB 후 :

지금 결과가 일정 시간 또는 시도 변경되지 않습니다 -69 dB. 결과에도 특정 패턴이 있음을 알 수 있습니다. fft 전에 결과는 -10dB에 대한 -39dBs 및 이후의 올바른 결과와 다릅니다. 질문은 이렇습니다. 왜 우리는 이러한 실수를 저지르고 있습니까?

답변

0
In the TarsosDSP manual , the following example was given sound pressure level in db where , 

db=audioEvent.getdBSPL(); or Amplitude=audioEvent.getRMS() //root mean square of the signal. 



    float[] buffer = audioEvent.getFloatBuffer(); 



    private double soundPressureLevel(final float[] buffer) { 
    double power = 0.0D; 
    for (float element : buffer) { 
    power += element*element; 
    } 

    double value = Math.pow(power, 0.5)/ buffer.length;; 
    return 20.0*Math.log10(value); 
    } 
    }); 
+0

설명해 주시겠습니까? 20.0 * Math.log10 (value)에서 20을 곱하면됩니다. 나는 같은 표현식에 10을 곱한 것을 보았 기 때문에 : 10 * Math.log10 (value); –

+0

0 dB 19.2 kHz 오디오 파일에 대한 사용자의 결과는 FFT를 호출하기 전에 -39 dB이고 FFT를 호출 한 후 -10 dB입니다. Log.d ("테스트", "파워 레벨 이전 :"+ soundPressureLevel (버프) + "dB"); fft.forwardTransform (buff); fft.modulus (버프, 암페어); Log.d ("테스트", "전원 수준 :"+ soundPressureLevel (버프) + "dB"); –

+0

나는 3 개의 파일 모두 항상 같은 결과를 가졌음을 확인했습니다. 상수 값 (이전과 같은 편차가 없음)과 올바른 결과와 잘못된 값의 차이가 약 39dB (fft가 발생하기 전의 결과)이기 때문에 더 나은 결과를 얻었습니다. . 마찬가지로 0dB이고 -39dB이고 -36dB이어야하고 -75dB이고 -60dB이어야하며 -98dB입니다. –