Reconstrução do sinal de áudio do Spectrogram


19

Eu tenho um conjunto de músicas para as quais extraí o espectrograma de magnitude usando uma Hamming Window com sobreposição de 50%. Após extrair o espectrograma, reduzi a dimensionalidade usando a Análise de Componentes Principais (PCA). Depois de reduzi-lo à menor dimensionalidade, reconstruí os espectrogramas de dimensões mais baixas. Então agora, haveria algum erro entre o espectrograma original e o espectrograma reconstruído. Gostaria de converter esse espectrograma novamente no sinal de áudio e reproduzi-lo, para que eu pudesse saber, quando reconstruído de dimensões mais baixas, como o áudio soa.

Existe alguma função disponível no Matlab, por exemplo. converter um espectrograma de magnitude em um sinal de áudio?


2
Você realmente quer o STFT e o STFT inverso. "Espectrograma" é apenas um nome para um mapa de calor da magnitude do STFT, e somente a magnitude não é suficiente para reconstruir um sinal. Veja mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… ?
endolith 9/07/2013

4
Para expandir o comentário do @ endolith, o que você está perdendo quando passa do STFT para o espectograma é a informação de fase, um componente vital da representação no domínio da frequência do seu sinal.
Bjorn Roche

então isso significa que, se eu quiser reconstruir o sinal de áudio original, preciso da amplitude e da fase do STFT? Mas, generosamente, para criar recursos de áudio, o | S | amplitude do complexo não é o que é usado e as informações da fase são descartadas. Eu executei PCA no espectrograma de mel que calculei como M, é a matriz multiplicadora do banco de filtros de mel. então, como você reconstrói o sinal de áudio fornecido , a aproximação de X obtida após o PCA? XX=log(M|S|)X^
user76170

@ endolith: Tentei usar o link que você forneceu a mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… usei as informações de fase e amplitude, ou seja, (complexo como entrada para a função acima). usando isso, tentei tocar o sinal e ele parecia instável. Por que isso acontece ? Em seguida, calculei a norma entre o sinal original e o obtido pelo procedimento STFT inverso, como acima, e mostrou um valor enorme de 3,46 * 10 ^ 3. Alguma idéia de por que isso acontece? S
user76170

@ user76170: instável é porque o STFT corta o sinal em quadros, às vezes se sobrepõe, e você deve desconstruí-los da mesma maneira que foram construídos, ou haverá descontinuidades em cada um. Você usou as funções STFT e ISTFT desse link? Observe a forma de onda do sinal irregular, para poder ver qual é o problema.
endolith 15/07/2013

Respostas:


15

Se o espectrograma foi calculado como a magnitude do intervalo de tempo curto transforma-se a partir de janelas sobrepostas , o espectrograma contém implicitamente algumas informações de fase.

As seguintes iterações fazem o trabalho:

xn+1=istft(Sexp(iangle(stft(xn))))

stft isftS é o espectrograma, é a transformação de Fourier com tempo de avanço curto, é a transformação de Fourier de tempo inverso-curto.stftisft


Gostaria de comentar diretamente no @edouard, mas não tenho reputação suficiente. Alguém sabe o que é em sua resposta? Além disso, como eu inicializaria ? Apenas aleatório? é o sinal reconstruído completo na iteração ou apenas o coeficiente de ? Obrigado. x 0 x n n n th xix0xnnnthx
PR

1
@PR É o número imaginário da unidade, . 1
Peter K.

3

Foi difícil entender a resposta de @edouard, que está fazendo a coisa certa. Compare com /signals//a/3410/9031 , que eu usei para implementar minha reconstrução.

Observe que é o número imaginário e é o sinal reconstruído na iteração . Comece com sendo um vetor aleatório de comprimento do sinal de áudio. Para mim, algumas iterações foram suficientes para obter um resultado que parecia bom. O erro absoluto no sinal original foi, no entanto, bastante alto. Também o espectrograma gerado I gerado a partir do sinal reconstruído, apesar de mostrar as mesmas estruturas em geral, tinha magnitudes bastante diferentes.x n n th x 0ixnnthx0


2

Você pode usar o espectrograma reconstruído versus o espectrograma original para projetar um filtro cuja resposta de magnitude transforma um espectrograma no outro. Em seguida, você pode aplicar esse filtro aos dados originais no domínio do tempo ou às FFTs originais para sobrepor adicionar / salvar uma filtragem rápida de convolução.


|S||S||S^|

2
Uma matriz de espectrograma é com perdas, portanto não pode ser usada para reconstrução. Mas se você pode fazer engenharia reversa de uma transformação para produzir o espectrograma desejado, poderá aplicá-la aos dados originais do domínio do tempo sem perdas ou possivelmente à FFT resultante original complexa.
hotpaw2

S|S||S|

1
@ user76170 Em resumo, é necessário o STFT complexo antes de poder reconstruir o seu sinal. Se você apenas tem a magnitude STFT, isso não é suficiente. Há exceções a essa regra, mas geralmente você precisa do STFT complexo, não apenas da magnitude.
Tarin Ziyaee

|S||S^|

-1

Use o algoritmo Griffin-Lim para inverter o sinal de áudio do espectrograma, se você não estiver preocupado com a complexidade da computação.


Você pode expandir um pouco sua resposta? Talvez adicionando um papel de representante ou link para o algoritmo e uma breve explicação de como ele é relevante para esta interrogação (?)
um_um

Se entendi sua pergunta corretamente, em resumo, você deseja reconstruir o sinal de áudio de um espectrograma sem usar as informações da fase original. O algoritmo Griffin-Lim requer uma matriz de espectrograma como fase de entrada e reconstrução iterativamente. Você pode consultar o artigo ieeexplore.ieee.org/document/1164317
Jitendra Dhiman

Obrigado por me avisar. Apenas para esclarecer esse ponto. Esta resposta apareceu na minha fila de revisão como "baixa qualidade". As opções que tenho em termos de "revisão" incluem comentários para "melhoria". Para que essa resposta seja compatível com o tipo de resposta comumente encontrado no DSP.SE, seria necessário entrar um pouco no algoritmo Griffin Lim para mostrar como é relevante para o que o OP está pedindo. Quaisquer edições futuras, você pode aplicar diretamente à sua resposta. O objetivo disso não é satisfazer o "eu" em particular, é ter um conjunto significativo de respostas esclarecedoras para uma pergunta
A_A

A melhor resposta está aqui (usando Griffin-Lim), caso você não tenha informações originais da FFT. timsainb.github.io/...
Artemi Krymski
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.