torch.fft.hfftn¶
- torch.fft.hfftn(input, s=None, dim=None, norm=None, *, out=None) Tensor ¶
計算 Hermitian 對稱
input
訊號的 n 維離散傅立葉變換。input
會被解讀為時域中的單邊 Hermitian 訊號。根據 Hermitian 特性,傅立葉變換的結果將會是實數值。注意
hfftn()
/ihfftn()
類似於rfftn()
/irfftn()
。實數 FFT 期望時域中的實數訊號,並在頻域中給出 Hermitian 對稱性。Hermitian FFT 則相反;在時域中是 Hermitian 對稱的,在頻域中是實數值的。因此,需要特別注意形狀引數s
,如同irfftn()
一樣。注意
某些輸入頻率必須是實數值才能滿足 Hermitian 特性。在這些情況下,虛數部分將被忽略。例如,零頻率項中的任何虛數部分都無法在實數輸出中表示,因此將始終被忽略。
注意
對 Hermitian 輸入的正確解讀取決於原始資料的長度,由
s
給出。這是因為每個輸入形狀可能對應於奇數或偶數長度的訊號。預設情況下,訊號被假定為偶數長度,奇數訊號將無法正確往返。建議始終傳遞訊號形狀s
。注意
在 GPU 架構 SM53 或更高版本的 CUDA 上支援 torch.half 和 torch.chalf。但是,它僅支援每個轉換維度中 2 的冪次的訊號長度。使用預設引數時,最後一個維度的大小應為 (2^n + 1),因為引數 s 預設為偶數輸出大小 = 2 * (last_dim_size - 1)
- 引數
input (Tensor) – 輸入張量
s (Tuple[int], optional) – 轉換維度中的訊號大小。如果給定,則在計算實數 FFT 之前,每個維度
dim[i]
都將被零填充或修剪到長度s[i]
。如果指定長度-1
,則不會在該維度中進行填充。預設為最後一個維度中的偶數輸出:s[-1] = 2*(input.size(dim[-1]) - 1)
。dim (Tuple[int], optional) – 要轉換的維度。最後一個維度必須是半 Hermitian 壓縮維度。預設值:所有維度,或如果給定
s
,則為最後len(s)
個維度。norm (str, optional) –
標準化模式。對於正向變換 (
hfftn()
),這些對應於"forward"
- 按1/n
進行標準化"backward"
- 不進行標準化"ortho"
- 按1/sqrt(n)
進行標準化(使 Hermitian FFT 正交)
其中
n = prod(s)
是邏輯 FFT 大小。使用相同的標準化模式呼叫反向變換 (ihfftn()
) 將在兩個變換之間應用1/n
的整體標準化。這是使ihfftn()
成為精確反函數所必需的。預設值為
"backward"
(不標準化)。
- 關鍵字引數
out (Tensor, optional) – 輸出張量。
範例
從實數頻域訊號開始,我們可以生成 Hermitian 對稱時域訊號: >>> T = torch.rand(10, 9) >>> t = torch.fft.ihfftn(T)
如果不指定
hfftn()
的輸出長度,則輸出將無法正確往返,因為輸入在最後一個維度中是奇數長度>>> torch.fft.hfftn(t).size() torch.Size([10, 10])
因此,建議始終傳遞訊號形狀
s
。>>> roundtrip = torch.fft.hfftn(t, T.size()) >>> roundtrip.size() torch.Size([10, 9]) >>> torch.allclose(roundtrip, T) True