webrtc 에서 의 소음 억제 의 세 가지: 신호 존재 확률 을 바탕 으로 하 는 순환 평균 소음 평가
위 에서 아래로 이어받다
위의 글 에서 webrtc 에서 현재 프레임 을 이용 하여 STFT 를 통 해 주파수 폭 을 얻 고 quentile 알고리즘 과 결합 하여 초기 소음 평 가 를 먼저 진행 하 였 으 나 아직 끝나 지 않 았 다. 그 다음 에 이 추정 소음 과 주파수 폭 을 이용 하여 Computesnr 에 가 져 와 선험 소음 비 와 후 험 소음 비 를 계산 하 였 다. 1. 선험 소음 비 추정 치 는 이전 프레임 을 통 해 저 장 된 진폭 (소음 제거 되 지 않 음) 이다.최종 소음 추정 값 과 평활 인 자 를 곱 하면 평활 인 자 는 비 나 필터 의 이득 이다.2. 후 검 신호 비 는 현재 프레임 주파수 진폭 과 quantile 이 추산 한 소음 을 이용 하여 얻 은 것 이다.3. 마지막 으로 DD (Directed decision) 를 사용 하여 선험 소음 비 를 업데이트 합 니 다.이 DD 는 선험 소음 비 를 추산 하 는 방법 이다.
다음은 현재 프레임 의 feature 를 업데이트 하고 음성 발생 확률 을 계산 해 야 합 니 다. 이 확률 에 따라 소음 평 가 를 업데이트 하고 음성 확률 에 대한 분석 은 이 절 에서 전개 되 지 않 습 니 다. 중점적으로 주목 하 는 것 은 UpdateNoiseEstimate 라 는 함수 가 하 는 일 입 니 다.
static void UpdateNoiseEstimate(NoiseSuppressionC* self,
const float* magn,
const float* snrLocPrior,
const float* snrLocPost,
float* noise) {
size_t i;
float probSpeech, probNonSpeech;
// Time-avg parameter for noise update.
float gammaNoiseTmp = NOISE_UPDATE;
float gammaNoiseOld;
float noiseUpdateTmp;
for (i = 0; i < self->magnLen; i++) {
probSpeech = self->speechProb[i];
probNonSpeech = 1.f - probSpeech;
// Temporary noise update:
// Use it for speech frames if update value is less than previous.
noiseUpdateTmp = gammaNoiseTmp * self->noisePrev[i] +
(1.f - gammaNoiseTmp) * (probNonSpeech * magn[i] +
probSpeech * self->noisePrev[i]);
// Time-constant based on speech/noise state.
gammaNoiseOld = gammaNoiseTmp;
gammaNoiseTmp = NOISE_UPDATE;
// Increase gamma (i.e., less noise update) for frame likely to be speech.
if (probSpeech > PROB_RANGE) {
gammaNoiseTmp = SPEECH_UPDATE;
}
// Conservative noise update.
if (probSpeech < PROB_RANGE) {
self->magnAvgPause[i] += GAMMA_PAUSE * (magn[i] - self->magnAvgPause[i]);
}
// Noise update.
if (gammaNoiseTmp == gammaNoiseOld) {
noise[i] = noiseUpdateTmp;
} else {
noise[i] = gammaNoiseTmp * self->noisePrev[i] +
(1.f - gammaNoiseTmp) * (probNonSpeech * magn[i] +
probSpeech * self->noisePrev[i]);
// Allow for noise update downwards:
// If noise update decreases the noise, it is safe, so allow it to
// happen.
if (noiseUpdateTmp < noise[i]) {
noise[i] = noiseUpdateTmp;
}
}
} // End of freq loop.
}
함수 자체 가 간결 하 게 쓰 여 져 있 습 니 다. 첫 번 째 주파수 분량 을 초기 화 합 니 다. 기본 설정 NOISEUPDATE, 이 평활 인자 에 따라 현재 프레임 noise UpdateTmp 를 계산 합 니 다. 음성 확률 이 문턱 을 초과 하면 평활 인자 SPEECHUPDATE 는 noise UpdateTmp 를 다시 계산 합 니 다.(중간 에 magnAvgPause 를 계산 하 는 과정 을 삽입 하여 음성 발생 확률 계산 에 사용 합 니 다) 마지막 으로 초기 에 설 정 된 부 드 러 운 인자 의 변화 여부 에 따라 소음 에서 부 드 럽 게 계산 하 는 소음 평가 인지, 아니면 두 번 의 계산 결과 의 최소 치 를 취하 여 업데이트 할 지 결정 합 니 다.이 알고리즘 은 두 번 째 순환 부터 부 드 러 운 인자 업 데 이 트 는 인접 주파수 음성 확률 로 결정 되 며 이 방법 은 근접 주파수 상관 성 원칙 을 한층 더 활용 한다.우 리 는 앞에서 소음 비 계산 이 STSA (short - time spectral amplitude) 방법 을 이용 하 는 것 이 라 고 언급 한 적 이 있 지만 구체 적 으로 어떤 준칙 을 사용 합 니까?비교적 유행 하 는 paper, MMSE, OMLSA, IMCRA 를 찾 아 보 는 것 은 webrtc ns 가 사용 하 는 것 입 니까?다음은 먼저 STSA 구조 아래 의 몇 가지 적응 준칙 을 알 아 보 겠 습 니 다.
MMSE-Minimum Mean-Square Error
이 방법 은 'Speech Enhancement Using a Minimum Mean - Square Error Short - Time Spectral Amplitude Estimator' 에서 나 온 것 으로 이 알고리즘 은 고 스 통계 모델 의 가설 을 바탕 으로 일련의 복잡 한 추론 을 통 해 A k ^ =Γ ( 1.5 ) v k γ k M ( − 0.5 ; 1 ; − v k ) R k \hat{A_k}=\Gamma(1.5) \frac{\sqrt{v_k}}{\gamma_k} M(-0.5;1;-v_k)R_k Ak^=Γ(1.5)γk vk M (- 0.5; 1; - vk) Rk 여기 서 R k R 만 강조 합 니 다.k Rk 는 현재 프레임 주파수 k k k 의 푸 립 엽 변환 계수 이 고 A k ^ \ hat {A k} Ak ^ 는 R k Rk Rk 가 계산 한 추정 치.
LSA-Log Spectral Amplitude
또 하 나 는 스펙트럼 추정 방법의 MMSE (MMSE - LASA) 로 추정 공식 인 A k ^ =ξ k 1 + ξ k e x p [ 1 2 ∫ 0 ∞ e − t t d t ] R k \hat{A_k}=\frac{\xi_k}{1+\xi_k} exp[\frac{1}{2}\int_0^\infty {\frac{e^{-t}}{t}} \,{\rm d}t]R_k Ak^=1+ξkξkexp[21∫0∞te−tdt]Rk
MCRA-Minima Controlled Recursive Averaging
만약 에 현재 추정 되 는 음성 출현 확률 이 p (k, t) p (k, t) p (k, t) 라면 그 중에서 k 표지 부 립 엽 주파수 계수, t 표지 현재 프레임 은 소음 추정 을 업데이트 할 수 있다.λ d ^ ( k , t + 1 ) \hat{\lambda_d}(k,t+1) λd^(k,t+1): λ d ^ ( k , t + 1 ) = λ d ^ ( k , t ) p ( k , t ) + [ α d λ d ^ ( k , t ) + ( 1 − α d ) ∣ Y ( k , t ) ∣ 2 ] ( 1 − p ( k , t ) ) \begin{aligned} \hat{\lambda_d}(k,t+1)&=\hat{\lambda_d}(k,t)p(k,t)+[\alpha_d\hat{\lambda_d}(k,t)+(1-\alpha_d)|Y(k,t)|^2](1-p(k,t)) \end{aligned} λd^(k,t+1)=λd^(k,t)p(k,t)+[αdλd^(k,t)+(1−αd) 8739 ° Y (k, t) 8739 ° 2] (1 − p (k, t) 라 는 글 에서 두 가지 방법 을 제시 했다.
그러나 앞의 방법의 개선 이기 때문에 공식 을 열거 하지 않 겠 다.여기 서 우 리 는 MCRA 와 일치 도가 가장 높다 고 느낀다. 그러면 소음 평가 방법 을 공식 으로 추상 화 해 보 자.λ d ^ ( k , t + 1 ) = λ d ^ ( k , t ) γ d ( k , t ) + ( 1 − γ d ( k , t ) ) [ ( 1 − p ( k , t ) ) ∣ Y ( k , t ) ∣ + p ( k , t ) λ d ^ ( k , t ) ] \begin{aligned} \hat{\lambda_d}(k,t+1)&=\hat{\lambda_d}(k,t)\gamma_d(k,t)+(1-\gamma_d(k,t))[(1-p(k,t))|Y(k,t)|+p(k,t)\hat{\lambda_d}(k,t)] \end{aligned} λd^(k,t+1)=λd^(k,t)γd(k,t)+(1−γd(k,t))[(1−p(k,t))∣Y(k,t)∣+p(k,t)λd ^ (k, t)] 여기 있 는γ d ( k , t ) \gamma_d(k,t) γd (k, t) 도 부 드 러 운 인자 이지 만 이 부 드 러 운 인 자 는 음성 / 비 음성 에 따라 변 하고 임 주파 (저주파 - > 고주파) 의 영향 을 받는다.보기 편 하도록 바로 바꾸다α d \alpha_d αd。비교 해 보다λ d ^ ( k , t + 1 ) = λ d ^ ( k , t ) α d + ( 1 − α d ) [ ( 1 − p ( k , t ) ) ∣ Y ( k , t ) ∣ + p ( k , t ) λ d ^ ( k , t ) ] \begin{aligned} \hat{\lambda_d}(k,t+1)&=\hat{\lambda_d}(k,t)\alpha_d+(1-\alpha_d)[(1-p(k,t))|Y(k,t)|+p(k,t)\hat{\lambda_d}(k,t)] \end{aligned} λd^(k,t+1)=λd^(k,t)αd+(1−αd)[(1−p(k,t))∣Y(k,t)∣+p(k,t)λd ^ (k, t)] 비교적 재 미 있 는 부분 은 부 드 러 운 인자 와 음성 확률 이 포 함 된 방식 으로 바 뀌 었 다. 중심 사상 은 모두 이 두 인자 로 자가 적응 하 기 를 원 하 는 추적 소음 일 것 이다.
다시 비 나 필터 로 돌아 가기
사실 비 나 필터 함수 인 Computed Based WienerFilter 는 계산 소음 비 함수 인 ComputeSner 와 매우 비슷 하 며, 마지막 으로 얻 은 이득 도 매우 간단 한 공식 적 인 세트 로 첫 번 째 블 로그 에 이미 논술 되 었 기 때문에 webrtc 에 서 는 간단 한 비 나 필터 방법 일 뿐 MMSA LSA 등 방법 을 도입 하지 않 은 것 으로 추정 된다.소음 추정 때 도 VAD 의 하 드 코어 전략 을 피하 기 위해 소프트 판결 전략 을 채택 했다.
작은 매듭
웹 rtc 의 코드 에서 한 바퀴 마음껏 돌아 알고리즘 의 기본 원 리 를 대체적으로 파악 한 다음 에 마지막 보루 로 들 어가 음성 소음 확률 을 예측 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
webrtc 에서 의 소음 억제 의 세 가지: 신호 존재 확률 을 바탕 으로 하 는 순환 평균 소음 평가음성 확률 이 문턱 을 초과 하면 평활 인자 SPEECHUPDATE 는 noise UpdateTmp 를 다시 계산 합 니 다.(중간 에 magnAvgPause 를 계산 하 는 과정 을 삽입 하여 음성 발생 확률 계산...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.