루미어 응용 프로그램을 개발 중입니다. 나는 특정 주파수의 반송파 신호 (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 및 이후의 올바른 결과와 다릅니다. 질문은 이렇습니다. 왜 우리는 이러한 실수를 저지르고 있습니까?
설명해 주시겠습니까? 20.0 * Math.log10 (value)에서 20을 곱하면됩니다. 나는 같은 표현식에 10을 곱한 것을 보았 기 때문에 : 10 * Math.log10 (value); –
0 dB 19.2 kHz 오디오 파일에 대한 사용자의 결과는 FFT를 호출하기 전에 -39 dB이고 FFT를 호출 한 후 -10 dB입니다. Log.d ("테스트", "파워 레벨 이전 :"+ soundPressureLevel (버프) + "dB"); fft.forwardTransform (buff); fft.modulus (버프, 암페어); Log.d ("테스트", "전원 수준 :"+ soundPressureLevel (버프) + "dB"); –
나는 3 개의 파일 모두 항상 같은 결과를 가졌음을 확인했습니다. 상수 값 (이전과 같은 편차가 없음)과 올바른 결과와 잘못된 값의 차이가 약 39dB (fft가 발생하기 전의 결과)이기 때문에 더 나은 결과를 얻었습니다. . 마찬가지로 0dB이고 -39dB이고 -36dB이어야하고 -75dB이고 -60dB이어야하며 -98dB입니다. –