Exemplo de uso de FFT

Ex_1: Carregar o arquivo [drum_seg.wav] e realizar a FFT sobre o mesmo.

Este arquivo resulta num gráfico no domínio tempo como mostrado à seguir:

drum_seg

Solução

Sem dividir o sinal em 3 partes (como sugere seu aspecto visual), vamos obter:

E obtemos o seguinte gráfico:

fft_drum_seg.png

Notamos que dominam mais componentes em baixas frequências.

Podemos tentar isolar os compontes mais relevantes, comparando a maior amplitude obtida no cálculo da FFT e separado amplitudes que alcançam até 25% deste valor:

fft_drum_seg_25per.png

Na figura anterior, usando o critério dos 25% foram encontrados 132 componentes.

Se o critério for ampliado para mostrar componentes maiores ou iguais à 50% da maior amplitude encontrada, teremos então o seguinte gráfico:

fft_drum_seg_50per.png

Sob este critério, separamos 31 componentes.

O script separa_componentes.m que gerou este gráfico, também gerou outros resultados:

O código do script [separa_componentes.m] segue abaixo:


Concentrando a FFT na primeira parte do sinal da bateria...

Destacando o primeiro intervalo:

Temos o gráfico:

drum_seg1.png

Separando esta parte do vetor y em outra variável e realizando a FFT:

O que resulta o espectro de magnitude:

fft_drum_seg1.png

Semelhante ao gráfico da primeira FFT realizada.

Executando o script separa_componentes com critério de 25%, obtemos:

E o novo gráfico do espectro ficou como:

fft_drum_seg1_25per.png

Tentando recompor o sinal...

Podemos usar a teoria de Série de Fourier para tentar recriar o som da bateria dentro de certo intervalo, digamos de [0, 0.87] segundos, usando o mesmo período de amostragem.

O script separa_componentes.m criou o vetor P1_aux contendo os componentes relevantes, o vetor Y_phase contêm o valor da fase de cada componente o vetor f o valor da frequência em Hz.

Agora vamos executar o script recria_componentes.m para tentar recompor os primeiros 0,87 segundos deste sinal com base nos dados da última FFT levantada:

Este script também gera o gráfico:

drum_seg1_recriado.png

Segue código [recria_componentes.m]:

Infelizmente o vetor y2 criando não soa semelhante ao sinal original, mas talevz porque faltou acrescentar um termo de "amortecimento" ou "fator decaimento" nas amplitutes geradas para o vetor y2.

Analisando o gráfico no domínio tempo do vetor y_snap, parece que estamos em presença de uma constante de tempo de aproximadamente segundos. Note o que acontece quando sobrepomos o gráfico do vetor y_snap com a curva formada pela expressão: :

Resulta:

drum_seg1_decay1.png

Isto significa que podemos rescalonar as amplitudes do vetor y2 levando em conta vetor :

E temos o gráfico:

drum_seg1_new_y2.png

Ele é semelhante ao gráfico do primeiro segmento do sinal da bateria:

drum_seg1b.png

A diferença é que o sinal original apresenta mais componentes de alta frequência que desprezamos quando usamos o critério de 25%.

Então a conclusão é que devemos recriar o sinal new_y2 usando mais componentes frequênciais.

Problema: recriar o sinal new_y2 reduzindo o critério percentual para as amplitudes dos componentes frequenciais à serem considerados no sinal original y_snap.

Obs.: no Matlab para gerar um arquivo .wav basta fazer: audiowrite('new_y2.wav',new_y2,Fs).


Fernando Passold, 05/05/2024.