Estou tentando implementar um FFT para entender como ele funciona. Estou usando um arquivo de som aleatório (portanto, não consigo controlar o tamanho do sinal), com uma frequência de amostragem de 44.1 KHz. Estou usando esta biblioteca
https://www.nayuki.io/res/free-small-fft-in-multiple-languages/Fft.java
O objetivo é aplicar esta fórmula a obtenha a frequência: F = n * Fs / N
Com n número de caixas. Fs frequência de amostragem e N tamanho do FFT
1) Um Fft deve ter um comprimento, a maioria deles usa uma potência de 2 radix. Mas como posso saber o comprimento do FFT se aplicá-lo a uma matriz inteira de dados? é o tamanho dessa matriz?
2) Eu não entendo os bins, como é processado? Eu sei que o FFT funciona com blocos de dados, mas se eu fornecer um array completo de dados, como os bins são “criados”.
Comentários
- Essas perguntas podem ser respondidas com apenas um pouco de pesquisa e leitura na Internet. Também recomendo que você comece sua codificação com construção matemática sinais de duração razoavelmente curta, aplique seu software FFT a eles e examine os resultados.
- Na verdade, pesquisei muito, mas não ' entender, mas talvez i ' m muito lento. obrigado por sua preocupação.
- Tente pesquisar em " Transformada discreta de Fourier " ou " como funciona um DFT " em vez de " como funciona uma FFT ". Uma Transformada Rápida de Fourier é um atalho computacional de uma Trans Discreta de Fourier Formato. Com a última pesquisa, é mais provável que você encontre informações sobre a eficiência computacional em vez do processo subjacente. Não ' não vejo como você pode esperar que alguém explique os fundamentos melhor em uma resposta rápida do fórum do que um monte de sites dedicados a fazer exatamente isso. Os primeiros quatro artigos do meu blog também devem ser úteis para você. Comece com dsprelated.com/showarticle/754.php .
Resposta
Pergunta 1
Se você aplicá-lo em todo o comprimento do array, o comprimento do FFT será o comprimento do array. Mas, o FFT é mais eficiente se o comprimento for uma potência de dois, então é comum preencher 0 “s no final do sinal até que seu comprimento seja uma potência de 2.
Exemplo excessivamente simples …
x = [3.4, 2.56, 1.3]
x
tem um comprimento de 3, a próxima potência de 2 depois de 3 é 4, então mudamos x
para ser
x = [3.4, 2.56, 1.3, 0]
e aplique um FFT com comprimento 4.
Outro grande MAS! Se o seu sinal for longo, torna-se extremamente ineficiente para fazer tudo de uma vez. Você não gostaria de tentar fazer um FFT em um arquivo de áudio do tamanho de uma música curta. Nesse caso, dividimos o sinal em pedaços de algum tamanho razoável, execute um FFT em cada um e calcule a média dos resultados.
Há boas chances de que o que você realmente deseja fazer com seus dados não seja apenas um FFT padrão, mas o processo de média que descrevi acima. Google Bartlett e Welch métodos para mais d etails.
Pergunta 2
Não estou 100% certo do que você está perguntando aqui. Vou interpretá-lo como você quer saber como a largura dos bins de frequência são determinados e executados com isso.
A largura de cada bins de frequência é determinada apenas pela taxa em que o sinal foi amostrado e o comprimento do FFT. A largura de cada compartimento é a frequência de amostragem dividida pelo número de amostras em seu FFT.
df = fs / N
Os bins de frequência começam em -fs/2
e vão até fs/2
. Isso significa que se amostrados a 100 Hz para 100 samples, os bins de frequência terão largura 1 Hz. Se você tomar 200 amostras, terá agora 2x mais bins de frequência e a largura deles será de 1/2 Hz cada.
Comentários
- Muito obrigado, era tudo que eu não ' não entendia.