查看“︁Griffin-Lim演算法”︁的源代码
←
Griffin-Lim演算法
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{noteTA |G1=Signals and Systems |G2=IT }} '''Griffin-Lim演算法'''({{lang-en|Griffin-Lim algorithm,Griffin-Lim signal estimation algorithm}}),又稱'''Griffin-Lim訊號估計算法'''、'''葛氏林氏演算法'''。 該演算法於1984年由Daniel W. Griffin和Jae S. Lim提出<ref>D. Griffin and Jae Lim, "Signal estimation from modified short-time Fourier transform," in IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 32, no. 2, pp. 236-243, April 1984. </ref>,是一種從[[短時距傅立葉變換]]的大小({{lang|en|short-time Fourier transform magnitude}}, STFTM)重建訊號的演算法。 在做語音任務時,如[[語音合成]],[[語者轉換]]等,通常都是生成或修改目標信號的[[時頻譜]]。 因缺少[[相位]]資訊,無法直接從時頻譜還原回聲音訊號,且由於每一幀(frame)時頻譜與相鄰幀的時頻譜在時間上有所重疊,因此具有相互關係,對應的相位在幀與幀之間也應有相關聯性,故無法直接使用任意隨機的相位數值來重建訊號。 然而直接從時頻譜估計相位並不容易,Griffin-Lim演算法使用了[[迭代]]的方式,從給定時頻譜去重建相位資訊,其迭代目標是讓重建訊號的時頻譜與給定的時頻譜的均方誤差越小越好。 ==演算法概述== 給定一時頻譜<math>S </math>,欲重建一訊號,使此重建訊號的時頻譜愈接近<math>S </math>愈好。 設<math>x_{i} </math>是第i次重建的訊號,<math>f </math>為短時距傅立葉變換,<math>f^{-1} </math>是反短時距傅立葉變換。 <math>S_{i} </math>、<math>P_{i} </math>分別代表<math>x_{i} </math>的短時傅立葉轉換的大小及相位,即 <math>f(x_{i}) = S_{i}e^{jP_{i}}, j = \sqrt -1 </math>。 重建過程如下, 1. 隨機初始化<math>P_{0} </math>,則<math>x_{0} = f^{-1}(Se^{jP_{0}}) </math> 在第i次迭代 2. 對<math>x_{i} </math>作時頻分析取得大小及相位,<math>f(x_{i}) = S_{i}e^{jP_{i}} </math> 3. 將<math>S_{i}e^{jP_{i}} </math>中的大小<math>S_{i} </math>以<math>S </math>取代 4. 重建訊號,<math>x_{i+1} = f^{-1}(Se^{jP_{i}}) </math> 5. 重複步驟2~4,直到滿足迭代停止條件 ==實作== === Python實作 === 以下代碼示範使用numpy及librosa套件來實作Griffin-Lim演算法。 其中S是欲產生訊號的時頻譜,n_iter是演算法迭代次數,n_fft是頻格(frequency bin)大小,hop_length是窗函數每次移動的長度,window是短時距傅立葉變換的[[窗函數]]類型。<ref>{{Cite web |url=https://github.com/librosa/librosa/issues/434 |title=存档副本 |accessdate=2020-01-14 |archive-date=2020-11-21 |archive-url=https://web.archive.org/web/20201121221116/https://github.com/librosa/librosa/issues/434 |dead-url=no }}</ref> <syntaxhighlight lang="python"> def GLA(S, n_iter = 100, n_fft = 2048, hop_length = None, window = 'hann'): hop_length = n_fft//4 if hop_length is None else hop_length phase = np.exp(2j*np.pi*np.random.rand(*S.shape)) for i in range(n_iter): xi = np.abs(S).astype(np.complex)*phase signal = librosa.istft(xi, hop_length = hop_length, window = window) next_xi = librosa.stft(signal, n_fft = n_fft, hop_length = hop_length, window = window) phase = np.exp(1j*np.angle(next_xi)) xi = np.abs(S).astype(np.complex)*phase signal = librosa.istft(xi, hop_length = hop_length, window = window) return signal </syntaxhighlight> ==參見== * [[相位聲碼器]] * [[LWS演算法]]<ref>Le Roux, Jonathan & Kameoka, Hirokazu & Ono, Nobutaka & Sagayama, Shigeki. (0002). Fast Signal Reconstruction from Magnitude STFT Spectrogram based on Spectrogram Consistency. </ref> * [[類神經聲碼器]] == 参考文献 == {{Reflist}} [[Category:数字信号处理]]
该页面使用的模板:
Template:Cite web
(
查看源代码
)
Template:Lang
(
查看源代码
)
Template:Lang-en
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Reflist
(
查看源代码
)
返回
Griffin-Lim演算法
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息