python - Hermitian Fourier Transform (`numpy.fft.hfft()`) 的频率? (假设函数`numpy.fft.hfftfreq()`)

对于普通的 FFT,Numpy 实现方法 fftfreq(n,d),它立即提供 FFT 的频率。但是,对于 Hermitian 变换 hfft,缺少伴随函数 hfftfreq。如果函数 hfftfreq(n,d) 存在,返回的 values 会是什么?

资料来源:

numpy.fft.fftfreq: https://numpy.org/doc/stable/reference/generated/numpy.fft.fftfreq.html

Discrete Fourier Transform (numpy.fft): https://numpy.org/doc/stable/reference/routines.fft.html

回答1

hfft() / ihfft() 对分别等效于 irfft() / rfft() 对,但归一化除外。

特别是,np.fft.hfft(arr, n, norm='forward')np.fft.irfft(arr, n, norm='backward') 相同(backward 规范是默认值)。

import numpy as np


n = 3
k = 2 * (n - 1)
s = np.arange(n)
print(s.astype(np.complex_))
# [0.+0.j 1.+0.j 2.+0.j]

irft_s = np.fft.irfft(s, k)
print(irft_s)
# [ 1.  -0.5  0.  -0.5]
print(np.fft.irfft(s, k, norm='forward'))
# [ 4. -2.  0. -2.]

hft_s = np.fft.hfft(s, k)
print(hft_s)
# [ 4. -2.  0. -2.]
print(np.fft.hfft(s, k, norm='forward'))
# [ 1.  -0.5  0.  -0.5]
print(hft_s / k)
# [ 1.  -0.5  0.  -0.5]
# : get back to the original signal via the respective inverses
rr_s = np.fft.rfft(irft_s)
hh_s = np.fft.ihfft(hft_s)
print(rr_s, np.allclose(s, rr_s))
# [0.+0.j 1.+0.j 2.+0.j] True
print(hh_s, np.allclose(s, hh_s))
# [0.-0.j 1.-0.j 2.-0.j] True
# : get back to the original signal via the mixed inverses
hr_s = np.fft.rfft(hft_s, norm='forward')
rh_s = np.fft.ihfft(irft_s, norm='forward')
print(hr_s, np.allclose(s, hr_s))
# [0.+0.j 1.+0.j 2.+0.j] True
print(rh_s, np.allclose(s, rh_s))
# [0.-0.j 1.-0.j 2.-0.j] True

因此,与 hfft() 的结果相关联的频率实际上是与 irfft() 的结果相关联的“频率”。然而,与信号逆变换相关的“频率”是信号样本的“时间”,它们是从 0n - 1 的自然数(n 是信号的大小) :

np.arange(n)

请注意,ifft()irfft()(和 hfft())的样本是相同的。

相反,与 ihfft() 的结果相关联的样本由 np.fft.rfftfreq() 给出。