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