Algoritmo de supresión de ruido (NS) de WebRTC

El algoritmo central de supresión de ruido WebRTC se encuentra en el archivo ns_core.c.

El espectro de ruido se puede estimar usando, por ejemplo, la función de probabilidad de voz/ruido. Clasifica cada cuadro recibido de componentes de señal y frecuencia como ruido o voz.

Principio del algoritmo

La idea central de este algoritmo es utilizar el filtro Wiener para suprimir el ruido estimado .

En la fórmula anterior, x y n representan el habla y el ruido respectivamente, e y representa la señal recogida por el micrófono.

Su relación espectral es la anterior. Se puede ver en la figura anterior que el habla y el ruido tienen una relación aditiva y no correlacionada. Para relaciones no aditivas, se pueden usar algoritmos como AEC para suprimir diferentes escenarios. Según la definición del límite central, generalmente se cree que la distribución del ruido y del habla obedecen a la distribución normal con una media de 0 y una varianza de ui. Pero también está la adopción y la distribución.

Entonces, la idea central aquí es estimar el ruido N de Y y luego suprimir N para obtener el habla, es decir:

Por lo tanto, la precisión de la estimación del ruido es crucial. Cuanto más precisa sea la estimación del ruido, mejores serán los resultados, lo que da lugar a varios métodos más para estimar el ruido.

1. Estimación de ruido basada en la detección de VAD. VAD detecta Y. Si no hay voz en la detección, se considera ruido. Este es un método de estimación de ruido.

2. Basándose en el principio del espectro de amplitud global mínimo, esta estimación considera que la situación con el espectro de amplitud mínimo debe corresponder al momento en que no hay habla.

3. También existen métodos de estimación de ruido basados ​​en el principio de descomposición matricial de valores singulares.

webRTC no utiliza el método anterior, pero mejora la función de relación de probabilidad (este método se usa en la detección de VAD) y fusiona múltiples características de clasificación de voz/ruido en un modelo para formar una función de densidad de probabilidad integral de múltiples características. se analiza. Puede suprimir eficazmente el ruido de ventiladores/equipos de oficina, etc.

El proceso de supresión es el siguiente:

Para cada cuadro de señal de voz ruidosa recibida, según la estimación de ruido inicial del cuadro, defina la función de probabilidad de voz, mida las características de clasificación de cada cuadro de señal ruidosa y utilice las características de clasificación medidas para calcular cada cuadro. probabilidad de voz característica, la probabilidad de voz calculada se pondera por factores dinámicos (características de clasificación de señal y parámetros de umbral) y, en función de la probabilidad de voz calculada basada en características de cada cuadro, se modifica la función de probabilidad de voz de cada cuadro en el cuadro múltiple. ., y actualizar la estimación del ruido inicial (ruido cuantil para cada fotograma en múltiples fotogramas consecutivos) en cada fotograma utilizando la función de probabilidad de voz por fotograma modificada.

 

La función de probabilidad de voz basada en características se obtiene utilizando una función de mapeo (sigmoide/tanh, también conocida como función S, comúnmente utilizada como función semilla en algoritmos de clasificación de neuronas) para mapear las características de clasificación de señales de cada cuadro a un valor de probabilidad.

Las características de clasificación incluyen: índice de probabilidad medio a lo largo del tiempo, una medida de planitud espectral y una medida de diferencia de máscara espectral. La medición de la diferencia de máscara espectral se basa en la comparación del espectro de la señal de entrada con el espectro de ruido de la máscara.

 

Análisis de señales: pasos de preprocesamiento que incluyen almacenamiento en búfer, ventanas y transformada discreta de Fourier (DFT)

La estimación y el filtrado del ruido incluyen: estimación del ruido inicial, actualización guiada por decisiones (DD) de la SNR anterior y posterior, determinación de la probabilidad de habla/ruido basada en factores de índice de probabilidad (LR), que utiliza la SNR anterior y posterior, así como la probabilidad del habla. Modelos de función de densidad (HF) (como gaussiano, operador laplaciano, gamma, supergaussiano, etc.), además de actualizar y aplicar dimensionalidad basada en el modelado de características y la estimación de ruido, determinada por la probabilidad determinada por el filtro de nanoganancia.

Síntesis de señal: Transformada discreta inversa de Fourier, escalado y síntesis de ventana.

 

La estimación de ruido inicial se basa en la estimación de ruido cuantil. La estimación del ruido está controlada por el parámetro cuantil, denominado q. La estimación de ruido determinada a partir del paso de estimación de ruido inicial sólo puede usarse como condición inicial para facilitar procesos posteriores de actualización/estimación de ruido.

set_feature_extraction_parameters

Se establecen los parámetros utilizados para la extracción de características. El algoritmo de supresión de ruido WebRTC actual utiliza los tres indicadores de característica LRT/planicidad del espectro y diferencia de espectro, y no utiliza las dos características de entropía del espectro y varianza del espectro.

Núcleo WebRtc Ns_Init

Se inicializa el módulo NS (supresión de ruido) y el siguiente código se analiza de acuerdo con fs = 8000.

 

