Ricostruzione del segnale audio dallo spettrogramma


19

Ho una serie di canzoni per le quali ho estratto lo spettrogramma di grandezza usando una finestra di Hamming con una sovrapposizione del 50%. Dopo aver estratto lo spettrogramma, ho fatto una certa riduzione di dimensionalità usando l'analisi dei componenti principali (PCA). Dopo averlo ridotto a una dimensione inferiore, ho ricostruito gli spettrogrammi da dimensioni inferiori. Quindi ora ci sarebbe qualche errore tra lo spettrogramma originale e lo spettrogramma ricostruito. Vorrei riconvertire questo spettrogramma in segnale audio e riprodurlo, in modo da poter sapere quando ricostruito da dimensioni inferiori, come suona l'audio.

C'è qualche funzione disponibile in dire Matlab. convertire uno spettrogramma di grandezza in un segnale audio ??


2
Volete davvero la STFT e la STFT inversa. "Spettrogramma" è solo un nome per una mappa di calore della grandezza della STFT e la magnitudine da sola non è sufficiente per ricostruire un segnale. Guarda mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… ?
endolith

4
Per espandere il commento di @ endolith, ciò che ti manca quando passi da STFT a spectorgram sono le informazioni sulla fase, una componente vitale della rappresentazione del dominio di frequenza del tuo segnale.
Bjorn Roche,

quindi ciò significa che se voglio ricostruire il segnale audio originale, ho bisogno sia dell'ampiezza che della fase della STFT? Ma genericamente per creare funzionalità audio, il | S | l'ampiezza del no complesso è ciò che viene utilizzato e le informazioni sulla fase vengono scartate. Ho eseguito PCA sullo spettrogramma mel che ho calcolato come M, è la matrice moltiplicativa del banco filtro mel. quindi come ricostruire il segnale audio dato , l'approssimazione a X ottenuta dopo il PCA? XX=log(M|S|)X^
user76170

@endolith: ho provato a utilizzare il link che hai fornito a mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… Ho usato le informazioni di fase e ampiezza, ad esempio (il complesso come input per la funzione sopra). usando questo ho provato a suonare il segnale e sembrava incerto. Perché succede? Ho quindi calcolato la norma tra il segnale originale e quello ottenuto dalla procedura STFT inversa come sopra e ha mostrato un valore enorme di 3,46 * 10 ^ 3. Qualche idea sul perché questo accada ?? S
user76170,

@utente76170: instabile è perché STFT taglia il segnale in frame, a volte sovrapponendoli, e devi decostruirli nello stesso modo in cui sono stati costruiti o ci saranno discontinuità in ciascuno di essi. Hai usato le funzioni STFT e ISTFT da quel link? Guarda la forma d'onda del segnale discontinuo in modo da poter vedere qual è il problema.
endolith,

Risposte:


15

Se lo spettrogramma è stato calcolato come l'entità del breve tempo che Fourrier si trasforma da finestre sovrapposte , lo spettrogramma contiene implicitamente alcune informazioni sulla fase.

Le seguenti iterazioni fanno il lavoro:

Xn+1=istft(Sexp(ioangolo(STFT(Xn))))

STFT isftS è lo spettrogramma, è la trasformata di Fourier a breve termine, è la trasformata di Fourier a breve inverso.STFTisft


Vorrei commentare direttamente su @edouard, ma non ho abbastanza reputazione. Qualcuno sa cos'è nella sua risposta? Inoltre, come dovrei inizializzare ? Solo casuale? è il segnale ricostruito completo all'iterazione o solo il coefficiente di ? Grazie. x 0 x n n n th xioX0XnnnesimoX
PR

1
@PR È il numero immaginario dell'unità, . -1
Peter K.

3

Ho avuto un po 'di fatica a capire la risposta di @edouard, che sta facendo la cosa giusta. Confronta con /signals//a/3410/9031 , che ho usato per implementare la mia ricostruzione.

Si noti che è il numero immaginario e è il segnale ricostruito all'iterazione . Inizia con è un vettore casuale di lunghezza del segnale audio. Per me sono state sufficienti alcune iterazioni per ottenere un risultato che suonasse bene. L'errore assoluto al segnale originale era tuttavia piuttosto elevato. Anche lo spettrogramma generato che ho generato dal segnale ricostruito, sebbene mostrasse le stesse strutture in generale, aveva dimensioni piuttosto diverse.x n n th x 0ioXnnesimoX0


2

È possibile utilizzare lo spettrogramma ricostruito rispetto allo spettrogramma originale per progettare un filtro la cui risposta di magnitudine trasforma uno spettrogramma nell'altro. È quindi possibile applicare questo filtro ai dati del dominio del tempo originale o agli FFT originali per sovrapporre aggiungere / salvare filtri di convoluzione rapidi.


|S||S||S^|

2
Una matrice spettrografica è in perdita, quindi non può essere utilizzata per la ricostruzione. Ma se è possibile decodificare una trasformazione per produrre lo spettrogramma desiderato, è possibile applicarla ai dati del dominio del tempo non lossy originali o eventualmente al risultato complesso originale FFT.
hotpaw2,

S|S||S|

1
@ user76170 In sostanza, è necessario il complesso STFT prima di poter ricostruire il segnale. Se hai solo la grandezza STFT, questo non è abbastanza. Esistono eccezioni a questa regola, ma in genere è necessaria la complessa STFT, non solo la grandezza.
Tarin Ziyaee,

|S||S^|

-1

Usa l'algoritmo Griffin-Lim per invertire il segnale audio dallo spettrogramma, se non sei preoccupato per la complessità del calcolo.


Puoi per favore espandere un po 'la tua risposta? Forse aggiungendo un documento o un collegamento rappresentativo all'algoritmo e una breve spiegazione di come è rilevante per questa domanda (?)
A_A

Se capisco correttamente la tua domanda, in breve, vuoi ricostruire il segnale audio da uno spettrogramma senza usare le informazioni sulla fase originale. L'algoritmo Griffin-Lim richiede una matrice spettrografica come input e ricostruisce la fase in modo iterativo. Puoi fare riferimento al documento ieeexplore.ieee.org/document/1164317
Jitendra Dhiman,

Grazie per avermi fatto sapere. Giusto per chiarire questo punto. Questa risposta è apparsa sulla mia coda di recensioni come "bassa qualità". Le opzioni che ho in termini di "revisione" includono fornire commenti per "miglioramento". Affinché questa risposta sia in linea con il tipo di risposte comunemente riscontrate in DSP.SE, dovrebbe andare un po 'nell'algoritmo Griffin Lim per mostrare quanto sia rilevante per ciò che l'OP sta chiedendo. Eventuali modifiche future, puoi applicare direttamente alla tua risposta. Il punto non è quello di soddisfare "me" in particolare, è avere una serie significativa di risposte illuminanti a una domanda
A_A

La migliore risposta è qui (usando Griffin-Lim) nel caso in cui non si disponga di informazioni FFT originali. timsainb.github.io/…
Artemi Krymski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.