补偿希尔伯特变换的相移

信息处理 阶段 转换 时频 八度 希尔伯特变换
2022-02-08 02:46:37

我正在使用 Octave 并尝试使用时频工具箱中的“instfreq”功能,该功能需要分析信号输入。为了得到这个分析信号,我在我的实值信号上使用了 Octave 函数“hilbert”:

analytic_sig = hilbert( my_real_valued_signal ) ;
[ instf, t ] = instfreq( analytic_signal ) ;

其中 instf 是我试图获得的瞬时频率。然而,结果并不完全符合我的预期。我怀疑希尔​​伯特变换引起的 90 度相移是问题所在,所以我的问题是如何改变 Octave“希尔伯特”函数的输出来补偿/调整这个相移?

根据评论进行编辑

通过一个简单的测试用例,我正在创建一个具有瞬时频率 ifl 的信号 x

octave:1> [x ifl] = fmlin(10,0.05,0.35)
x =

  -0.97815 - 0.20791i
  -0.80902 - 0.58779i
  -0.30902 - 0.95106i
   0.50000 - 0.86603i
   1.00000 + 0.00000i
   0.30902 + 0.95106i
  -0.91355 + 0.40674i
  -0.30902 - 0.95106i
   1.00000 - 0.00000i
  -0.50000 + 0.86603i

ifl =

   0.050000
   0.083333
   0.116667
   0.150000
   0.183333
   0.216667
   0.250000
   0.283333
   0.316667
   0.350000

但在我设想的现实生活应用程序中,我将只有真实组件的数据

octave:2> real_sig = real(x)
real_sig =

 -0.97815
 -0.80902
 -0.30902
  0.50000
  1.00000
  0.30902
 -0.91355
 -0.30902
  1.00000
 -0.50000

使用希尔伯特函数,我从可用的真实数据中创建了一个分析信号

octave:3> anal_sig = hilbert( real_sig )
anal_sig =

  -0.97815 + 0.07265i
  -0.80902 - 0.41187i
  -0.30902 - 0.92331i
   0.50000 - 0.81514i
   1.00000 + 0.04490i
   0.30902 + 0.98765i
  -0.91355 + 0.52573i
  -0.30902 - 0.89042i
   1.00000 + 0.28002i
  -0.50000 + 1.12978i

当它被放入 instfreq 函数时,我得到测量的瞬时频率 instf

octave:4> instf = instfreq( anal_sig )
instf =

   0.10520
   0.13131
   0.15427
   0.18209
   0.20487
   0.24755
   0.31328
   0.30974

instfreq 函数返回其输入范围 [2:end-1] 内的值,因此填充以便于比较

octave:5> [ ifl [ 0 ; instf ; 0 ] ]
ans =

   0.05000   0.00000
   0.08333   0.10520
   0.11667   0.13131
   0.15000   0.15427
   0.18333   0.18209
   0.21667   0.20487
   0.25000   0.24755
   0.28333   0.31328
   0.31667   0.30974
   0.35000   0.00000

可以看出,测得的频率与真实的已知频率不同。想到相量图,我在想也许希尔伯特函数输出的实部和虚部的一些三角操作可能会纠正这个问题。

2个回答

1)希尔伯特变换具有非常长的脉冲响应(高于某个给定的本底噪声),因此您需要大量数据来生成分析信号,否则您将没有足够的数据跨越希尔伯特脉冲响应滤波器的宽度没有严重的边缘截断效应。

2) 这种类型的人工近似分析信号的瞬时频率估计可能非常嘈杂,因此通常必须进行低通滤波以显着低于采样率的一半。

你的结果一点也不错误或奇怪。请注意,函数“希尔伯特”只能近似希尔伯特变换。此外,函数“instfreq.m”只能估计瞬时频率。毕竟,你的估计和原始估计之间的相对误差真的一点也不大(显然除了第一个和最后一个值之外)。