如何將聲學的spectrogram(聲譜圖)從新反變換成時域語音信號

最近在研究一些信號分析的事情,感興趣如何將頻譜信號反變換成時域信號。fft 與ifft能夠順暢的轉變,可是這個是一幀信號,當時間較長的信號再一塊兒是,經過反變換變成一幀一幀的時域信號,如何把他們拼接起來很是感興趣,之後會作一些嘗試,這裏先留個檔案。windows

1.將聲音轉化爲聲譜圖(Spectrogram)數組

經過短時傅里葉變換。函數

2.將聲譜圖轉換爲聲音3d

1. 經過ifft將一幀一幀的FFT信號(即1維的FFT信號數組X(F)(i)[ i=0 to length( X(f) ) ])變換成一小段一小段的時域信號,再將他們拼接起來。(加窗和overlap是否帶來影響及相位是否丟失?)orm

 

下面打算經過labview或matlab去實現。(原本想查閱了相關資料借鑑一下,沒有找到相關的資料,因此打算本身去嘗試下下面的處理,若是有知道的還請告訴我相關的資料或方法,借鑑一下,謝謝)blog

第一步是找一個語音信號,將其轉換爲STFT的Spectrogram,io

第二步是將他還原回去一幀一幀的聲學信號,並拼接成語音信號,看語音信號是否能1. 語音是否能還原,2平滑過渡,3相位是否會丟失。(2019-12-15,完成後再來更新)class

 

2019-12-05 當天使用Labview 嘗試了一下。今天公司聖誕放假,有空更新一下 (2019-12-25)音頻

1.找了windows裏一段語音 alarm.wav 時域信號以下map

圖1. 音頻時域圖

 

 經過labview 中的STFT 函數進行頻譜分析。 

圖2. STFT 函數圖

 

 其中關於STFT函數

 

 

 Labview 中STFT分幾個步驟

1. K points 由 frquency bins 決定。即每次截取K個點,此例中8192個點。決定了FFT後的截止頻率爲1/2* frequency bins;

2. 加窗函數,類型 Type 這裏使用漢寧窗,length 決定了數據點在長度範圍外爲0值

3. time step 決定了數據塊往前進的速度,他與加窗length,共同決定了數據塊中overlap的值

獲得圖3 STFT 聲譜圖,實際是一個2維數組。

圖3. STFT 聲譜圖

 

嘗試將這個2D數組還原成時域音頻信號,看是否可以高保真還原。

將這個2D數組(i*j大小)的FFT數據依次取出,進行i-fft(FFT 逆變換),獲得FFT前的時域信號(此時是時域信號加過窗的數據。)。將這些數據再依次拼接出來,回放聲音,發現不對。原來是這些數據1. 加過窗了,2,有重複冗餘(OVERLAP的緣由),

應該每次從逆變換的時域信號中只取time step個數的數據點,怎麼取?假設i-fft後的數據長度爲N,則從第( 1/2*N取整 - 1/2* ( time step length)) 開始,取time step個數。

將j個時域信號的segment依次拼接起來,獲得從光譜圖轉化到的時域信號。從實驗的結果來看,這個轉化來的時域信號與原始信號相比,仍是能聽出來的,只是有一些失真,個人分析是因爲加窗帶來的,由於i-fft後獲得的是原始信號*窗函數的信號,這裏我並無將原始信號還原出來,主要是我嘗試了下,除以窗函數,並無效,因此還有待研究。

 

圖4. 聲譜圖經過i-fft還原的聲信號(能聽出來原始信號的內容,但略失真,失真程度受頻譜圖分析的 window length, time step ,frequency bins影響 )。

 

圖4. 將i-fft還原的聲信號再次作STFT獲得的聲譜圖。

下面會繼續研究,去除加窗函數的影響。

 

2020-01-01 更新

弄明白了一件事,就是短時傅里葉時, 生成的spectrogram 是X^2的信號,也就是說是複數的平方,丟失了相位信息,因此在上面作STFT逆變換時會有些失真(相位信息不對)。

若是使用STFT時,生成的colormap 是coef 矩陣(復實數)時,能夠反變換成時域信號而不失真。

感受利用這個性質,能夠作一些閾值濾波與信號加強。後續進行研究。

相關文章
相關標籤/搜索