测量解析信号的算法(希尔伯特变换)如何最终为我们提供复数值?

信息处理 IFFT 希尔伯特变换 分析信号
2022-02-21 09:47:57

我对以下用于测量解析信号(希尔伯特变换)的代码有疑问。这里,时域信号(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()
2个回答

(虽然我们期望它是真实的)。

我们当然没想到这是真的。恰恰相反:实时域信号的频谱是共轭对称的。将负频率归零,我们显然打破了这种对称性,这意味着分析信号必须是复杂的(除了平凡的情况 ax[n]=const)

一般来说,对于 FT,为了使 DFT 或 IDFT 的结果为实数,波形必须是实数和偶数(关于垂直轴对称)或虚数和奇数(关于垂直轴反对称),或者由这些成分的总和。

下面详述的带有余弦和连续时间傅里叶变换的简单示例应该将其作为广义傅里叶属性明确,并且通过显示频谱上半部分的频率索引等效于负频率,这很容易扩展到 DFT:ejnk/N=ej(Nn)k/N.

考虑波形cos(ω1t)欧拉公式也是0.5ejω1t+0.5ejω1t每个都是随时间旋转的复相量,如下图所示。这些相量中的每一个都代表频率中的单个脉冲(作为ejω1t2πδ(ωω1))但重要的是要注意它们如何及时添加到始终是真实的(与cos(ωt)一样真实。下面的每个相量根据它们的旋转方向映射到一个正负频率,并且通过以相等和相反的方向旋转,总和将始终落在实轴上。

如果在频域中移除这些分量之一,逆变换将等效地产生一个自旋相量,这将是一个复数。例如,如果我们去除傅里叶变换中的负频率分量,结果将是ejωt=cos(ωt)+jsin(ωt).

余弦