我对以下用于测量解析信号(希尔伯特变换)的代码有疑问。这里,时域信号(x)是实数值信号。制作 fft 后,它变得复杂 (X)。然后乘以 h(一个与 X 大小相同的实向量,上半部分为实数,下半部分为 0)。X*.h 显然很复杂。然后我们在 X*.h 上进行了 ifft,但令人惊讶的是,输出又是一个复杂的信号(虽然我们预计它是真实的)。那是怎么发生的?有人可以向我解释一下吗?h 有什么特别的吗?换句话说,我们在 fft 期间将实信号与 exp-j(2*pi/k) 相乘,并j(2*pi/k) 在 ifft 期间将其与 exp 再相乘一次。这两个应该互相残杀,给我们一个真正的输出,不是吗?
def main():
t = np.arange(start=0,stop=0.5,step=0.001)
x = np.sin(2*np.pi*10*t)
z = analytic_signal(x)
def analytic_signal(x):
from scipy.fftpack import fft,ifft
N = len(x)
X = fft(x,N)
h = np.zeros(N)
h[0] = 1
h[1:N//2] = 2*np.ones(N//2-1)
h[N//2] = 1
Z = X*h
z = ifft(Z,N)
return z
if __name__ == '__main__':
main()
