사운드 레벨을 감지하고 설정에서 설정된 레벨보다 높으면 작성해야하는 작은 프로그램을 작성합니다. portaudio를 통해 캡처하고 libvorbis를 통해 압축하지만 프로그램의 한 부분은 미완성이고 내가 그것에 붙어, 난 원시 pcm 데이터의 소리 수준을 감지해야합니다, 내가 어떤 pcm 데이터의 나쁜 이해가 어떤 오디오 분석/처리 알고리즘을 알지 못한다, 우리는 그것을 할 수있는 기존의 C/C + + 라이브러리가 무엇입니까? 또는 c/C++에서 구현할 수있는 간단한 알고리즘이 있습니까?원시 pcm 데이터의 사운드 레벨을 감지합니다.
답변
Speex 및 WebRTC 라이브러리를 살펴보십시오. 둘 다 음성 활동 감지기가 있습니다. 사운드 레벨 측정을 원한다면 선형 또는 로그 레벨 표시기를 결정해야합니다. PCM의 일반적인 형식은 -32768 ~ 32767 범위 (16 비트 길이)입니다 ... 간단하게 할 수있는 것은 한 기간에 샘플의 절대 값을 합산하고 평균을 구하기 위해 샘플 수로 나누는 것입니다 수준.
"사운드 레벨"을 정의하는 방법에 따라 달라지며, 이는 피크를 감지하는 것처럼 간단 할 수 있으며 다음과 같은 산업 표준/소리 크기를 얻는 방법에 대해 더 복잡한 것입니다.
PCM 데이터는 일반적으로 부호있는 값의 스트림입니다. 8 비트 PCM의 경우 0x00..0xFF, 16 비트 PCM의 경우 -0x8000 .. + 0x7FFF 또는 부동 소수점 값의 경우 -1.0 .. + 1.0 .
가장 쉬운 방법은 주어진 시간 프레임에 대한 최대 절대 값을 찾아 간단한 피크를 검출하는 것입니다. 나중에 log10
을 적용하여 데시벨로 변환 할 수 있습니다.
현재 시간 프레임 동안 최대 값을 찾고 있습니다. 하지만 이것은 거의 사용할 수없는 나쁜 작품 – sss123next
16 비트 48khz pcm에 서명했습니다. 48000 개의 샘플을 합하여 레벨과 비교해야한다는 것을 알고 있습니까? 1 초 만에 레벨을 감지 할 수 있을까요? – sss123next
확실한 시간대를 선택할 수 있습니다. 1 초가 적당합니다. > 절대 값을 합산하는 것을 잊지 마십시오. – mark
나는 시도하고 회신 할 것입니다. – sss123next