Amostragem de áudio

A partir do Android 5.0 (Lollipop), os reamostradores de áudio se baseiam totalmente em filtros FIR derivados de uma função de sincronização em janelas de Kaiser. A sincronização em janelas de Kaiser oferece as seguintes propriedades:

  • Cálculo simples devido aos parâmetros de projeto (ondulação de banda filtrada, largura de banda de transição, frequência de corte e comprimento do filtro)
  • Praticamente ideal para redução de energia da banda filtrada em comparação à energia geral

Consulte a página 50 do livro Multirate Systems and Filter Banks, de P.P. Vaidyanathan, para ver discussões sobre a janela de Kaiser, além da capacidade de otimização e da relação com janelas esferoidais prolatas.

Os parâmetros de projeto são calculados automaticamente com base na determinação interna da qualidade e nas proporções de amostragem definidas. O filtro de sincronização em janelas é gerado com base nos parâmetros do projeto. Para uso em músicas, o reamostrador de 44,1 a 48 kHz (e vice-versa) é gerado com uma qualidade superior do que a da conversão arbitrária de frequências.

Os reamostradores de áudio oferecem mais velocidade, o que contribui para o aumento geral da qualidade. No entanto, eles podem introduzir pequenas quantidades de ondulação de banda passante e ruído harmônico distorcido, que podem causar perdas de frequências altas na banda de transição. Por isso, evite o uso desnecessário desse recurso.

Práticas recomendadas para amostragem e reamostragem

Esta seção descreve algumas práticas recomendadas para ajudar você a evitar problemas com taxas de amostragem.

Escolher a taxa de amostragem adequada para o dispositivo

Em geral, é melhor escolher a taxa de amostragem adequada para o dispositivo, normalmente de 44,1 kHz ou 48 kHz. O uso de uma taxa de amostragem superior a 48 kHz normalmente resultará em uma menor qualidade, porque será necessário usar um reamostrador para abrir o arquivo.

Usar proporções de reamostragem simples (fixas, em vez de polifásicas interpoladas)

O reamostrador opera de uma das seguintes formas:

  • Modo polifásico fixo: os coeficientes do filtro para cada polifase são pré-computados
  • Modo polifásico interpolado: os coeficientes do filtro para cada polifase precisam ser interpolados pelas duas polifases pré-computadas mais próximas

O reamostrador é mais rápido no modo polifásico fixo, quando a proporção entre a taxa de entrada e a taxa de saída L/M (extraindo o maior divisor comum) tem M menor que 256. Por exemplo, para conversão de 44.100 para 48.000, L = 147 e M = 160.

No modo polifásico fixo, a taxa de amostragem fica inalterada. No modo polifásico interpolado, a taxa de amostragem é aproximada. Em dispositivos de 48 kHz, o deslocamento da taxa de amostragem é geralmente de uma amostra após algumas horas. Isso não costuma ser um problema, porque o erro de aproximação é muito menor do que o erro de frequência gerado por osciladores de quartzo internos, deslocamento térmico ou instabilidade (normalmente dezenas de ppm).

Escolha taxas de amostragem de proporção simples, como 24 kHz (1:2) e 32 kHz (2:3) ao usar dispositivos de 48 kHz, mesmo que outras taxas de amostragem e proporções sejam possíveis por meio do AudioTrack.

Usar upsampling (e não downsampling) ao alterar taxas de amostragem

As taxas de amostragem podem ser alteradas de forma imediata. A granularidade dessas mudanças se baseia no carregamento em buffer interno (normalmente algumas centenas de amostras), não em cada amostra. Isso pode ser usado para efeitos.

Não altere as taxas de amostragem dinamicamente ao realizar downsampling. Ao alterar taxas de amostragem depois de criar uma faixa de áudio, diferenças de cerca de 5 a 10% em relação à taxa original podem acionar um novo cálculo do filtro durante a redução da amostragem (para suprimir adequadamente a distorção). Isso pode consumir recursos de computação e causar um clique audível se o filtro for substituído em tempo real.

Limitar o downsampling a um máximo de 6:1

