最近在研究一些信號分析的事情,感興趣如何將頻譜信號反變換成時域信號。fft 與ifft可以順暢的轉變,但是這個是一幀信號,當時間較長的信號再一起是,通過反變換變成一幀一幀的時域信號,如何把他們拼接起來非常感興趣,以后會做一些嘗試,這里先留個檔案。
1.將聲音轉化為聲譜圖(Spectrogram)
通過短時傅里葉變換。
2.將聲譜圖轉換為聲音
1. 通過ifft將一幀一幀的FFT信號(即1維的FFT信號數組X(F)(i)[ i=0 to length( X(f) ) ])變換成一小段一小段的時域信號,再將他們拼接起來。(加窗和overlap是否帶來影響及相位是否丟失?)
下面打算通過labview或matlab去實現。(本來想查閱了相關資料借鑒一下,沒有找到相關的資料,所以打算自己去嘗試下下面的處理,如果有知道的還請告訴我相關的資料或方法,借鑒一下,謝謝)
第一步是找一個語音信號,將其轉換為STFT的Spectrogram,
第二步是將他還原回去一幀一幀的聲學信號,並拼接成語音信號,看語音信號是否能1. 語音是否能還原,2平滑過渡,3相位是否會丟失。(2019-12-15,完成后再來更新)
2019-12-05 當天使用Labview 嘗試了一下。今天公司聖誕放假,有空更新一下 (2019-12-25)
1.找了windows里一段語音 alarm.wav 時域信號如下

圖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 矩陣(復實數)時,可以反變換成時域信號而不失真。
感覺利用這個性質,可以做一些閾值濾波與信號增強。后續進行研究。
