O primeiro passo é verificar se a taxa de amostragem inicial e a taxa de amostragem alvo são números racionais . Por serem números inteiros, são automaticamente números racionais. Se um deles não fosse um número racional, ainda seria possível alterar a taxa de amostragem, mas é um processo muito diferente e mais difícil.
O próximo passo é fatorar as duas taxas de amostra. A taxa de amostragem inicial, nesse caso, é 44100, que é fator . A taxa de amostragem alvo, 16000, é fator de 2 7 ∗ 5 3 . Assim, para converter da taxa de amostragem inicial para a taxa de destino, devemos dizimar em 3 2 ∗ 7 2 e interpolar em 2 5 ∗ 522* 32∗ 52* 7227∗ 5332* 7225∗ 5 .
As etapas anteriores devem ser executadas, não importa como você queira reamostrar os dados. Agora vamos falar sobre como fazer isso com FFT's. O truque para reamostrar com as FFTs é escolher comprimentos de FFT que façam tudo funcionar bem. Isso significa escolher um comprimento de FFT que seja múltiplo da taxa de dizimação (441, neste caso). Para o exemplo, vamos escolher um comprimento de FFT de 441, embora possamos ter escolhido 882 ou 1323 ou qualquer outro múltiplo positivo de 441.
Para entender como isso funciona, ajuda a visualizá-lo. Você começa com um sinal de áudio que parece, no domínio da frequência, algo como a figura abaixo.
Ao concluir o processamento, você deseja diminuir a taxa de amostragem para 16 kHz, mas deseja o mínimo de distorção possível. Em outras palavras, você simplesmente deseja manter tudo, desde a imagem acima, de -8 kHz a +8 kHz e largar todo o resto. Isso resulta na figura abaixo.
Observe que as taxas de amostragem não estão em escala, elas estão lá apenas para ilustrar os conceitos.
25∗ 5 ), por isso mantemos as 160 amostras que representam as frequências de -8 kHz a +8 kHz. Em seguida, invertemos a FFT nessas amostras e pronto! Você tem 160 amostras no domínio do tempo que são amostradas em 16 kHz.
Como você pode suspeitar, existem alguns problemas em potencial. Vou examinar cada uma delas e explicar como você pode superá-las.
O que você faz se seus dados não são um múltiplo interessante do fator de dizimação? Você pode superar isso facilmente preenchendo o final dos dados com zeros suficientes para torná-lo um múltiplo do fator de dizimação. Os dados são preenchidos ANTES de serem enviados por FFT.
eul - 1zeros (observe que o número de amostras de dados e o número de amostras de preenchimento devem AMBOS ser um múltiplo positivo do fator de dizimação - você pode aumentar o comprimento do preenchimento para atender a essa restrição), FFT usando os dados preenchidos, multiplicando o domínio da frequência dados e filtro e, em seguida, aliasing os resultados de alta frequência (> 8 kHz) para os resultados de baixa frequência (<8 kHz) antes de reduzir os resultados de alta frequência. Infelizmente, como a filtragem no domínio da frequência é um grande tópico por si só, não poderei entrar em mais detalhes nesta resposta. Eu direi, no entanto, que se você filtrar e estiver processando os dados em mais de um pedaço, precisará implementar Sobreposição e adição ou Sobreposição e economia para tornar a filtragem contínua.
Eu espero que isso ajude.
EDIT: A diferença entre o número inicial de amostras do domínio da frequência e o número alvo de amostras do domínio da frequência precisa ser uniforme, para que você possa remover o mesmo número de amostras do lado positivo dos resultados e do lado negativo dos resultados. No caso do nosso exemplo, o número inicial de amostras foi a taxa de dizimação, ou 441, e o número alvo de amostras foi a taxa de interpolação, ou 160. A diferença é 279, o que não é uniforme. A solução é dobrar o comprimento da FFT para 882, o que faz com que o número alvo de amostras também dobre para 320. Agora a diferença é uniforme e você pode descartar as amostras apropriadas do domínio da frequência sem problemas.