그래서 특정 사운드를 감지하고 필터링하는 프로젝트의 선구자로 실시간 오디오 분석기 역할을하는 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를 수행하는 스레드가 빠르게 소모하지 못하는 경우).
그래서 내 질문은 :
- 내가 현재 만지고있어 성능이 가장 좋은 내가받을거야 수 있을까? 아니면 훨씬 빠른 속도가 가능하기 때문에 나는 바보 같은 존재 여야 만하는 것처럼 보입니까?
- 내 접근 방식이 근본적으로 정확합니까? 아니면 완전히 잘못된 트리를 짖고 있습니까?
내 질문에 답해 주시면 기꺼이 알려 드리겠습니다.하지만 많은 내용이 있으므로 모든 내용을 게시하는 대신 선택적으로 처리 할 것이라고 생각했습니다.
더 나은 정확도를 위해 해닝 또는 해밍 창과 같은 창 함수를 사용하여 매번 사각형 창을 필터링해야합니다. 물론 이것은 구현 속도를 늦출 것입니다. – SztupY
주파수 해상도 요구 사항은 무엇입니까? 한 번에 64k FFT에서 얻는 32k 출력 샘플을 실제로 표시 할 수 있습니까? 필자는 캐시 고려 사항 때문에 FFT가 덜 효율적이게되는 경향이 있으며 대개 현대 x86 CPU의 경우 32k-64k 정도이므로 전화 또는 태블릿의 경우 훨씬 낮을 수 있습니다. 따라서 FFT 크기를 줄이고 주파수 해상도를 낮추면 처리량이 증가 할 수 있습니다. –
"가장 정확한"의미가 없습니다. 실제 정확도 요구 사항을 정의하고 시간 - 주파수 트레이드 오프를 만들어야합니다. 오디오 처리는 일반적으로 길이가 1000mS보다 훨씬 짧은 블록에서 더 많이 이루어지며 단지 25 %에서 50 %까지 중복 될 수 있습니다. – hotpaw2