[cpp]  ver  copia simple

  1. //La longitud de los datos de voz, la cantidad de datos de 8k/10ms es 80  
  2. self->blockLen = 80;  
  3. //Analiza la longitud. Dado que se analiza en el dominio de la frecuencia, la longitud se eleva a la potencia de 2. El valor mínimo es 128, que en realidad es la longitud de fft.  
  4. auto->análisis = 128;  
  5. // Función de ventana, utilizando la función de ventana plana híbrida de Hanning  
  6. self->ventana = kBlocks80w128;  

Inicializar miembros de almacenamiento relacionados utilizados por FFT

 

 

[cpp]  ver  copia simple

  1.   // Inicializa las matrices de trabajo FFT.  
  2.   auto->ip[0] = 0; // Establecer esto desencadena la inicialización.  
  3.   memset(self->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);  
  4.   WebRtc_rdft(self->anaLen, 1, self->dataBuf, self->ip, self->wfft);  
  5.   
  6. //Es una ventana de análisis deslizante. Para un fft de 80 puntos y 128 puntos, los datos de 128-80=48 puntos del cuadro anterior se conservarán cada vez, en lugar de simplemente llenar 80 puntos con 0 y convertirlos en 128 puntos por fft.  
  7. //Pero esto causará problemas de síntesis y las ventanas generalmente se usan para evitar mutaciones causadas por la superposición. Puede utilizar la misma función de ventana que la transformación fft. Pero esto requiere un mapeo de la función de ventana que preserve la energía, es decir, superponer  
  8. //La suma de los cuadrados de las ventanas parciales debe ser 1.  
  9.  memset(self->analyzeBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);  
  10. //dataBuf almacena la señal original en el dominio del tiempo  
  11.   memset(self->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);  
  12. //syntBuf es una resta espectral, que transforma la señal al dominio del tiempo después de restar el ruido.  
  13.   memset(self->syntBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);  
  14.   
  15.   // Para procesamiento HB. Esta es la parte de alta frecuencia, con hasta dos bandas.  
  16.   memset(self->datosBufHB,  
  17.          0,  
  18.          tamaño de (flotante) * NUM_HIGH_BANDS_MAX * ANAL_BLOCKL_MAX);  

Inicializar variables utilizadas para la estimación cuantil

 

 

