2012-03-27 4 views
3

저는 오디오를 샘플링하고이 데이터의 실시간 처리 (FFT 및 고조파 스펙트럼)를 수행해야하는 애플리케이션을 개발 중입니다.Java 주파수 분석 성능

44100Hz의 샘플링 속도를 사용해야하고 0.5Hz의 주파수 해상도가 필요합니다. 즉, 프리 FFT 88200 샘플이 필요합니다. 샘플링 속도가 두 배이기 때문에 캡처하는 데 약 2 초가 걸립니다. 그러나 첫 번째 샘플 이후 샘플링을 위해 원형 버퍼를 사용하여 작업량을 크게 향상시키고 그 후 절반 정도의 샘플을 읽습니다.

아쉽게도 성능은 여전히 ​​낮으며 지연 시간이 상당히 있습니다. 애플리케이션이 적시에 입력에 응답해야하므로 큰 문제입니다.

성능 향상 방법에 대한 제안 사항이 있습니까? 나는 주요 문제가 큰 샘플에 대한 요구 사항에 있다고 생각하며 동일한 정확도를 유지하면서 오디오를 얼마나 읽었는지 줄일 수있는 방법이 있다면 좋을 것입니다. 여기 스레딩이 도움이 될까요?

가 알고 도움이된다면 편집, 나는 코드 매칭을위한 여러 F0 추정과 함께, 일렉트릭 기타 입력에서 실시간 F0 추정을 위해 노력하고 있어요. 나는이 작업을 수행하는 방법이 있고 꽤 정확하지만 uni 프로젝트를위한 것이므로 FFT보다 다른 방법을 너무 많이 고려하지는 않습니다. 실제로 샘플링 프로세스의 속도를 높이기위한 몇 가지 방법이 필요합니다.

+0

동시성 수준을 향상시킬 수 있습니까? 예 : 파일을 작은 청크 (시작 2 청크)로 분할하고 다른 스레드에서 샘플을 실행하십시오. 하드웨어에 의존하지 않는다면 (CPU 구동 및 사운드 카드 구동이 아닌)이 분할 및 정복 방식이 도움이 될 것으로 생각합니다. – questzen

답변

1

처음에는 2 초의 오디오를 캡처해야하므로 대기 시간이 낮아집니다. 50 % 겹치는 경우에도 최소 대기 시간은 1 초입니다. FFT와 다른 프로세싱은 이것에 추가 될 것이지만, 바라건대 상당한 양의 (그렇지 않다면 더 빠른 FFT 라이브러리 사용). 이 대기 시간을 줄일 수있는 유일한 방법은 주파수 해상도를 희생시키는 것입니다.

+0

이것은 내가 두려워했던 것입니다. 어떤 사람들은 해상도를 높이기 위해 FFT 입력으로 0의 보간법을 사용했지만 더 적은 수의 샘플을 사용하려고 시도했다고 생각합니다. 나는 그것을 시험해보고 그것이 어떻게 작동하는지 볼지도 모르지만, 나는 그것만으로 해결책이되지 않을 것이라고 생각한다. – nihilo90

+1

0으로 채우는 것이 더 이상 * 정확도 *를주지는 않지만, 주파수 도메인 데이터를 보간하여 좀 더 뚜렷한 해상도를 얻을 수 있습니다. 그러나 이는 실제로 단지 외관상의 것입니다. 너무 가까워서 해결할 수는 없습니다 샘플링 속도에 따라, 즉 아무데도 정보를 얻을 수 없습니다. 다른 접근법이있을 수 있기 때문에 당신이하려고하는 것에 대한 높은 수준의 아이디어를 주면 도움이 될 것입니다. –

+0

저는 프로젝트에 대한 더 많은 정보를 가지고 질문을 편집했습니다. 제로 패딩 (zero padding)이 적용되는 한, 특정 주파수 범위에만 관심이 있다면 차이가 있습니까? 또한 이러한 보간 된 점에 대해 주변 bin을 평균하면 고려해야 할 점이 있습니까? – nihilo90

1

FFT 방법을 사용하면 시간 - 주파수 트레이드 오프가 발생합니다. 대기 시간을 줄이려면 적은 양의 데이터를 사용해야합니다. FFT (짧거나 제로 패딩 된 경우)는 덜 정확한 주파수 추정을 제공합니다.

제로 패딩은 고품질 보간만을 제공합니다. 그러나 이것은 더 짧은 FFT의 피크 bin의 중심을 사용하는 것보다 더 나은 피크 주파수 추정을 제공 할 수 있습니다.