Seu código de normalização está incorreto. Se o sinal de entrada apresentar uma grande queda (digamos um valor negativo em -5,0), seu código não o detectará e você ainda terá valores fora de [-1, 1]. Use max (abs (array_of_amplitudes)) em vez disso. Antes da normalização, também é recomendável remover qualquer deslocamento DC que o sinal possa ter.
A normalização do RMS consiste em calcular o nível do RMS (raiz quadrada média) em janelas de curto prazo, obtendo o máximo desses valores e dividindo o sinal pelo máximo. Isso não garante que o resultado esteja dentro de [-1, 1] - você terá que cortar valores fora disso. O benefício é que é mais robusto para discrepantes no sinal. Digamos que você tenha uma gravação relativamente silenciosa, com apenas um pico curto em 1,0 em algum lugar devido a uma falha no driver da placa de som ou um "pop" temporário no microfone. A normalização não afetará o nível do sinal (já está normalizado, já que o máximo é 1,0); enquanto a normalização do RMS ainda aumentará seu nível (e o "pop" causará recorte).
Em relação às aplicações:
- Na gravação / reprodução de áudio, a normalização é importante porque garante que toda a faixa dinâmica dos conversores de saída seja usada. Se você reproduzir um sinal atingindo um pico de 0,25 a um DAC de 16 bits, não estará usando os 2 bits superiores do seu conversor (que sempre será 0) e, assim, aumentará o ruído de quantização em 12dB.
- Em algumas tarefas de classificação de áudio (como reconhecimento de emoções; classificação de gênero musical ou mesmo reconhecimento de fala), a amplitude / intensidade pode ser usada como um recurso. Portanto, você realmente deseja que todos os arquivos de entrada sejam similarmente "calibrados" em termos de nível.