Estou tentando descobrir como (se possível) extrair os componentes de frequência de uma amostra de áudio arbitrária (normalmente música) de maneira semelhante à FFT, mas em minha pesquisa sobre o algoritmo da FFT, estou aprendendo que ela sofre alguns restrições severas para esse fim.
Existem três problemas que a FFT está apresentando:
Como a resolução da bandeja da FFT é equivalente ao tamanho da sua janela, para obter uma precisão bastante razoável (digamos 1 Hz), você precisa de uma janela excessivamente longa (digamos 1 segundo). Isso significa que você não pode detectar transientes ou frequências recém-introduzidas rapidamente. Isso também significa que o problema não pode ser resolvido com uma CPU mais rápida e uma taxa de amostragem mais alta - a restrição está intrinsecamente ligada ao tempo.
Os seres humanos percebem a frequência logaritmicamente, mas os compartimentos da FFT são espaçados linearmente. Por exemplo, uma diferença de 20Hz na extremidade inferior da nossa audição é enorme , enquanto uma diferença de 20Hz na extremidade alta é imperceptível. Portanto, para obter a precisão que exigimos em baixas frequências, precisamos calcular muito mais do que exigimos em altas frequências.
Alguns desses problemas podem ser resolvidos interpolando entre os compartimentos da FFT. Isso pode funcionar para grande parte do áudio musical, porque as frequências costumam estar bem afastadas e, portanto, não mais do que 1 frequência vaza para um par de caixas. Mas nem sempre será esse o caso, principalmente para sons desarmônicos como instrumentos percussivos. Portanto, a interpolação é realmente apenas uma adivinhação.
Pelo que entendi do algoritmo DFT / FFT, as saídas (amplitudes do compartimento) são efetivamente a correlação do seno / cosseno na frequência de cada compartimento. Parece-me que, se o algoritmo pudesse ser redesenhado para que as frequências bin fossem espaçadas de forma não linear (ou seja, correlacionamos um conjunto diferente de senos / cossenos), poderíamos obter uma resolução psicoacústica da mesma forma em todas as frequências. Isso é possível ou é um sonho baseado no meu entendimento incompleto da matemática envolvida?
Acho que também poderia resolver o problema com força bruta, correlacionando senos / cossenos em cada frequência em que estou interessado. Não sou muito informado sobre matemática aqui. Isso é possível? Que tipo de eficiência? Isso resolveria o meu problema?
Existe uma maneira diferente de obter uma decomposição de frequência mais precisa e em tempo real de um sinal? A eficiência da CPU é uma preocupação, mas não a principal - estou parcialmente interessado em saber se isso pode ser feito teoricamente. No entanto, algo que seja viável em tempo real em uma máquina desktop moderna seria o ideal.
Respostas:
Como comentei em um post anterior, o método de análise de frequência e tempo conhecido como "transformada de Fourier de curto prazo" é equivalente a um banco de filtros, analisando seu sinal . Para uma determinada janela de análise , do tamanho , o filtro na frequência é: x w n N k / N h n = w - n e j 2 π n kX x Wn N k / N
Para janelas de análise usuais (Hann, Hamming ou mesmo retângulo), isso corresponde a um filtro passa-baixo, com frequência de corte em torno de , que é "deslocado" para a faixa de frequência (graças à modulação exponencial complexa) , portanto, levando a um filtro passa-banda.k1 / N k
Nesse ponto, para responder diretamente à sua preocupação em refletir a percepção humana, algumas pessoas derivaram a ["transformação Q constante" (CQT)] [Brown91]. Baseia-se no mesmo princípio que o FT, na sua interpretação do banco de filtros. No entanto, os centros não são espaçados linearmente quanto a um TF "normal", mas sim espaçados log2. A escala é então intimamente relacionada a uma escala musical ocidental: se alguém escolhe , obtemos 12 frequências por oitava (toca uma campainha? :-)) e a a largura de banda está configurada para, digamos, . Você também pode escolher outros centros, conforme a sua necessidade.f k + 1 = 2 1 / 12 f k 2 1 / 12 - 1fk fk + 1= 21 / 12fk 21 / 12- 12fk
Você pode encontrar implementações do CQT aqui e ali, uma recente do Prof. Klapuri, que vem com um inverso bastante decente, pode ser encontrada aqui . O grupo de áudio da Telecom ParisTech também possui uma implementação do Prof. Prado, mas ainda não o testei.
[Brown91] J. Brown, "Cálculo de uma constante transformação espectral Q", Jornal da Sociedade Acústica da América, 1991, 89, 425, 425-434
EDIT 20121014: algumas respostas e comentários às suas perguntas (do bryhoyt).
Apenas idéias gerais sobre seus próprios comentários à pergunta principal: você parece estar interessado em muitas aplicações que, para mim, não são problemas triviais de resolver. A "modelagem timbrada" me parece mais relacionada ao reconhecimento de fala ou algo semelhante, para o qual a resolução ou precisão do tom ou da frequência não é um problema (considere como as MFCCs são geralmente calculadas).
Considere também quantos pesquisadores de ponta ( F. Pachet e a equipe de repmus do IRCAM, França , para citar alguns) estão trabalhando no tópico de improvisação e acompanhamento automáticos: a tarefa não é impossível, mas requer conhecimento em muitas áreas. Para resumir, um sistema típico precisa imitar o sistema auditivo humano (pelo menos), implementar a percepção de som / música / afinação / ritmo, conhecer a teoria musical e tomar decisões com base nas estimativas de todas as etapas anteriores. A transformação de Fourier, ou qualquer representação de sinal, é apenas um (minúsculo) passo em direção ao objetivo final - e potencialmente, na minha opinião, o melhor compreendido até agora.
Dito isto, ainda há a possibilidade de que todos estejam olhando muito além do que realmente acontece, e que você possa reprimi-lo em uma solução simples e elegante! Não se esqueça de publicar sobre isso assim que estiver pronto! :-)
Isso levaria, no caso do FT, a uma resolução da ordem de , em todos os compartimentos de frequência do FT. São quase 2 semitons a 100Hz! Poderia ser melhor...Fs/ N= 44100 / 4410 = 10 Hz
Resposta curta: leia minha tese sobre estimativa de melodia!
Para elaborar um pouco mais: muitos algoritmos de estimativa de afinação vão além das limitações do TF, graças a suposições sobre os sons a serem processados. Esperamos que as notas dos sons naturais (voz humana, oboé, sax, piano ...) sejam mais complexas que os sinusóides isolados. A maioria dos sons agudos é mais ou menos harmônica, o que significa que eles podem ser modelados como somas de sinusóides cuja frequência é um múltiplo da frequência fundamental.
Portanto, é útil levar em consideração esses harmônicos ao estimar o tom, com métodos que usam funções de detecção como somas espectrais, produtos espectrais ou funções de autocorrelação. Alguém iniciou um tópico relacionado recentemente.
Como dito anteriormente, com uma janela de 0,005s, você pode esperar algo como 200Hz de "vazamento de frequência". Isso é realmente um problema apenas quando você tem 2 sinusóides com frequências inferiores a 200Hz, de modo que o FT não será capaz de mostrar que são 2 sinusóides diferentes. Bem, estamos longe dos seus 0,5% (a propósito, um semitom está em 6% da frequência!) E 0,005s é realmente um pouco pequeno para o seu propósito. No entanto, se você quiser fornecer uma estimativa a cada 0,005s, ainda poderá processar quadros sobrepostos mais longos, como geralmente feito no processamento de fala / música. É isso que você realmente quer?
Quanto ao tamanho das janelas, você pode consultar [Schoerkhuber2010], com comprimentos de quadro iguais a: que é o número de frequência caixas por oitava desejadas para o CQT. Isso significa muito longo janelas: e requerem cerca de 0,7s longas janelas. Não é nada dizer que perdemos um pouco da resolução temporal ... Mas, como mencionado anteriormente, isso é um problema apenas se esquecermos a estrutura do som. Além disso, a psicoacústica considera que abaixo de 500Hz, os seres humanos realmente não distinguem tão bem os sinusóides: até os humanos são desafiados por lá. Obviamente, podemos esperar que nossos computadores possam fazer melhor do que nós, mas aqui enfrentamos um problema difícil!
Por fim, observe que existem outras formas de calcular uma representação de som no tempo, considerando, por exemplo, bancos de filtros de gammatona. A vantagem do CQT que mencionei anteriormente é que há software para a transformação e seu inverso. Pessoalmente, continuo atento ao STFT, por sua simplicidade e porque, até agora, nunca precisei de uma melhor resolução em baixas frequências, mesmo para a separação de fontes.
[Schoerkhuber2010] Schoerkhuber, C. e Klapuri, A., "Caixa de ferramentas de transformação Constant-Q para processamento de música", 7ª Conferência sobre Computação em Som e Música, Barcelona, Espanha, 2010.
fonte
Primeiro, com a abordagem clássica de transformada de Fourier de curto prazo, existem alternativas à interpolação - em particular técnicas que utilizam informações de fase para recuperar a frequência instantânea ( consulte esta pergunta ), que pode fornecer com precisão a posição de um pico espectral sem um aumento do tamanho da FFT. A desvantagem, como você disse corretamente, é que você não está aumentando a capacidade do sistema de discriminar picos adjacentes - mas isso já é uma grande melhoria em comparação ao uso da frequência central do índice de bin da FFT.
Existe outra abordagem de força bruta que funciona: "sondar" seus sinais com exponencial complexo em janelas (wavelets de Gabor). Eles são caracterizados por uma frequência central, um tempo central e uma largura de banda (que mede como a wavelet se espalha ao longo do tempo ou sobre a frequência). Você terá que avaliar muitas, muitas, muitas correlações entre seu sinal e essas wavelets com quantas compensações, frequências e larguras de banda desejar. O resultado será o mesmo de um STFT "lado a lado" muito flexível, no qual um tamanho ideal de janela é selecionado para cada intervalo de tempo e cada faixa de frequência. Além do custo computacional, a desvantagem é que não há algoritmo eficiente e causal (você precisará conhecer tantas amostras com antecedência quanto a maior wavelet do seu dicionário). Se você quiser experimentar essas técnicas,MPTK .
Eles são computacionalmente caros, mas podem funcionar on-line, com janelas curtas se os pedidos e / ou o ruído do modelo forem baixos.
fonte
Frequência ou afinação? Já existem toneladas de trabalhos de pesquisa e livros sobre a percepção do campo humano. Mas, no IIRC, os seres humanos tendem a ser ruins em "extrair" frequências com precisão, a menos que sejam fundamentais. E múltiplos picos de frequência dentro de uma "banda crítica" tendem a ser percebidos como ruído. Portanto, qualquer método com "precisão quase humana" também pode precisar incluir também algumas falhas de estimativa perceptiva humana.
Uma FFT é apenas um banco de filtros que não são ideais para muitas finalidades, a menos que a ortogonalidade e a invertibilidade sejam requisitos. Outros bancos de filtros são possíveis se você não precisar desses dois (e a percepção humana claramente não), como um banco de filtros de frequência MEL. Uma vez que um pico de frequência é identificado por um banco de filtros de frequência MEL, uma análise mais aprofundada por técnicas de interpolação por FFT ou vocoder de fase pode ser útil para refinar uma estimativa de frequência de qualquer pico de frequência espectral isolado.
Observe que nenhuma dessas informações de fato é coletada por nenhuma dessas técnicas de filtragem usadas no mesmo período de dados no domínio do tempo, em comparação com uma FFT. O que está acontecendo pode realmente ser a perda de informações para melhor corresponder à "imprecisão" ou anomalia do sistema auditivo humano.
E a estimativa de afinação a partir de um conjunto de frequências é um problema completamente diferente, novamente um tópico com muitos trabalhos de pesquisa e capítulos de livros sobre audiologia e outros.
A última parte da sua pergunta sobre desempenho pode ser um arenque vermelho. Atualmente, pode-se fazer dezenas de FFTs e dezenas de diferentes bancos de filtros em tempo real em um processador de telefone celular. Dadas as bibliotecas FFT muito eficientes disponíveis dos fornecedores de CPU, uma FFT com milhares de "excesso" de bandejas pode ser mais eficiente do que um banco de filtros significativamente menor, porém mais ingênuo.
fonte
Existem muitas alternativas, mas isso depende do que você está fazendo. Fisicamente, eu diria que nossos ouvidos são mais como um banco de filtros paralelos do que uma FFT, o que lhes dá uma boa resolução de tempo, e um processo chamado "focalização" oferece uma boa resolução de frequência. Portanto, em alguns casos, você poderia usar teoricamente um banco de filtros, mas isso exige muito processamento, deixando muitos dados para processar.
É possível visualizar as wavelets como um conjunto de filtros particularmente eficientes e relacionados. O problema com as wavelets para análise musical e de áudio é que elas geralmente fornecem apenas uma resolução de oitava (embora você possa fazer várias coisas sobre isso, eu realmente não vi wavelets serem particularmente úteis no áudio).
Outra abordagem é usar janelas FFT sobrepostas. Você pode aumentar a resolução de frequência da FFT observando não apenas as informações de magnitude, mas também as informações de fase. Isso permite que você use janelas muito mais curtas do que você usaria, o que resulta em melhor desempenho e melhor resolução de tempo. É difícil redimensionar corretamente as janelas sobrepostas, e fazer muitas suposições sobre a fase também pode ser perigoso. Seja como for, esse tipo de truque provavelmente é o ponto principal da solução de problemas complexos de análise de frequência de tempo.
Existem várias outras ferramentas para aplicativos específicos também.
fonte