Pergunta

Eu estou tentando criar um analisador de espectro gráfica em python.

estou actualmente ler 1024 bytes de um canal 44100 taxa de amostragem Hz fluxo de áudio de 16 bits dupla e fazendo a média da amplitude dos 2 canais juntos. Então agora eu tenho uma série de 256 curtas assinados. Eu agora quero pré-forma uma FFT nessa matriz, usando um módulo como numpy, e usar o resultado para criar o analisador de espectro gráfico, que, para começar vai ser apenas 32 bares.

Eu li os artigos da Wikipedia sobre Rápida de Fourier Transform and Discrete Fourier Transform mas ainda estou incerto do que a matriz resultante representa. Isto é o que os olhares de matriz como depois que pré-forma uma FFT na minha matriz usando numpy:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

Eu estou querendo saber o que exatamente esses números representam e como eu iria converter esses números em uma porcentagem de uma altura de cada um dos 32 bares. Além disso, eu deveria ser a média dos 2 canais juntos?

Foi útil?

Solução

A matriz você está mostrando é a Transformada de Fourier coeficientes do sinal de áudio. Esses coeficientes podem ser usados ??para obter o conteúdo do áudio de frequência. A FFT é definido por complexas funções de entrada de valor, de modo que os coeficientes de sair será números imaginários, embora sua entrada é todos os valores reais. A fim de obter a quantidade de energia em cada freqüência, você precisa calcular a magnitude do coeficiente de FFT para cada frequência. Esta é não apenas o componente real do coeficiente, você precisa calcular a raiz quadrada da soma do quadrado dos seus componentes reais e imaginários. Ou seja, se o coeficiente é a + b * j, em seguida, sua magnitude é sqrt (a ^ 2 + b ^ 2).

Depois de ter calculado a magnitude de cada coeficiente de FFT, você precisa descobrir qual frequência de áudio cada coeficiente FFT pertence. Um N ponto FFT lhe dará o conteúdo do seu sinal de frequência em N frequências igualmente espaçadas, começando em 0. Uma vez que a frequência de amostragem é de 44100 amostras / seg. e o número de pontos em sua FFT é 256, o espaçamento de freqüência é 44100/256 = 172 Hz (aproximadamente)

O primeiro coeficiente em sua matriz será o coeficiente de 0 frequência. Isso é basicamente o nível de potência média para todas as freqüências. O resto de seus coeficientes contará a partir de 0 em múltiplos de 172 Hz até chegar a 128. Em uma FFT, você só pode medir freqüências de até metade dos seus pontos de amostragem. Leia estas ligações no Nyquist Frequência e Nyquist-Shannon Teorema de amostragem se você é um glutão de castigo e necessidade de saber por que, mas o resultado básico é que as frequências mais baixas vão ser replicados ou alias nos baldes de freqüência mais alta. Assim, as frequências irá começar a partir de 0, aumento de 172 Hz para cada coeficiente-se ao coeficiente de N / 2, então diminuir por 172 Hz até que a N -. 1 coeficiente

Isso deve ser suficiente informação para você começar. Se você gostaria de uma introdução muito mais acessível para FFTs do que é dado na Wikipedia, você pode tentar Processamento de Sinal digital Entendimento: 2ª Ed .. Ele foi muito útil para mim.

Então é isso que esses números representam. Convertendo a um percentual de altura poderia ser feito por escalar cada componente magnitude frequência pela soma de todas as magnitudes dos componentes. Embora, que só lhe daria uma representação da distribuição de freqüência relativa, e não o poder real para cada frequência. Você poderia tentar escalar pela magnitude máxima possível para um componente de frequência, mas não estou certo de que iria mostrar muito bem. A maneira mais rápida de encontrar um fator de escala viável seria a experiência em altos e suaves sinais de áudio para encontrar o ajuste certo.

Finalmente, você deve ser a média dos dois canais juntos, se você quer mostrar o conteúdo de frequência de todo o sinal de áudio como um todo. Você está misturando o áudio estéreo em mono de áudio e mostrando as frequências combinadas. Se você quiser dois indicadores separados para frequências de direita e esquerda, então você vai precisar para realizar a Transformada de Fourier em cada canal separadamente.

Outras dicas

Embora esta discussão é anos de idade, eu achei muito útil. Eu só queria dar o meu contributo para quem acha isso e está tentando criar algo semelhante.

Quanto à divisão em bares isso não deve ser feito como antti sugerem, dividindo os dados igualmente com base no número de bares. O mais útil seria dividir os dados em partes de oitava, cada oitava ser o dobro da frequência do anterior. (Isto é. 100Hz é uma oitava acima 50hz, que é uma oitava acima 25Hz).

Dependendo de quantas barras você quiser, você dividir toda a gama em 1 faixas / X oitava. Com base em uma dada frequência centro de A na barra, você obtém os limites superior e inferior da barra de:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

Para calcular a frequência seguinte centro adjacente você usa um cálculo semelhante:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

Você, então, média, os dados que se enquadre nestas faixas para obter a amplitude de cada bar.

Por exemplo: Queremos dividir em 1/3 oitavas faixas e começamos com uma frequência central de 1 kHz.

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

44100 Hz Dado e 1024 amostras (43Hz entre cada ponto de dados) que deve média para valores de 21 a 26. (890,9 / 43 = 20,72 ~ 21 e 1122,5 / 43 = 26,10 ~ 26)

(1/3 bares oitava iria levá-lo cerca de 30 bares entre ~ 40 Hz e ~ 20kHz). Como você pode descobrir por agora, enquanto vamos mais elevado que, em média, uma maior gama de números. Barras baixas tipicamente incluem apenas um ou um pequeno número de pontos de dados. Enquanto as barras superiores pode ser a média de centenas de pontos. A razão é que 86hz é uma oitava acima 43Hz ... enquanto sons 10086hz quase o mesmo que 10043hz.

o que você tem é uma amostra cujo comprimento no tempo é 256/44100 = 0,00580499 segundos. Isto significa que a sua resolução de freqüência é de 1 / 0,00580499 = 172 Hz. Os valores de 256 você sair de Python correspondem às frequências, basicamente, de 86 Hz a 255 * 172 + 86 Hz = 43946 Hz. Os números que você sair são números complexos (daí o "j" no final de cada segundo número).

EDITADO: FIXO informação errada

Você precisa converter os números complexos em amplitude através do cálculo da sqrt (i 2 + j 2 ), onde i e j são as partes real e imaginária, resp.

Se você quer ter 32 bares, você deve, tanto quanto eu entendo tomar a média de quatro amplitudes sucessivas, obtendo 256/4 = 32 bares como você quer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top