Hermitian Fourier 变换 (`numpy.fft.hfft()`) 的频率? (假设函数 `numpy.fft.hfftfreq()`)
Frequencies for Hermitian Fourier Transform (`numpy.fft.hfft()`)? (hypothetical function `numpy.fft.hfftfreq()`)
对于普通的 FFT,Numpy 实现了方法 fftfreq(n,d)
,它可以立即提供 FFT 的频率。但是,对于 Hermitian 变换 hfft
,缺少伴随函数 hfftfreq
。如果函数 hfftfreq(n,d)
存在,它的返回值是多少?
来源:
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
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()
结果关联的“频率”。
然而,与信号逆变换相关的“频率”是信号样本的“时间”,它是从0
到n - 1
的自然数(n
信号的大小):
np.arange(n)
注意 ifft()
和 irfft()
(和 hfft()
)的样本是相同的。
相反,与ihfft()
的结果关联的样本由np.fft.rfftfreq()
给出。
对于普通的 FFT,Numpy 实现了方法 fftfreq(n,d)
,它可以立即提供 FFT 的频率。但是,对于 Hermitian 变换 hfft
,缺少伴随函数 hfftfreq
。如果函数 hfftfreq(n,d)
存在,它的返回值是多少?
来源:
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
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()
结果关联的“频率”。
然而,与信号逆变换相关的“频率”是信号样本的“时间”,它是从0
到n - 1
的自然数(n
信号的大小):
np.arange(n)
注意 ifft()
和 irfft()
(和 hfft()
)的样本是相同的。
相反,与ihfft()
的结果关联的样本由np.fft.rfftfreq()
给出。