Existe um programa que possa determinar o tom mais alto em um arquivo de áudio?

14

Existe um programa Windows que possa determinar a "maior frequência de ondas sonoras" encontrada em um arquivo de áudio (por exemplo, arquivo mp3)?

Por exemplo, ele deve poder analisar o arquivo Dog-Whistle-0 e determinar que a frequência mais alta encontrada no arquivo é aproximadamente ~ 12000 Hz.

Além disso, deve ser capaz de analisar Piano.mp3 e determinar a nota mais alta.

Pacerier
fonte

Respostas:

13

R é multiplataforma e de código aberto / gratuito.

Carregue-o e carregue as bibliotecas tuneRe seewave(instale-as a partir do gerenciador de pacotes, se ainda não estiver instalado).

library(tuneR)
library(seewave)

Em seguida, carregue seu arquivo MP3 ou WAV:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Agora, vamos traçar o espectro e seus picos:

fpeaks(meanspec(w), nmax=1)

Resultado:

Resultado numérico:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

O exemplo acima funciona apenas com dados não musicais. Ao analisar as frequências musicais, você descobrirá que as frequências mais altas sempre estarão em torno de 12 a 20 kHz, dependendo do (s) instrumento (s) envolvido (s). No entanto, essa frequência mais alta não fornecerá uma estimativa da nota que está sendo tocada, pois uma nota musical, quando tocada por um instrumento, será composta por várias frequências.

Esse é o chamado "timbre" de um instrumento, e você verá que um A a 440 Hz por uma flauta incluirá diferentes componentes de frequência em comparação com um A tocado por uma guitarra elétrica.

Sua melhor aposta é executar uma análise de frequência dominante, observando os picos de frequência nas janelas de tempo deslizantes e verifique onde ocorre a mais alta.

No entanto, não existe "frequência ao longo do tempo". Você só pode plotar a frequência média (ou dominante) em determinadas janelas de tempo de deslizamento . O Seewave oferece algumas funções relacionadas à seleção de janelas de tempo, mas fica bastante complicado.

Você poderia usar

s = specprop(meanspec(w, from=10, to=11)) 

para obter as propriedades do espectro de 10 a 11 segundos e depois chamar s$centroidou s$meanobter as frequências médias ou centróides dessa janela de tempo específica (embora 1 segundo seja bastante grande para análise de áudio).

Se o seu arquivo Wave usa amostragem de 44,1 kHz, você pode reduzi-lo para reduzir o esforço de computação, por exemplo, para 16 kHz.

w = downsample(w, 16000)

Mas lembre-se de que, de acordo com o Teorema de Nyquist , a frequência máxima que pode ser representada agora é de 8 kHz.

Você também pode procurar um software de detecção de afinação. Como este , que requer MATLAB embora.

slhck
fonte
Btw, em vez de fpeaks, você está ciente de que existe uma função que plota o gráfico de frequência contra o tempo?
Pacerier
Veja minha atualização. Não é tão trivial. Não tenho trabalhado muito com áudio para saber se há algo melhor por aí, desculpe.
slhck
8

Você já experimentou o Audacity ? É uma ferramenta freeware que tem algumas ferramentas de análise bastante sofisticados, incluindo um Plot Spectrum comando acessado a partir Analisar -> Traçar Spectrum ... .

Captura de tela

Observe que você obtém resultados diferentes com a versão MP3 do arquivo em comparação com a versão WAV porque a compactação MP3 alterou a forma de onda e introduziu artefatos / aliases.

Editar: os arquivos de som aos quais você vincula não são bons exemplos disso. Os arquivos de frequência mais alta são amostrados apenas em 44,1KHz, adaptados à audição humana (cerca de 20KHz no máximo). Você não pode representar frequências de ultrassom sem aumentar a taxa de amostragem.

James P
fonte
Hmm, parece não funcionar com o arquivo Piano.mp3 . Para mim, ele mostra screenshoot.me/uZZ2N0 em 10121 Hz (D # 9) , mas isso é altamente improvável, porque a maior tecla de um piano é C8 (4186Hz). Estou fazendo algo errado?
Pacerier
3
@ Pacerier Não, mas você mudou um pouco sua pergunta. A amostra do apito para cães é fácil de identificar, porque a frequência com o pico mais alto do espectro também é a frequência mais alta e, ao mesmo tempo, a nota dominante. Para a música, a frequência mais alta não é necessariamente a nota mais alta, pois uma nota musical tocada por um instrumento é composta por várias frequências.
slhck
@slhck Ic, eu pensei que nós poderíamos acho que a nota se tivéssemos a frequência, parece que não é tão simples ..
Pacerier
@ Pacerier: Se você definir Tamanho como um valor mais alto, acredito que ele poderá fornecer resultados mais precisos e eliminar alguns harmônicos.
James P
2
@ Pacerier Não, não é realmente tão simples. A detecção de pitch requer que você primeiro transforme a forma de onda em um espectro de frequência (Fast Fourier Transform), depois aplique filtros (passa-baixa principalmente) e mais uma rodada de filtros. A menos que você encontre uma ferramenta que rastreie o tom ao longo do tempo, o que você está procurando será realmente difícil. Você pode procurar por ferramentas de correção vocal como o Melodyne .
slhck