2013-10-17 5 views
0

실시간 노이즈 감소를 수행하는 Android 프로그램을 작성하려고합니다. 전체 소스 코드가 너무 길지만 요점은 다음과 같습니다.
마이크 -> FFT -> 노이즈 감소 및 게인 계산 -> IFFT -> 스피커
중간에 노이즈 감소 기능을 사용하지 않으면 스피커는 마이크에서 입력됩니다. 이 경우 소리가 분명합니다. 하지만 소음 감소 기능을 사용하면 실제 소음 감소가 작동하는 것처럼 보입니다. 시작하는 진공 청소기에서 나오는 소리가 억제되고 나 주변 사람들의 말을들을 수 있기 때문입니다. 그러나 출력이 왜곡 된 것 같습니다. 이 왜곡 중 일부는 노이즈 감소 알고리즘 자체로 인해 발생할 수 있습니다. 그러나 사운드를주의 깊게 들으면 사운드가 마치 "프레임 건너 뛰기"처럼 자갈 형의 왜곡을 볼 수 있습니다. 사운드에 적용하기 위해 구현 한 다른 유형의 디지털 필터를 사용한 실험을 통해 FFT, IFFT 및 노이즈 감소 기능에 필요한 매우 긴 for 루프로 인해 이러한 현상이 발생하고 있음을 알았습니다. 프로그램이 for 루프에 걸려있는 동안이 시간 동안 스피커에서 출력이 없기 때문입니다. 많은 for 루프가 있기 때문에,이 파손은 눈에 띄며 출력은 자갈처럼 들립니다.(Android의 경우) 많은 스레드가있는 루프에서 속도가 빨라짐

속도를 높여 프로그램이 for 루프에서 가능한 적은 시간을 보내는 방법이 있습니까? 다른 종류의 루프가 달라질 수 있습니까? 어떻게 든 독립적 인 부분으로 노이즈 감소 기능을 측면에서 조작을 분해하고 별도의 스레드로 계산하면 왜곡 제거에 도움이 될까요? 아니면 스레드 수를 늘리면 비슷한 문제가 발생합니까?

답변

0

해상도를 낮추면 가능한 모든 작업을 인라인으로 진행하십시오. 자바에서는 실제로 실시간 작업을 느리게 할 수 있으므로 일찍 할당하고 다시 사용하십시오.

그 외의 경우 느린 경우 속도가 느려집니다.

또한 루프 내부의 속도를 높이거나 프로파일 링하여 병목 현상을 줄일 수 있습니다.

+0

자바에서도 인라인 기능을 사용할 수 있습니까? – user13267

+0

@ user13267 : 예/아니요. 일반적인 Java (특히 서버 JVM)에서는 JVM이 인라인에 신경을 써도 상관하지 않습니다. 안드로이드 JVM은 똑똑하지 않습니다, 옵티마이 저는 훨씬 약합니다 (최신 버전에서는 더 좋아집니다). 인라인 할 수는 있지만 그렇게 잘되지는 않습니다. 따라서 여러분에게 달려 있습니다. – maaartinus

+0

인라인으로 말하자면 루프를 풀어 두는 것 뿐이며 분명히 필요하지는 않습니다. 나는 GC에 초점을 맞추고 최적화 할 코드를 프로파일 링합니다. – HaMMeReD

0

입력 및 필터링 된 소리 사이의 고정 대기 시간을 예상합니다. 각 프레임의 처리 시간은 다를 수 있으므로 처리 된 부분은 즉시 보내지 말고, 예정된 시간이되면 출력으로 보내야합니다.

+0

출력은 항상 입력에 비해 약간 지연됩니다. 나는 이것이 피할 수없는 것이라고 생각합니다. 그러나 과도한 for 루프로 인해 발생한다고 생각되는 출력의 연속 사운드에는 "파손"이있는 것 같습니다. – user13267

+0

각 프레임마다 지연을 동일하게 만들어야하므로 피할 수는 없습니다. 현재 "파손"은 지연이 동일하지 않기 때문입니다. –

관련 문제