Reconstruction du signal audio à partir du spectrogramme

19

J'ai un ensemble de chansons pour lesquelles j'ai extrait le spectrogramme de magnitude à l'aide d'une fenêtre de Hamming avec un chevauchement de 50%. Après avoir extrait le spectrogramme, j'ai fait une certaine réduction de dimensionnalité en utilisant l'analyse des composants principaux (PCA). Après l'avoir réduit à une dimensionnalité inférieure, j'ai reconstruit les spectrogrammes à partir de dimensions inférieures. Alors maintenant, il y aurait une erreur entre le spectrogramme original et le spectrogramme reconstruit. Je voudrais reconvertir ce spectrogramme en signal audio et le lire, afin de pouvoir savoir une fois reconstruit à partir de dimensions inférieures, comment son audio.

Existe-t-il une fonction disponible dans, disons Matlab. convertir un spectrogramme de magnitude en un signal audio ??

user76170
la source
2
Vous voulez vraiment le STFT et l'inverse STFT. "Spectrogramme" n'est qu'un nom pour une carte thermique de l'amplitude du STFT, et l'amplitude seule ne suffit pas pour reconstruire un signal. Regardez mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… ?
endolith
4
Pour développer le commentaire de @ endolith, ce qui vous manque lorsque vous passez de STFT à spectorgram, ce sont les informations de phase, une composante vitale de la représentation du domaine fréquentiel de votre signal.
Bjorn Roche
cela signifie donc que si je veux reconstruire le signal audio d'origine, j'ai besoin à la fois de l'amplitude et de la phase du STFT? Mais généreusement pour créer des fonctionnalités audio, le | S | l'amplitude du no complexe est ce qui est utilisé et les informations de phase sont rejetées. J'ai effectué l'ACP sur le spectrogramme mel que j'ai calculé comme M, est la matrice de multiplication du banc de filtres mel. alors comment reconstituer le signal audio vous donné X , l'approximation de X a après PCA? X=log(M|S|)X^
user76170
@endolith: J'ai essayé d'utiliser le lien que vous avez donné à mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… J'ai utilisé les informations de phase et d'amplitude à la fois, c'est-à-dire ( complexe comme entrée de la fonction ci-dessus). en utilisant cela, j'ai essayé de jouer le signal et ça sonnait saccadé. Pourquoi cela arrive-t-il ? J'ai ensuite calculé la norme entre le signal d'origine et celui obtenu à partir de la procédure STFT inverse comme ci-dessus et il a montré une énorme valeur de 3,46 * 10 ^ 3. Une idée pourquoi cela se produit-il ?? S
user76170
@ user76170: saccadé parce que le STFT coupe le signal en trames, parfois en se chevauchant, et vous devez les déconstruire de la même manière qu'elles ont été construites ou il y aura des discontinuités à chacune. Avez-vous utilisé les fonctions STFT et ISTFT à partir de ce lien? Regardez la forme d'onde du signal saccadé afin de voir quel est le problème.
endolith

Réponses:

15

Si le spectrogramme a été calculé comme l'amplitude des transformations de Fourrier à court terme à partir de fenêtres qui se chevauchent , alors le spectrogramme contient implicitement des informations de phase.

Les itérations suivantes font le travail:

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

est le spectrogramme, stft est la transformée de Fourier à temps court vers l'avant, isft est la transformée de Fourier à temps court inverse.Sstftisft

Edouard
la source
Je voudrais commenter directement @edouard, mais je n'ai pas assez de réputation. Est-ce que quelqu'un sait ce que dans sa réponse? Comment puis-je initialiser x 0 ? Juste aléatoire? Est - x n le signal reconstruit complet à l' itération n ou tout simplement le n ième coefficient de x ? Merci. ix0xnnnthx
PR
1
1
3

J'ai eu un peu de mal à comprendre la réponse de @edouard, qui fait la bonne chose. Comparez avec /signals//a/3410/9031 , que j'ai utilisé pour implémenter ma reconstruction.

ixnnthx0

PR
la source
2

Vous pouvez utiliser le spectrogramme reconstruit par rapport au spectrogramme d'origine pour concevoir un filtre dont la réponse en amplitude transforme un spectrogramme en un autre. Vous pouvez ensuite appliquer ce filtre aux données du domaine temporel d'origine, ou aux FFT d'origine pour un filtrage à convolution rapide d'ajout / enregistrement de chevauchement.

hotpaw2
la source
|S||S||S^|
2
Une matrice de spectrogramme est avec perte, elle ne peut donc pas être utilisée pour la reconstruction. Mais si vous pouvez inverser l'ingénierie d'une transformation pour produire le spectrogramme souhaité, vous pouvez l'appliquer aux données d'origine du domaine temporel sans perte ou éventuellement à la FFT de résultat complexe d'origine.
hotpaw2
S|S||S|
1
@ user76170 Le long et le court, c'est que vous avez besoin du STFT complexe avant de pouvoir reconstruire votre signal. Si vous n'avez que la magnitude STFT, cela ne suffit pas. Il y a des exceptions à cette règle, mais en général, vous avez besoin du STFT complexe, pas seulement de l'ampleur.
Tarin Ziyaee
|S||S^|
-1

Utilisez l'algorithme Griffin-Lim pour inverser le signal audio du spectrogramme, si vous n'êtes pas préoccupé par la complexité du calcul.

Jitendra Dhiman
la source
Pouvez-vous développer un peu votre réponse? Peut-être en ajoutant un document représentatif ou un lien vers l'algorithme et une brève explication de sa pertinence pour cette question (?)
A_A
Si je comprends bien votre question, en bref, vous souhaitez reconstruire le signal audio à partir d'un spectrogramme sans utiliser les informations de phase d'origine. L'algorithme Griffin-Lim nécessite une matrice de spectrogramme en entrée et en phase de reconstruction itérative. Vous pouvez consulter l'article ieeexplore.ieee.org/document/1164317
Jitendra Dhiman
Merci de me l'avoir dit. Juste pour clarifier ce point. Cette réponse est apparue dans ma file d'attente comme "mauvaise qualité". Les options que j'ai en termes de "révision" incluent des commentaires pour "amélioration". Pour que cette réponse corresponde au type de réponses communément rencontrées dans DSP.SE, il faudrait aller un peu dans l'algorithme Griffin Lim pour montrer comment il est pertinent par rapport à ce que l'OP demande. Toute modification future, vous pouvez appliquer directement à votre réponse. Le but de cela n'est pas de me satisfaire en particulier, c'est d'avoir un ensemble significatif de réponses éclairantes à une question
A_A
La meilleure réponse est ici (en utilisant Griffin-Lim) au cas où vous ne disposez pas des informations FFT d'origine. timsainb.github.io/…
Artemi Krymski