[cpp]  ver  copia simple

  1.   // Para estimación de ruido cuantil.  
  2.   memset(self->quantile, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  3. // Estimación de sincronización de 3 cuadros, lquantile es el cuantil logarítmico. La densidad es la densidad de probabilidad, que se utiliza para calcular cuantiles.  
  4.  para (i = 0; i < SIMULT * HALF_ANAL_BLOCKL; i++) {  
  5.     self->lcuantil[i] = 8.f;  
  6.     auto->densidad[i] = 0.3f;  
  7.   }  
  8.   
  9.   for (i = 0; i < SIMULTADO; i++) {  
  10. // Según tengo entendido, el contador es un peso que representa la proporción de cada cuadro con respecto a la estimación cuantil.  
  11.   uno mismo->contador[i] =  
  12.         (int)floor((flotante)(END_STARTUP_LONG * (i + 1)) / (flotante)SIMULT);  
  13.   }  
  14.   
  15.   auto->actualizaciones = 0;  

Inicialización del filtro Wiener

 

 

[cpp]  ver  copia simple

  1. para (yo = 0; yo <HALF_ANAL_BLOCKL; yo++) {  
  2.   self->suave[i] = 1.f;  
  3. }  

Establecer la agresividad de la supresión de ruido.

 

 

[cpp]  ver  copia simple

  1. // Establece la agresividad: predeterminada.  
  2. self->aggrMode = 0;  


Usos de la estimación de ruido

 

 

[cpp]  ver  copia simple

  1. // Inicializa variables para el nuevo método.  
  2. self->priorSpeechProb = 0.5f; // Problema previo de habla/ruido.  
  3. // Anterior analizar espectro magnético.  
  4. memset(self->magnPrevAnalyze, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  5. // Espectro magnético del proceso anterior.  
  6. memset(self->magnPrevProcess, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  7. // Espectro de ruido actual.  
  8. memset(self->ruido, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  9. // Espectro de ruido anterior.  
  10. memset(self->noisePrev, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  11. // Estimación conservadora del espectro de ruido.  
  12. memset(self->magnAvgPause, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  13. // Para estimación de HB en segunda pasada.  
  14. memset(self->speechProb, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  15. // Espectro de magnitud promedio inicial.  
  16. memset(self->initMagnEst, 0, sizeof(float) * HALF_ANAL_BLOCKL);  
  17. para (yo = 0; yo <HALF_ANAL_BLOCKL; yo++) {  
  18.   // Smooth LR (igual que el umbral).  
  19.   self->log LrtTimeAvg[i] = LRT_FEATURE_THR;  
  20. }  

Cantidad de características, utilizada para calcular el ruido.

 

 

[cpp]  ver  copia simple

  1.   // Cantidades de características.  
  2.   // Planicidad espectral (comienza en el umbral).  
  3.   self->featureData[0] = SF_FEATURE_THR;  
  4.   self->featureData[1] = 0.f; // Entropía espectral: no utilizada en esta versión.  
  5.   self->featureData[2] = 0.f; // Varianza espectral: no utilizada en esta versión.  
  6.   // Factor LRT promedio (comienza en el umbral).  
  7.   self->featureData[3] = LRT_FEATURE_THR;  
  8.   // Diferencia de plantilla espectral (comienza en el umbral).  
  9.   self->featureData[4] = SF_FEATURE_THR;  
  10.   self->featureData[5] = 0.f; // Normalización para diferencia espectral.  
  11.   // Ventana de tiempo promedio del espectro de magnitud de entrada.  
  12.   self->featureData[6] = 0.f;  
  13.   
  14.   // Cantidades de histograma: se utilizan para estimar/actualizar umbrales de características.  
  15.   memset(self->histLrt, 0, sizeof(int) * HIST_PAR_EST);  
  16.   memset(self->histSpecFlat, 0, sizeof(int) * HIST_PAR_EST);  
  17.   memset(self->histSpecDiff, 0, sizeof(int) * HIST_PAR_EST);  
  18.   
  19.   // Actualizar indicador para parámetros:  
  20.   // 0 sin actualización, 1 = actualizar una vez, 2 = actualizar cada ventana.  
  21.   self->modelUpdatePars[0] = 2;  
  22.   self->modelUpdatePars[1] = 500; // Ventana de actualización.  
  23.   // Contador de actualización del espectro de ruido conservador.  
  24.   self->modelUpdatePars[2] = 0;  
  25.   // Contador si los umbrales de características se actualizan durante la secuencia.  
  26.   self->modelUpdatePars[3] = self->modelUpdatePars[1];  

Ruido blanco y ruido rosa.

 

 

[cpp]  ver  copia simple

  1. self->señalEnergía = 0,0;  
  2. self->sumMagn = 0.0;  
  3. self->whiteNoiseLevel = 0.0;  
  4. self->pinkNoiseNumerator = 0.0;  
  5. self->pinkNoiseExp = 0.0;  

 

Calcular la planitud espectral

Cálculo de la planitud espectral, este algoritmo supone que el habla tiene más armónicos que ruido. El espectro del habla tiende a tener picos en la frecuencia fundamental (tono) y armónicos, mientras que el espectro del ruido es relativamente plano. Por tanto, sirve como característica que distingue el ruido del habla.

Al calcular el grado espectral, N representa el número de puntos de frecuencia después de STFT, B representa el número de bandas de frecuencia, K es el índice de puntos de frecuencia y j es el índice de banda de frecuencia. Cada banda de frecuencia incluye una gran cantidad de puntos de frecuencia. Los 128 puntos de frecuencia se pueden dividir en 4 bandas de frecuencia (banda baja, banda de frecuencia media-baja, banda de frecuencia media-alta y frecuencia alta), cada banda de frecuencia tiene 32 puntos de frecuencia. Para el ruido, la planitud es grande y constante, mientras que para el habla, la cantidad calculada es baja y variable.

 

[cpp]  ver  copia simple

  1. // Calcular la planitud espectral en el espectro de entrada.  
  2. // |magnIn| es el espectro de magnitudes.  
  3. // La planitud espectral se devuelve en self->featureData[0].  
  4. vacío estático ComputeSpectralFlatness (NoiseSuppressionC* self,  
  5.                                     flotador constante* magnIn) {  
  6.   tamaño_t i;  
  7.   tamaño_t shiftLP = 1; // Opción para eliminar los primeros contenedores de las medidas espectrales.  
  8.   float avgSpectralFlatnessNum, avgSpectralFlatnessDen, spectralTmp;  
  9.   
  10.   // Calcular medidas espectrales.  
  11.   // Para planicidad.  
  12.   avgSpectralFlatnessNum = 0,0;  
  13.   avgSpectralFlatnessDen = self->sumMagn;  
  14.   para (i = 0; i < shiftLP; i++) {   
  15. // Omita el primer punto de frecuencia, es decir, el punto de frecuencia de CC. Den es la abreviatura de denominador (denominador), y avgSpectralFlatnessDen se utiliza en el cálculo del denominador de la fórmula anterior.  
  16.     avgSpectralFlatnessDen -= magnIn[i];  
  17.   }  
  18.   // Calcular el registro de la relación entre la media geométrica y la aritmética: verificar el caso log(0).  
  19.   // Calcule la parte del numerador, numerador (numerador), que es un valor infinitesimal para log (0), por lo que esta situación se trata especialmente durante el cálculo.  
  20.   for (i = shiftLP; i < self->magnLen; i++) {  
  21.     si (magnIn[i] > 0.0) {  
  22.       avgSpectralFlatnessNum += (float)log(magnIn[i]);  
  23. } demás {  
  24. //TVAG es la abreviatura de promedio de tiempo, que se utiliza para tratar anomalías energéticas. Utilice la planitud anterior para promediar y devolver directamente.  
  25.       self->featureData[0] -= SPECT_FL_TAVG * self->featureData[0];  
  26.       devolver;  
  27.     }  
  28.   }  
  29.   // Normalizar.  
  30.   avgSpectralFlatnessDen = avgSpectralFlatnessDen / self->magnLen;  
  31.   avgSpectralFlatnessNum = avgSpectralFlatnessNum / self->magnLen;  
  32.   
  33.   // Relación y registro inverso: verifique el caso de log(0).  
  34.   spectralTmp = (float)exp(avgSpectralFlatnessNum) / avgSpectralFlatnessDen;  
  35.   
  36.   // Actualización promedio de tiempo de la característica de planicidad espectral.  
  37.   self->featureData[0] += SPECT_FL_TAVG * (spectralTmp - self->featureData[0]);  
  38.   // Hecho con característica de planitud.  
  39. }  

 

Calcular la diferencia espectral

Otra suposición sobre el espectro de ruido es que el espectro de ruido es más estable que el espectro del habla. Por lo tanto, se puede suponer que la forma general del espectro de ruido tiende a permanecer igual en cualquier etapa dada. Esta tercera característica mide la desviación del espectro de entrada de la forma del espectro de ruido.

La fórmula de cálculo queda como sigue:

 

[cpp]  ver  copia simple

  1. // avgDiffNormMagn = var(magnIn) - cov(magnIn, magnAvgPause)^2 / var(magnAvgPause)  

 

Calcular SNR

Calcule la relación señal-ruido antes y después basándose en la estimación del ruido cuantil.

La relación señal-ruido posterior se refiere a la SNR transitoria de la energía observada en comparación con la potencia de entrada en relación con la potencia de ruido:

 

Donde Y es el espectro de entrada que contiene ruido, consulte la fórmula 1. N es el espectro de ruido y la SNR anterior es el valor esperado de la potencia de la señal pura (no necesariamente de voz) relacionada con la potencia del ruido, que se puede expresar como:

Entre ellos, X se refiere a la señal pura de entrada, que aquí corresponde a la señal de voz. En el cálculo real de WebRTC, no se utiliza el orden de magnitud al cuadrado, pero sí el orden de magnitud.

Dado que la señal pura es una señal desconocida, la estimación de la SNR anterior es el promedio de la SNR anterior estimada y la SNR transitoria de la trama anterior  :

H en la fórmula anterior corresponde al suavizado en el código, que es el filtro Wiener del cuadro anterior, utilizado para suavizar la SNR instantánea. El primer elemento es el SNR anterior del cuadro anterior y el último elemento es la estimación transitoria de la SNR anterior. Se actualiza mediante la respuesta de decisión DD. El parámetro de suavizado de tiempo es . Cuanto mayor sea el valor, mayor será la fluidez y mayor el retraso. El valor elegido en el programa es 0,98.

 

[cpp]  ver  copia simple

  1. static void ComputeSnr(const NoiseSuppressionC* self,  
  2.                        flotador constante* magn,  
  3.                        ruido de flotación constante*,  
  4.                        flotador* snrLocPrior,  
  5.                        flotante* snrLocPost) {  
  6.   tamaño_t i;  
  7.   
  8.   for (i = 0; i < self->magnLen; i++) {  
  9.     // Publicación anterior SNR.  
  10.     // Estimación anterior: basada en el cuadro anterior con filtro de ganancia. Aquí se suaviza la fórmula 7, correspondiente a la primera mitad de la fórmula 8  
  11.     flotador anteriorEstimateStsa = self->magnPrevAnalyze[i] /  
  12.         (self->noisePrev[i] + 0.0001f) * self->smooth[i];  
  13.     // Publicar SNR.  
  14.     snrLocPost[i] = 0.f;  
  15.     si (magn[i] > ruido[i]) {  
  16.       snrLocPost[i] = magn[i] / (noise[i] + 0.0001f) - 1.f;//De hecho, magn incluye el habla y el ruido. Restar uno significa restar el ruido para obtener el snr posterior  
  17.     }  
  18.     // La estimación de DD es la suma de dos términos: estimación actual y estimación anterior.  
  19.     // Actualización de decisión dirigida de snrPrior.  
  20.     snrLocPrior[i] =  
  21.         DD_PR_SNR * anteriorEstimateStsa + (1.f - DD_PR_SNR) * snrLocPost[i];//Aquí está el cálculo de la Fórmula 8  
  22.   } // Fin del bucle sobre frecuencias.  
  23. }  

Problema de ruido del habla

 

[cpp]  ver  copia simple

  1. El significado de los parámetros de la función.  
  2. // |magn| es el espectro de magnitud de entrada. Espectro de amplitud de la señal de entrada, incluida la señal y el ruido.  
  3. // |ruido| es el espectro de ruido.  
  4. Las dos probabilidades siguientes se calculan mediante la función ComputeSnr.  
  5. // |snrLocPrior| es la SNR previa para cada frecuencia.  
  6. // |snrLocPost| es la SNR posterior para cada frecuencia.  

 

Los cálculos en el código relacionados con la primera característica son:

 

[cpp]  ver  copia simple

  1. // Calcular la característica basándose en el factor LR promedio.  
  2. // Este es el promedio de todas las frecuencias del registro suave LRT.  
  3. logLrtTimeAvgKsum = 0,0;  
  4. for (i = 0; i < self->magnLen; i++) {  
  5.   tmpFloat1 = 1.f + 2.f * snrLocPrior[i];  
  6.   tmpFloat2 = 2.f * snrLocPrior[i] / (tmpFloat1 + 0.0001f);  
  7.   besselTmp = (snrLocPost[i] + 1.f) * tmpFloat2;  
  8.   self->logLrtTimeAvg[i] +=  
  9.       LRT_TAVG * (besselTmp - (float)log(tmpFloat1) - self->logLrtTimeAvg[i]);  
  10.   logLrtTimeAvgKsum += self->logLrtTimeAvg[i];  
  11. }  
  12. logLrtTimeAvgKsum = (float)logLrtTimeAvgKsum / (self->magnLen);  
  13. self->featureData[3] = logLrtTimeAvgKsum;  

Para comprender el significado físico y matemático contenido en el código anterior, primero debe observar la siguiente derivación.

 

Calcule la probabilidad de hablar/ruido. Esta probabilidad se devuelve en el parámetro probSpeechFinal,

Primero pasemos al método de cálculo de probabilidad de voz/ruido, primero miremos el modelo de probabilidad de voz/ruido, definamos el estado de voz como y definamos el estado de ruido como , donde m es el cuadro y k es la frecuencia. Entonces la probabilidad de habla/ruido se puede expresar como:

Esta probabilidad depende de los coeficientes espectrales de entrada de ruido observado y de algunos datos característicos de la señal procesada (como las características de clasificación de la señal), que aquí es {F}. Los datos de características pueden ser espectro de entrada ruidoso, datos de espectro pasado, datos de modelo, etc. Por ejemplo, los datos característicos {F} pueden incluir medición de la planitud del espectro, distancia del pico de resonancia, coincidencia de plantilla y residual de LPC, etc. Según el criterio bayesiano, la probabilidad de habla/ruido se puede expresar como:

donde p({F}) es la probabilidad previa basada en los datos característicos de la señal, que se establece como una constante en una o más expresiones siguientes. La cantidad es la probabilidad de voz/ruido según los datos de la característica {F}. Al ignorar la probabilidad anterior p{F} basada en {F}, simplificando y , la probabilidad de voz normalizada se puede escribir como:

La abreviatura de la fórmula anterior es:

donde la razón de verosimilitud (LR) es:

En la expresión anterior , está determinado por un modelo lineal y un supuesto de función de densidad de probabilidad gaussiana (PDF) para los coeficientes espectrales de voz y ruido. Específicamente, la expresión del modelo lineal de la señal de entrada ruidosa es: en el estado de voz:

 

En condiciones de ruido:

Suponiendo que la función de densidad de probabilidad gaussiana utiliza coeficientes complejos , la cantidad se expresa de la siguiente manera:

Dado que las probabilidades se pueden determinar completamente a partir de modelos lineales y suposiciones de PDF gaussianas, la dependencia de características se puede eliminar de la expresión anterior. De esta forma, la razón de verosimilitud queda:

donde es la SNR de la señal desconocida (es decir, SNR a priori) y es la SNR posterior (es decir, SNR posterior o SNR transitoria) de la frecuencia K y el cuadro m. En un ejemplo de la vida real, la SNR anterior y la SNR posterior utilizadas en la expresión anterior se estiman mediante la definición de magnitud y la fórmula es:

De acuerdo con la expresión anterior, la probabilidad del estado de habla/ruido se puede obtener mediante la relación de probabilidad y la cantidad q, donde la relación de probabilidad se determina basándose en la SNR anterior y posterior que varía en frecuencia, y la cantidad es una característica basada en o probabilidad basada en modelo, descripción detallada a continuación. Por lo tanto, la probabilidad del estado de voz/ruido se puede expresar como:

A veces, el factor de razón de probabilidad que varía en frecuencia fluctúa mucho de un cuadro a otro, por lo que se utiliza un factor de razón de probabilidad suavizado en el tiempo:

La fórmula anterior es lo que hace el código anterior, pero el código no sigue completamente la fórmula aquí. Aquí primero usamos y para simplificar el código anterior.

El último término de esta fórmula se obtiene tomando el logaritmo de la siguiente fórmula. Vale la pena señalar que el código anterior no se calcula completamente según la fórmula.

 

 

La media geométrica de los factores de relación de probabilidad suavizados temporalmente, incluidas todas las frecuencias, se puede utilizar como una medida fiable para la clasificación del habla/ruido basada en cuadros:

 

[cpp]  ver  copia simple

  1. logLrtTimeAvgKsum = (float)logLrtTimeAvgKsum / (self->magnLen);  

 

Al calcular la probabilidad de voz/ruido, se utiliza el supuesto gaussiano como modelo de PDF de voz para obtener la relación de verosimilitud. Entre otros modelos, el modelo PDF de densidad de probabilidad también se puede utilizar como base para medir razones de verosimilitud, incluidos el laplaciano, el gamma y el supergaussiano. Por ejemplo, si bien el supuesto gaussiano es una representación razonable del ruido, este supuesto no se aplica necesariamente al habla, especialmente en períodos de tiempo más cortos (por ejemplo, ~10 ms). En este caso, se podría utilizar otro modelo de PDF de voz, pero lo más probable es que esto agregue complejidad.

Para determinar la probabilidad de voz/ruido en el proceso de estimación y filtrado de ruido, esto requiere no solo la guía de la SNR local (es decir, la SNR anterior y la SNR transitoria), sino también combinarla con el modelo de voz/contenido cognitivo obtenido del modelado de características. La incorporación de modelos de voz/contenido cognitivo en las determinaciones de probabilidad de voz/ruido permite que los procesos de supresión de ruido manejen y diferencien mejor entre niveles de ruido extremadamente volátiles. Si confía únicamente en la SNR local, puede sufrir un sesgo de probabilidad. Aquí las probabilidades basadas en características se actualizan y adaptan para cada cuadro y frecuencia que contiene SNR local y datos de características/modelos de voz . Se puede abreviar como . Debido a que el proceso descrito aquí solo modela y actualiza cantidades por fotograma , la variable k se suprime.

La actualización de probabilidad basada en características puede utilizar el siguiente modelo:

donde es una formulación suave, que es una función de mapeo para un tiempo y una frecuencia determinados (como entre 0 y 1). La variable Z en esta función de mapeo es Z=FT, donde F es la característica que se está midiendo y T es el umbral. El parámetro w representa las características de forma/ancho de la función de mapeo. La función de mapeo clasifica los contenedores de tiempo-frecuencia como voz (M cerca de 1) o ruido (M cerca de 0) según las características medidas y los parámetros de umbral y ancho.

En el proceso de estimación y filtrado de ruido, se consideran las siguientes características de la señal de voz al determinar la probabilidad de voz/ruido: (1) media LRT, que puede derivarse en función de la SNR local, (2) planicidad espectral, que puede basarse en se deriva el modelo armónico del habla y (3) medición de la diferencia de máscara espectral. También se pueden utilizar otras características de señales de voz como características suplementarias o sustitutivas.

1. Características medias del LRT

La media geométrica de los factores del índice de verosimilitud (LR) suavizado en el tiempo es un indicador fiable del estado del habla/ruido:

El factor LR procesado en el tiempo se obtiene según la expresión mencionada anteriormente. Cuando se utilizan características medias LRT, un ejemplo de una función de mapeo M(z) podría ser una función de curva en forma de "S", como por ejemplo:

 

[cpp]  ver  copia simple

  1. // Calcular función del indicador: mapa sigmoideo.  
  2. indicador0 =  
  3.     0,5f*  
  4.     ((float)tanh(widthPrior * (logLrtTimeAvgKsum - threshPrior0)) + 1.f);  

 

donde está la característica y es un parámetro de transición/ancho que controla la suavidad del mapeo de 0 a 1. Los parámetros de umbral deben determinarse en función de la configuración de los parámetros.

2. Características de planitud espectral

 

 Para obtener características de planitud espectral, se supone que el habla tiene un comportamiento más armónico que el ruido. Sin embargo, el espectro del habla tiende a tener picos en la frecuencia fundamental (tono) y armónicos, mientras que el espectro del ruido es relativamente plano. Por lo tanto, al menos en algunas disposiciones, una combinación de mediciones locales de uniformidad espectral puede servir como una buena base para distinguir entre voz y ruido.

Al calcular la planitud espectral, N representa el número de intervalos de frecuencia y B representa el número de bandas de frecuencia. k es el índice de rango de frecuencia, j es el índice de banda de frecuencia. Cada banda de frecuencia incluirá una gran cantidad de ranuras de frecuencia. Por ejemplo, el espectro de frecuencia de 128 ranuras se puede dividir en 4 bandas de frecuencia (baja, media-baja, media-alta y alta). Cada banda de frecuencia incluye 32 ranuras. En otro ejemplo, sólo se utiliza una banda de frecuencia que incluye todas las frecuencias. La planitud espectral se puede encontrar calculando la relación entre la media geométrica y la media aritmética del espectro de amplitud de entrada:

donde N representa el número de frecuencias en la banda de frecuencia. Para el ruido, la cantidad calculada es grande y constante, mientras que para el habla, la cantidad calculada es pequeña y variable. Asimismo, un ejemplo de una función de mapeo para actualizar probabilidades previas basadas en características se puede expresar como una función sigmoidea:

 

 

[cpp]  ver  copia simple

  1. // Calcular función del indicador: mapa sigmoideo.  
  2. indicador1 =  
  3.     0,5f*  
  4.     ((float)tanh((float)sgnMap * widthPrior * (threshPrior1 - tmpFloat1)) +  
  5.      1.f);  

 

3. Características de diferencia de la plantilla de espectro.

Además del supuesto relacionado con el ruido de las características de planitud espectral, otro supuesto sobre el espectro de ruido es que el espectro de ruido es más cálido que el espectro del habla. Por lo tanto, se puede suponer que la forma general del espectro de ruido tiende a permanecer igual en cualquier etapa dada. El espectro de plantilla se determina actualizando las partes del espectro (inicialmente establecidas en cero) que tienen más probabilidades de ser ruido o pausas del habla. El resultado de esta comparación es una estimación conservadora del ruido, con ruido agregado solo en los segmentos donde se determina que la probabilidad del habla está por debajo de un umbral (como ). En otras distribuciones, los espectros de plantilla también pueden importarse al algoritmo o filtrarse a partir de formas correspondientes a diferentes ruidos. Teniendo en cuenta el espectro de entrada y el espectro de plantilla (expresado como ), si desea obtener las características de diferencia de la plantilla de espectro, primero puede definir la medición de diferencia de espectro como:

donde están los parámetros de forma, incluidos los parámetros de desplazamiento lineal y amplitud, obtenidos minimizando J. Obtenido mediante una ecuación lineal, este parámetro se puede extraer fácilmente para cada cuadro. En algunos ejemplos, estos parámetros pueden indicar cualquier cambio simple/cambio de escala en el espectro de entrada (con volumen creciente). Esta característica se convertirá entonces en una medida del discurso estándar.

donde la normalización es el espectro de entrada promedio sobre todas las frecuencias y marcos de tiempo anteriores en alguna ventana de tiempo.

Como se mencionó anteriormente, la característica de diferencia de plantilla espectral mide la diferencia/desviación entre la plantilla o espectro de ruido aprendido y el espectro de entrada. Al menos en algunas disposiciones, esta característica de diferencia de plantilla espectral se puede utilizar para modificar la probabilidad de voz/ruido de la característica . Si es pequeño, el espectro del cuadro de entrada puede considerarse "cercano" al espectro de plantilla y es probable que el cuadro de entrada se considere ruido. Por otro lado, si el valor de la característica de diferencia de la plantilla del espectro es grande, significa que el espectro del cuadro de entrada es muy diferente del espectro de la plantilla de ruido y se considera habla. Utilice una curva en S para asignar características de diferencia de plantilla espectral en ponderaciones de probabilidad. Es importante enfatizar que las medidas de caracterización de diferencia de máscara espectral son más comunes que las medidas de caracterización de planitud espectral. Si una máscara tiene un espectro plano constante, la característica de diferencia de la máscara espectral se puede reducir a una medida de planitud espectral.

Se pueden agregar plazos de Jiaqi a las mediciones de diferencia de máscara de espectro para resaltar bandas de frecuencia específicas en el espectro:

Múltiples características mencionadas anteriormente (media LRT, planicidad espectral y diferencia de plantilla espectral) pueden aparecer simultáneamente en la plantilla de actualización de probabilidad de voz/ruido, de la siguiente manera:

Diferentes patios característicos tienen información diferente. Estas respiraciones se complementan para proporcionar una actualización de probabilidad de habla/ruido más estable y adaptable.

 

[cpp]  ver  copia simple

  1. // Combina la función del indicador con los pesos de las características.  
  2. indPrior = pesoIndPrior0 * indicador0 + pesoIndPrior1 * indicador1 +  
  3.            pesoIndPrior2 * indicador2;  


Finalmente, realice la conversión logarítmica a probabilidad normal.

 

 

[cpp]  ver  copia simple

  1. // Probabilidad final del habla: combinar el modelo anterior con el factor LR :.  
  2. gananciaPrior = (1.f - self->priorSpeechProb) / (self->priorSpeechProb + 0.0001f);  
  3. for (i = 0; i < self->magnLen; i++) {  
  4.   invLrt = (float)exp(-self->logLrtTimeAvg[i]);  
  5.   invLrt = (flotante)gananciaPrior * invLrt;  
  6.   probSpeechFinal[i] = 1.f / (1.f + invLrt);  
  7. }  

 

Estimación de ruidoActualizar estimación de ruido

Una vez determinada la probabilidad de voz/ruido, se realiza una actualización de la estimación de ruido, expresada de la siguiente manera:

 

[cpp]  ver  copia simple

  1. probSpeech = self->speechProb[i];  
  2. probNonSpeech = 1.f - probSpeech;  
  3. // Actualización temporal de ruido:  
  4. // Úselo para cuadros de voz si el valor de actualización es menor que el anterior.  
  5. noiseUpdateTmp = gammaNoiseTmp * self->ruidoPrev[i] +  
  6.                  (1.f - gammaNoiseTmp) * (probNonSpeech * magn[i] +  
  7.                                           probSpeech * self->noisePrev[i]);  

¿Dónde está la estimación de la magnitud del espectro de ruido cuando el fotograma/tiempo es my el intervalo de frecuencia es k? El parámetro controla la suavidad de la actualización del ruido. El segundo período actualiza el ruido utilizando el espectro de entrada y la última estimación de ruido, y luego lo pondera según la probabilidad de voz/ruido como se describe anteriormente. Esto se puede expresar como:

 

donde el factor LR es:

Las cantidades son probabilidades de voz/ruido basadas en modelos o características derivadas del modelo actualizado anterior con múltiples características. El modelo de estimación de ruido anterior actualiza el ruido para cada cuadro y intervalo de frecuencia donde el ruido es más probable (es decir, el habla es menos probable). Para cuadros y contenedores de frecuencia donde el ruido es poco probable, la estimación del cuadro anterior en la señal se utiliza como estimación de ruido.

El proceso de actualización de la estimación de ruido está controlado por la probabilidad de voz/ruido y el parámetro de suavizado, que se puede establecer en un valor como 0,85. En un ejemplo diferente, el parámetro de suavizado podría aumentarse a =0,99 para regiones donde la probabilidad del habla excede el parámetro umbral para evitar que el nivel de ruido al comienzo del habla aumente demasiado. En una o más disposiciones, el parámetro de umbral se establece en =0,2/0,25.

Después de completar la actualización de la estimación de ruido, el proceso de filtrado y estimación de ruido emplea un filtro de ganancia de Wiener para reducir o eliminar la cantidad estimada de ruido del cuadro de entrada. El filtro Wiener estándar se expresa de la siguiente manera:

donde es el coeficiente espectral de ruido estimado, es el coeficiente espectral de ruido observado y es el espectro de voz puro (el cuadro es m, la frecuencia es k). Luego, la magnitud al cuadrado se puede reemplazar por la magnitud, y el filtro de Wiener se convierte en:

En uno o más métodos convencionales, el promedio de tiempo se aplica directamente al filtro para reducir cualquier fluctuación entre cuadros. Según ciertos aspectos de la presente invención, el filtro de Wiener está representado por una SNR a priori, y se utilizan actualizaciones dirigidas por decisión (DD) para promediar en el tiempo la SNR anterior. El filtro Wiener se puede expresar como SNR a priori como:

donde representa la SNR previa definida anteriormente, reemplazando el espectro de ruido con el espectro de ruido estimado:

Como se mencionó anteriormente, la SNR anterior se estima según la actualización de DD. Tomando la parte inferior y restando los parámetros de este filtro de ganancia, podemos obtener:

Debido a que la actualización de DD realiza explícitamente un promedio de tiempo en la SNR anterior, no se realiza ningún promedio de tiempo externo en el filtro de ganancia. Los parámetros se definen en función de la configuración activa del supresor de ruido implementado en el sistema de supresión de ruido.

Se aplica un filtro Wiener al espectro de magnitud de entrada para obtener una señal suprimida. El uso del filtro Wiener en el proceso de filtrado y estimación del ruido da como resultado:

síntesis de señal

La síntesis de señales incluye varios procesos de supresión de ruido a posteriori para generar cuadros de salida que incluyen voz limpia. Después de aplicar el filtro de Wiener, el cuadro se vuelve a convertir al dominio del tiempo utilizando una DFT inversa. En uno o más arreglos, la conversión al dominio del tiempo se puede expresar como:

Entre ellos, se encuentra la voz estimada después de ser suprimida por el filtro de Wiener, y es la señal correspondiente en el dominio del tiempo, donde el índice de tiempo es ny el índice de cuadro es m.

Después de la DFT inversa, se realiza un escalado de energía en la señal con supresión de ruido como parte del proceso de síntesis de la señal. La escala de energía se puede utilizar para ayudar a reconstruir los marcos del habla de una manera que aumente la energía del habla suprimida. Por ejemplo, el escalado debería implementarse de tal manera que sólo los cuadros de voz se amplíen hasta cierto punto, mientras que los cuadros de ruido permanezcan sin cambios. Dado que la supresión de ruido puede reducir los niveles de la señal de voz, resulta beneficioso amplificar adecuadamente los segmentos de voz durante el escalado. En una disposición, las tramas de voz se escalan en función de su pérdida de energía durante el proceso de filtrado y estimación del ruido. La condición de ganancia puede determinarse mediante la relación de energía de la trama de voz antes y después del procesamiento de supresión de ruido.

En el ejemplo actual, la escala se puede extraer según el siguiente modelo:

donde es la probabilidad de voz del cuadro m, obtenida tomando el promedio de las funciones de probabilidad de voz de todas las frecuencias:

En la ecuación de escala anterior, si la probabilidad es cercana a 1, el primer término será mayor y si es ruido, el segundo término será mayor.

En la ecuación de escala anterior, el parámetro controla la escala del marco de entrada.

La síntesis de señal incluye una operación de síntesis de ventana que proporciona el cuadro de salida final de la voz estimada. En un ejemplo, la composición de la ventana es:

donde los parámetros de escala se derivan de la ecuación de escala anterior para cada cuadro.

Estimación de parámetros

El modelo actualizado de la función de probabilidad de voz/ruido basada en características incluye múltiples parámetros de umbral y ponderación de características aplicados a las mediciones de características :

Estas sumas ponderadas se utilizan para evitar que mediciones de características no confiables ingresen al modelo actualizado. La función de mapeo también incluye un parámetro de ancho para controlar la forma de la función de mapeo:

Por ejemplo, si la característica media LRT F1 de la entrada dada no es confiable

Supongo que te gusta

Origin blog.csdn.net/lindonghai/article/details/102715851
Recomendado
Clasificación