이것은 다시 코골이 탐지기입니다.
나는 신호가있을 때 신호를 감지하는 데 상당히 능숙 해졌습니다. 벽을 막는 코골이에서 녹음까지들을 수없는 호흡까지 추적 할 수 있습니다. 문제는 신호가 감지 가능한 수준 아래로 떨어졌을 때 알 수 없으며 앱이 "청력"이라는 것입니다. 불행히도, 코골이 / 호흡은 종종 간단한 자기 상관 또는 유사한 간격 타이밍 체계가 도움이되지 않을 정도로 불규칙합니다. (그리고 실제로는 소음보다 호흡이 더 규칙적 일 수 있습니다.)
신호가 없을 때 알아 내기 위해 누락 된 트릭이 있습니까? "시그널"이 너무 소음이 난다는 점을 감안할 때, 나는 여기서 어려운 장소에 직면하고있는 것 같습니다.
(그리고 이것은 내가 겪고있는 또 다른 문제와 관련이있을 수 있습니다. 이상하게도, 나는 상당히 큰 경우에도 신호 레벨을 정확하게 (또는 대략) 측정 할 수 없습니다. 어쨌든 신호를 감지하기 위해 롤링 평균과 비율을 사용해야하기 때문에, 레벨 정보의 종류가 손실됩니다. 재구성 할 요령을 찾고 있습니다.)
기본 기술
(요다)
오디오 신호가 샘플링되며 (일반적으로 8000Hz에서 다양한 이유로) 1024 블록으로 FFT됩니다. (내 실험에서 해밍 필터와 겹치는 블록은 효과가 거의없는 것 같지만 나중에 다시 검토 할 수 있습니다.)
FFT는 "밴드"(현재 5 개, 로우 엔드에 대한 자세한 내용을 위해 약간 비뚤어진 크기)로 나뉘며 각 밴드의 "스펙트럼 차이"와 레벨이 합산됩니다. 피크 제한 값의 장기 평균은 "임계 값"으로 사용되며 추가 바이어스 조정은 약 20 % "임계 값 초과"속도를 유지하는 데 사용됩니다.
각각의 "임계 값 초과"값은 1의 가중치를 부여 받지만 (임계 값은 0의 가중치를 부여 함), 그 가중치는 밴드에 더 많은 가중치를 부여하기 위해 밴드에서 명백한 "가변성"(대략 2Hz)에 의해 조정됩니다. 보다 명백한 신호를 전달합니다.
밴드의 가중치가 합산 된 후 후속 블록의 합산 된 가중치가 약 1 초에 걸쳐 합산되어 "점수"를 생성합니다. 이는 코골이 시작 / 오프셋을 감지하기 위해 실행 평균 임계 값 (및 여러 휴리스틱)과 다시 비교됩니다.
최신 정보
내 알고리즘이 신호 레벨 문제에 따라 일정한 레벨의 신호를 효과적으로 유지하는 경우 SNR을 효과적으로 측정하는 방법은 신호가 없을 때 노이즈를 측정하는 것입니다.
편리하게는, 코골이 사이에 "죽은 공기"가 많은 간헐적입니다. 그리고 나는 이미 코골이 봉투를 감지하고 있습니다. 따라서 엔벌 로프 외부 (한 코의 끝과 다음 코의 시작 사이)는 잡음이있을 수 있습니다. 이것은 (약간의 정도의 정확성 / 반복성으로) 측정 할 수 있습니다. (물론 반은 괜찮은 알고리즘을 만들어 내기 위해 세 번의 시도가 필요했습니다. 현실은 결코 이론과 일치하지 않습니다.)
아직 정답은 없지만 진전을 보였습니다.
(위의 기술은 SNR에 대해 상당히 좋은 프록시를 제공하지만 실제 신호 레벨을 추정하는 데 여전히 문제가 있습니다. 내 "상대적 레벨"표시는 간신히들을 수있는 호흡을 위해 스케일을 벗어날 수 있으며, 따라서 윈도우 래틀 러 (ratr)의 경우에는 그렇지 않습니다. 절대 수준을 위해서는 일종의 프록시가 필요합니다.)