Eu gostaria de usar o STFT para análise multipitch. Sei que detectar as parciais existentes no sinal é apenas o começo. Ainda tenho problemas com isso.
Digamos que eu tenha um sinal de amostra com a frequência 'CD' 44100Hz
. Com uma janela de 1024
amostras, obtenho uma resolução de bin de frequência de 22500Hz/512=43Hz
. Isso é suficiente apenas para discernir notas altas de piano como:
C5 = 523.251Hz
e C#5 = 554.365
.
Eu costumava pensar que 1024
é uma janela bastante grande. Mas talvez não seja, e normalmente janelas maiores são usadas para detectar parciais?
A resolução de frequência pode ser aumentada com outro método que não seja o aumento do tamanho da janela, o que piora a resolução do tempo? Pensei em dois métodos:
Método 1:
- Divida o sinal em bandas de frequência com filtros de banda (por exemplo
0-11.25Hz
e11.25-22.5Hz
). - Reduza a amostragem de bandas mais altas para que as altas frequências originais agora sejam baixas (assim como na segunda banda
11.25-22.5Hz -> 0Hz-22.5Hz
) - não tenho certeza de que isso seja possível. - Concat conjuntos de caixas resultantes com etiquetas ajustadas.
Método2:
- Use uma série de filtros passa-baixo com limite crescente.
- Execute a FFT aumentando as faixas de frequência.
- Para cada frequência, use a melhor resolução possível (caixas da primeira FFT na qual essa frequência foi incluída).
- Isso fará com que as frequências baixas tenham melhor resolução, mas acho que isso é bom, porque para notas mais altas a diferença de frequência é maior.
Serei grato por quaisquer comentários sobre essas questões.
Também li aqui: Como o tamanho da janela e a taxa de amostragem influenciam a estimativa do tom da FFT? sobre o método de melhorar os resultados de picking de pico. Eu acho que vou tentar usá-lo.
Respostas:
Se você realmente insistir em usar a FFT (em vez de métodos paramétricos, que não sofreriam trocas de tempo / frequência), poderá obter uma resolução muito melhor usando as informações da fase para recuperar a frequência instantânea de cada compartimento da FFT. Os parciais podem ser detectados procurando-se platôs na função que fornece frequência instantânea em função do índice do compartimento da FFT. A implementação comum dessa técnica, conforme descrita neste documento , "custará" um STFT extra (a frequência instantânea é recuperada por operações no STFT do sinal e STFT da derivada do sinal).
Veja, por exemplo, a função ifgram nesta implementação do Matlab de modelagem sinusoidal de sinais de áudio.
Observe que isso não ajudará a resolver duas parciais que caem em compartimentos FFT adjacentes. Ele fornecerá apenas uma estimativa de frequência muito mais precisa do que apenas converter em uma frequência o índice bin da FFT de um pico espectral.
fonte
O termo "resolução" tem vários significados. Em geral, você não pode aumentar sua capacidade de separar (ou "resolver") picos espectrais estreitamente espaçados por interpolação usando o mesmo tamanho de dados da janela. Mas você pode estimar a frequência de picos espectrais estacionários isolados que estão bem acima do piso de ruído com resolução mais fina (às vezes muito mais fina) do que o espaçamento da caixa da FFT por vários métodos de interpolação.
Os métodos comuns de interpolação de resultados da FFT para estimativas de resolução mais alta incluem interpolação parabólica, interpolação Sinc, preenchimento zero dos dados em uma FFT muito mais longa e métodos de codificação de fase usando vocais (ligeiramente) sobrepostos.
Uma FFT é essencialmente um banco de filtros passa-banda, cada um com uma transição muito acentuada, mas toneladas de ondulação de banda de parada para um determinado comprimento de núcleo do filtro FIR. Como tal, esses filtros não apresentam uma grande rejeição de ruído não periódico na janela. Se você suspeitar que esse tipo de interferência seja um problema, uma FFT com janelas ou um banco de filtros personalizado poderá ter um desempenho melhor.
fonte
Depois de mais pesquisas invocadas pela pergunta de Jim Clay e as pichenettes responderem nos comentários, descobri que meu Method2 é reinventado Transformada Q vinculada, descrita por exemplo por Kashima e Mont-Reynaud (não tenho certeza se posso vincular a este artigo, o arquivo parece rasgado ) .
A abordagem deles é algoritmicamente mais eficiente, pois eles começam na maior faixa de frequência e diminuem a amostragem iterativamente em 2 até chegarem à oitava mais baixa.
Os benefícios das transformações Q também foram explorados por Brown, por exemplo, aqui . Pode não ser tão eficiente quanto a FFT única, mas tem a vantagem de não calcular a FFT espessa em bandas de alta frequência que não exigem isso.
Obrigado por todas as respostas, comentários e links.
fonte
Se você mantiver um "histórico" de entradas e usá-lo para sobrepor seus DFTs, forneceria mais informações para extrair conteúdo espectral. Obviamente, isso depende da natureza variável do tempo do seu sinal. Seria semelhante em forma a uma função de distribuição de probabilidade.
Isso daria a você as DFTs mais espaçadas no tempo. No entanto, ainda aumentaria a incerteza temporal de cada DFT, o que é limitado pelas leis da natureza: o valor exato do comportamento temporal e espectral não pode ser determinado simultaneamente.
Se o conteúdo da frequência não variar muito dentro da janela, então tudo bem.
fonte