O downsampling normalmente ocorre por requisitos de hardware do dispositivo. Quando o conversor de taxa de amostragem for usado para downsampling, limite a proporção a, no máximo, 6:1 para alcançar uma boa supressão de distorção (por exemplo, um downsampling de 48.000 para 8.000, no máximo). Os comprimentos de filtro são ajustados para corresponder à proporção de downsampling. No entanto, mais largura de banda de transição é sacrificada em proporções de downsampling mais elevadas, para evitar o aumento excessivo do comprimento do filtro. Não há problemas de distorção semelhantes durante o upsampling. Algumas partes do canal de áudio podem impedir o downsampling superior a 2:1.

Se você tem alguma preocupação relacionada à latência, não faça reamostragem

A reamostragem impede que a faixa seja colocada no caminho FastMixer. Portanto, haverá uma latência muito maior devido ao buffer adicional no caminho comum Mixer. Além disso, há um atraso implícito no comprimento do filtro do reamostrador, embora ele normalmente esteja na casa de um milésimo de segundo ou menos, o que não é tão significativo quanto o carregamento em buffer adicional do caminho comum Mixer (normalmente, 20 milésimos de segundo).

Usar áudio de ponto flutuante

O uso de números de ponto flutuante para representar dados de áudio pode melhorar significativamente a qualidade do áudio em apps de alto desempenho dessa categoria. O ponto flutuante oferece as seguintes vantagens:

  • Maior intervalo dinâmico
  • Precisão consistente em todo o intervalo dinâmico
  • Mais reserva dinâmica para evitar recorte durante cálculos e transientes intermediários

Embora o ponto flutuante possa melhorar a qualidade do áudio, ele apresenta algumas desvantagens:

  • Os números de ponto flutuante usam mais memória.
  • As operações de ponto flutuante empregam propriedades inesperadas. Por exemplo, a adição não é associativa.
  • Os cálculos de ponto flutuante às vezes podem perder a precisão aritmética devido ao arredondamento ou a algoritmos numericamente instáveis.
  • O uso eficiente de ponto flutuante exige maior compreensão para alcançar resultados precisos e que possam ser repetidos.

Anteriormente, o ponto flutuante era conhecido pela indisponibilidade ou lentidão. Isso ainda é válido para processadores integrados e mais simples. No entanto, os processadores de dispositivos móveis modernos agora têm ponto flutuante de hardware, com desempenho semelhante ou, em alguns casos, superior ao de números inteiros. CPUs modernas também são compatíveis com Única instrução, múltiplos dados (SIMD, na sigla em inglês), o que pode melhorar ainda mais o desempenho.

Práticas recomendadas para áudio de ponto flutuante

As práticas recomendadas a seguir ajudam a evitar problemas com cálculos de ponto flutuante:

  • Use ponto flutuante de dupla precisão para cálculos ocasionais, por exemplo, no caso de coeficientes de filtro.
  • Observe a ordem das operações.
  • Declare variáveis explícitas para valores intermediários.
  • Use parênteses com frequência.
  • Se você receber um NaN ou resultado infinito, use a pesquisa binária para saber onde ele foi introduzido.

Para o ponto flutuante de áudio, o formato de áudio que codifica AudioFormat.ENCODING_PCM_FLOAT é usado de forma semelhante a ENCODING_PCM_16_BIT ou ENCODING_PCM_8_BIT para especificar os formatos de dados do AudioTrack. O método sobrecarregado correspondente AudioTrack.write() recebe uma matriz flutuante para fornecer dados.

Kotlin

    fun write(
            audioData: FloatArray,
            offsetInFloats: Int,
            sizeInFloats: Int,
            writeMode: Int
    ): Int
    

Java

    public int write(float[] audioData,
            int offsetInFloats,
            int sizeInFloats,
            int writeMode)
    

Mais informações

Esta seção lista mais alguns recursos relacionados a amostragens e pontos flutuantes.

Amostragem

Taxas de amostragem

Reamostragem

A controvérsia entre alta profundidade de bits e kHz alto

Ponto flutuante

As seguintes páginas da Wikipédia ajudam a entender o áudio de ponto flutuante:

O artigo a seguir fornece informações sobre os aspectos do ponto flutuante que têm impacto direto sobre os projetistas de sistemas de computador: