我正在计算一些依赖于希尔伯特变换的信号,并且在遵循各种在线指南和 SO 之后,我的函数如下所示:
void Hilbert_Transf(COMPLEX *cplx_data, const int LENGTH)
{
float Imag_Val = 0.0f;
for(int i = 0; i < LENGTH; i++)
{
Imag_Val = cplx_data[i].y;
cplx_data[i].y = (Imag_Val > 0 ? -PI / 2 : (Imag_Val < 0 ? PI / 2 : 0));
}
}
它本质上是测试虚数值是否为正,因此将其替换为 -PI / 2,如果为负,则替换为 PI / 2,如果为 0,则替换为 0。为了测试该函数,我使用了正弦波,计算公式为:
const int LENGTH = 1024;
float input[LENGTH];
for(int i = 0; i < LENGTH; i++)
input[i] = sin(i * 2 * PI * 0.01);
FFT 过程通过 Intel MKL,所以在上面的函数中,我只是认为 COMPLEX *cplx_data 是 MKL 采用的形式的复数,成员 .y 是它的虚部。然后我将输入数据(正弦波)和 HT 输出写入文件,并绘制它们。
因此,您可以看到蓝色的输入正弦和红色的 HT,以及“锯齿状”波峰、波谷。我没想到这种“阶梯式”行为。你们能告诉我什么是错的/缺少的,应该怎么做?如果您需要更多信息,请告诉我。
========== 编辑 ===========
Matt L.,按照您的脚本,这是一个看起来更体面的情节的结果:
蓝色是输入,红色是输出。我当然会找到一种方法在 C 中重现它,但我会就评论提出更多问题,以便我们关闭它。