iPhone SDK: AvaudiorEcorder Medering - Como mudar o PeakpowerForChannel do Decibel em porcentagem?
-
20-09-2019 - |
Pergunta
O AvaudiorCorder no iPhone SDK pode ser usado para obter o pico e a energia média para um canal, em decibéis. O intervalo está entre 0dB e 160dB. Qual é o cálculo usado para convertê -lo em uma escala entre 0 - 10 ou algo semelhante que pode ser usado para um medidor de nível de áudio?
Solução
O intervalo é de -160 dB a 0 dB. Você provavelmente deseja exibi -lo em um medidor que vai de -90 dB a 0 dB. Exibir como decibéis é realmente mais útil do que um nível de áudio linear, porque os decibéis são uma escala logarítmica, o que significa que ele se aproxima mais de perto o quão alto percebemos um som.
Dito isto, você pode usar isso para converter de decibéis em linear:
linear = pow (10, decibels / 20);
e o inverso:
decibels = log10 (linear) * 20;
O intervalo para os decibéis acima é o infinito negativo a zero e para linear é de 0,0 a 1,0. Quando o valor linear é 0,0, isto é -inf db; Linear em 1,0 é 0 dB.
Outras dicas
A Apple também implementou uma classe de conversão de amplitude linear de banco de dados metetável.cpp e metetable.h Procure no exemplo do SpeakEre App.
Você pode usar a função embutida deles que calcula o valor "on-the-fly"
inline double DbToAmp(double inDb);
OU
Crie uma instância metertável para usar a tabela de pesquisa pré-calculada. Isso armazena valores de conversão na memória para que seu aplicativo possa reduzir o número de cálculos.
float ValueAt(float inDecibels);
NOTA: Provavelmente, a tabela de pesquisa é necessária se você tiver muitos outros cálculos em andamento ao mesmo tempo ou precisar de processamento muito rápido.