Tocar um pedaço de áudio da música em uma velocidade mais lenta diminuiria seu tom (frequência). Existe uma ferramenta e uma teoria para diminuir a velocidade da música enquanto mantém a frequência igual? Suponho que se pode fazer transformada de Fourier com janela ou transformação de wavelet. Parece que é preciso pré-selecionar o tamanho da janela ou escolher dinamicamente a base da wavelet. Existe alguma teoria e aplicação específica e detalhada para fazer isso?
10
Respostas:
Sim, alguns de nós podem fazê-lo, você pode acelerar ou diminuir a velocidade sem afetar o tom, alguns caras chamam isso de Time Stretch, existem diferentes maneiras de fazer isso, você pode fazer no domínio da frequência ou no domínio do tempo, precisará escolher o que é melhor para você, você encontrará algumas vantagens e desvantagens de cada uma.
Domínio do tempo:
No Time Domain, você pode tentar algumas técnicas como:
Prós: É rápido, alguns algoritmos são fáceis de entender, boa qualidade em sons monofônicos.
Contras: Geralmente, você precisará de uma trilha de arremesso muito boa para emendar na posição correta, é difícil de fazer :-(, por isso, se sua trilha de arremesso falhar ou não funcionar com sons polifônicos, esses algoritmos fornecerão muitas falhas / artefatos no som de saída.
Domínio de frequência:
Todo o tempo que eu conheço no domínio da frequência é baseado em técnicas de fase de vocoder .
Prós: Funciona com sons polifônicos ou monofônicos.
Contras: Pode ser doloroso entender toda a matemática, a implementação é um pouco difícil, não é tão rápida como os códigos do domínio do tempo, para voz, eu prefiro resultados no domínio do tempo, alguns truques para melhorar o resultado do vocoder da fase padrão não são compartilhados.
Posso dizer que a janela e o tamanho do lúpulo são uma das chaves para a qualidade do vocoder de fase, geralmente escolhemos
4x
sobrepor à ressíntese, uma única janela de tamanho4096
é suficiente para meus ouvidos (é claro, se você tem poder de processamento para esses tamanhos) , o vocoder de fase padrão pode adicionar alguns efeitos reverberantes. Para evitar esse tipo de problema, talvez seja necessário bloquear a fase.Para datailed dar uma olhada no Miller Puckette e Portnoff papel
fonte
44100 * 60 = 2646000
pontos de uma vez e processo, então esqueça a qualquer tentativa de processamento em tempo real, tais este ,A ferramenta / teoria que você descreve é realmente uma grande área de pesquisa em tecnologia musical, amplamente chamada de modificação da escala de tempo do áudio. Um grande componente desse campo é como você pode impedir alterações audíveis na frequência após o alongamento do tempo. Isso pode ser abordado com métodos no domínio da frequência e do tempo, dependendo das restrições ou dos objetivos do seu aplicativo. A entrada da Wikipedia para modificação de escala de tempo / afinação de áudio é um bom ponto de partida.
Se você deseja seguir uma abordagem usando frequência / wavelet, o tamanho da janela e a escolha da base afetarão a capacidade de localizar o sinal. Para usar o STFT como exemplo, uma janela longa funcionará bem para sinusóides estacionários, mas destruirá seus transitórios. Uma janela mais curta fornecerá uma resposta transitória preferível ao custo da localização no domínio da frequência. O desempenho de outras bases de wavelets dependerá da natureza da projeção do seu sinal na base.
fonte
Abaixo está um link para uma função tutorial simples e valiosa em C ++ (smbPitchShift.cpp) de Stephan M. Bernsee, que pode desacelerar ou acelerar a música sem alterar seu tom.
Ele lançou esse código sob a The Wide Open License (WOL). Dentro do meu aplicativo, eu pude adaptar sua função para diminuir a velocidade da música em tempo real - ou seja, ao reproduzir um arquivo mp3 e, adicionalmente, fazer a detecção de afinação no sinal mp3 ao mesmo tempo.
Também incluí um link para o site de Bernsee, que contém suas descrições detalhadas sobre o alongamento do tempo e a mudança de pitch de sinais de áudio, como música.
https://github.com/AndyA/BatPhone/blob/master/pitchshift.c
http://blogs.zynaptiq.com/bernsee/time-pitch-overview/
fonte
time stretch
, o código original se aplicaPitch Shift
. Nesse caso, para aplicar a modificação da escala de tempo, você precisará combinarPitch Shifit + Resample (interpolation)
. O código do Bernsee funciona bem usando uma janela de tamanho, que4096
você poderá alterar em uma oitava (acima ou abaixo) , significa que, portanto, você só poderá fazer escala de tempo com boa qualidade usando fatores entre 2.0x-0.5x, um vocoder de fase bem construído pode obter melhores resultados usando o mesmo tamanho de janela e poderá extrapolar esses fatores com melhor qualidade8192
nos códigos da página de download, então você precisa fazer mais quatro pontos no processamento , Volto a dizer que, com metade do tamanho da janela,8192/2=4096
você pode fazer o mesmo usando alguns segredos do codificador de fase, o ponto aqui é que você pode manter a qualidade com muito menos processamento.