나는 Visualizer 클래스를 사용하여 android에서 오디오 스펙트럼 분석기를 구현하려고합니다.왜 FFT가 Windows Media Player와 다른 시각화 프로그램 출력을 제공합니까?
OnDataCaptureListener()
이벤트의 onFftDataCapture()
메서드에서 FFT 데이터를 얻고 있는데 캔버스에서 drawLines()
을 사용하여 그릴 수 있습니다.
그러나 스펙트럼 표시가 제대로 표시되지 않습니다. 그래프의 왼쪽에서만 변화를 볼 수 있습니다. 그러나 Window Media Player에서는 같은 노래의 출력이 다릅니다. 내가 누락 된 것?
예제 나 링크로 누구에게 도움이 될 수 있습니까?
CODE mVisualizer
는 비주얼 클래스 객체이며, mBytes
는 FFT 데이터 onFftDataCapture
이벤트에서 가져온 것입니다
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {}
public void onFftDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {
mVisualizerView.updateVisualizer(bytes, samplingRate);
}
}, Visualizer.getMaxCaptureRate()/2, false, true);
의 OnPaint()
for (int i = 0; i < mBytes.length/2; i++) {
mPoints[i * 4] = i * 8;
mPoints[i * 4 + 1] = 0;
mPoints[i * 4 + 2] = i * 8;
byte rfk = mBytes[2 * i];
byte ifk = mBytes[2 * i + 1];
magnitude = (float) (rfk * rfk + ifk * ifk);
int dbValue = (int) (10 * Math.log10(magnitude));
mPoints[i * 4 + 3] = (float) (dbValue * 7);
}
canvas.drawLines(mPoints, mForePaint);
.
이벤트 here에 의해 반환 된 FFT 데이터에 대해 자세히 읽을 수 있습니다.
이것은 내가 onFftDataCapture()
을 얻을 값 것입니다 :
[90, -1, -27, 102, 13, -18, 40, 33, -7, 16, -23, -23, -2, -8, -11, -9, -8, -33, -29, 44, 4, -9, -15, -1, -2, -17, -7, 1, 1, 0, 3, -11, -5, 10, -24, -6, -23, 1, -9, -21, -2, 4, 9, -10, -14, -5, -16, 8, 6, -16, 14, 3, 7, 15, 10, -2, -15, -14, -5, 10, 8, 23, -1, -16, -2, -6, 4, 9, -1, 0, 0, 9, 1, 4, -2, 6, -6, -6, 8, -4, 6, 6, -4, -5, -5, -2, 3, 0, -1, 0, -7, 0, 2, 1, 0, 1, -1, 0, -1, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1]
어떤 생각, 링크가 도움이 될 것입니다.
@ 크리스 스트래튼은
지금은 square wave at 1000 Hz 파일을 재생하고의 스크린 샷을했다하고 업데이트
. 지금 뭐라고 하시겠습니까?는 @ruhalde
가 지금은 Frequency sweep (20-20000 Hz) 파일을 재생하고 제안 및 출력 다음 생성 된이 파일 이후에 업데이트되었습니다.
스펙트럼을 다시 그릴 때마다 캔버스를 지우시겠습니까? 난 그냥 깨진 조각이 이전 무승부에서 남은 것 같아요 (격렬하게) ... –
'updateVisualizer()'메소드에서'invalidate()'를 호출합니다. 그것은 그 일을하고 있습니다. –
dB 및 크기 공식이 올바르지 않다고 생각합니다. 첫 번째 크기는 SQR (2)로 다중 타이핑하여 계산됩니다. 또한 dB 단위로 항상 한계 값으로 나눌 필요가 있습니다. 당신은 당신의 한계로 다이빙을하지 않으므로 당신의 한계는 1dB입니다, 그래서 당신의 그래프는 왜 이상한가. 여기에서 수식을 확인하십시오. http://zone.ni.com/devzone/cda/tut/p/id/4278 – ruhalde