2013-03-22 7 views
2

그래서 특정 사운드를 감지하고 필터링하는 프로젝트의 선구자로 실시간 오디오 분석기 역할을하는 Android 앱을 제작하려고합니다.안드로이드에서 가장 정확한 오디오 주파수 데이터를 실시간 FFT에서 어떻게 얻을 수 있습니까?

그래서 이산 푸리에 변환의 기초를 알고 있다고 생각하지만 실시간 주파수 분석을 수행 할 때 가장 좋은 매개 변수가 무엇인지 잘 모르겠습니다.

이상적인 상황 (무제한의 컴퓨팅 파워)에서 나는 4400 샘플/초 PCM 스트림의 모든 샘플을 AudioRecord 클래스에서 가져 와서 44100 요소 fifo 창에 넣을 것이라고 생각합니다. "새로운 샘플이 들어올 때마다 윈도우에서 FFT를 실행합니다. (이것은 생각합니다.) 0 ~ 22KHz의 스펙트럼을 제공합니다. 초당 44100 회.

스마트 폰에서는 이런 일이 일어나지 않을 것 같습니다. 문제는 가능한 한 많은 품질을 유지하면서 내 Galaxy Nexus에서 다루기 쉽게 만들기 위해 어느 매개 변수를 줄여야하는지 잘 모르겠습니다. 결국 나는 더 나은 감도로 외부 마이크를 사용하고 싶습니다.

FFT를 가져 오는 사이에 하나 이상의 샘플을 이동하는 것이 포함되지만, 작은 창에서 FFT를 수행하는 것보다 정밀도/앨리어싱/어떤 점에서 더 해로운 지 전혀 알지 못합니다. 내가 바라 보는 세 번째 옵션이 있습니다.

기본적으로 libgdx에서 사용하고있는 KissFFT를 사용하면 44100 샘플 당 44100 요소 FFT를 30-42 사이에서 수행 할 수있는 것처럼 보이며 여전히 응답 성이 있습니다 (즉, 버퍼가 스레드에서 채워진다는 의미입니다 AudioRecord.read()가 fft를 수행하는 스레드가 빠르게 소모하지 못하는 경우).

그래서 내 질문은 :

  1. 내가 현재 만지고있어 성능이 가장 좋은 내가받을거야 수 있을까? 아니면 훨씬 빠른 속도가 가능하기 때문에 나는 바보 같은 존재 여야 만하는 것처럼 보입니까?
  2. 내 접근 방식이 근본적으로 정확합니까? 아니면 완전히 잘못된 트리를 짖고 있습니까?

내 질문에 답해 주시면 기꺼이 알려 드리겠습니다.하지만 많은 내용이 있으므로 모든 내용을 게시하는 대신 선택적으로 처리 할 것이라고 생각했습니다.

+0

더 나은 정확도를 위해 해닝 또는 해밍 창과 같은 창 함수를 사용하여 매번 사각형 창을 필터링해야합니다. 물론 이것은 구현 속도를 늦출 것입니다. – SztupY

+0

주파수 해상도 요구 사항은 무엇입니까? 한 번에 64k FFT에서 얻는 32k 출력 샘플을 실제로 표시 할 수 있습니까? 필자는 캐시 고려 사항 때문에 FFT가 덜 효율적이게되는 경향이 있으며 대개 현대 x86 CPU의 경우 32k-64k 정도이므로 전화 또는 태블릿의 경우 훨씬 낮을 수 있습니다. 따라서 FFT 크기를 줄이고 주파수 해상도를 낮추면 처리량이 증가 할 수 있습니다. –

+0

"가장 정확한"의미가 없습니다. 실제 정확도 요구 사항을 정의하고 시간 - 주파수 트레이드 오프를 만들어야합니다. 오디오 처리는 일반적으로 길이가 1000mS보다 훨씬 짧은 블록에서 더 많이 이루어지며 단지 25 %에서 50 %까지 중복 될 수 있습니다. – hotpaw2

답변

2

내가

내려다 보이는거야 세 번째 옵션이있는 경우 예 : 두 가지를 동시에 수행의 FFT 크기의 감소뿐만 아니라 더 큰 스텝 크기. 한 말에서 "입 냄새/씹는 소리"를 감지하고 싶다고 지적했습니다. 그래서, 당신이하고 싶은 것은 음성 인식의 전형적인 작업과 유사합니다. 여기서, 일반적으로 10ms 간격으로 (441 샘플마다 Fs = 44.1kHz의 의미로) 특징 벡터를 추출하고 변환 할 신호 윈도우는 대략 스텝 크기의 크기이므로 20ms는 2^X FFT로 나타납니다 1024 샘플 크기 (더 빠르기 때문에 2의 거듭 제곱 인 FFT 크기를 선택해야합니다).

창 크기가 증가하거나 단계 크기가 감소하면 데이터가 증가하지만 주로 중복성이 추가됩니다.

추가 힌트 :

  • 올바르게 일반적으로 해밍 - wondow로, 이전 FFT에에 "창"당신의 신호를 필요가 있다고 지적했다 @SztupY. (그러나 이것은 "필터링"이 아닙니다. 결과를 누적하지 않고 각 샘플 값에 해당 창 값을 곱하는 것입니다.)

  • 원시 FFT 출력은 "입 냄새/씹는 소리"를 인식하는 데 거의 적합하지 않으며, 클래식 인식기는 MFCC 시퀀스와 해당 델타를 처리하는 HMM 또는 ANN으로 구성됩니다.

내가 현재 만지고있어 성능이 가장 좋은 내가받을거야 수 있을까? 아니면 훨씬 빠른 속도가 가능하기 때문에 나는 바보 같은 존재 여야 만하는 것처럼 보입니까?

아주 가깝지만 인식기에 CPU 전력을주지 않고 높은 중복 데이터를 평가하기 위해 모든 CPU 성능을 낭비하고 있습니다.

내 접근법이 근본적으로 정확합니까? 아니면 완전히 잘못된 트리를 짖고 있습니까?

내 대답을 생각한 후에 귀하의 접근 방식을 다시 생각해보십시오.