我正在使用分析信号,而instantaneous frequency的计算通常会产生负面结果。对于一个频率来说,这是令人不安的。
虽然"瞬时频率"在数学上没有严格的意义,从希尔伯特阶段推导它是很常见的。 在没有进入数学细节的情况下,对每个人都应该有意义的一点是假设它与希尔伯特相的导数成正比,如果相位是单调递增的话,它应该总是非负的。
我认为Matlab的unwrap
功能的主要目的正是为了确保相位单调增加。从随机信号的简单实验(见下文),绘制unwrap
返回的结果,无论如何它似乎都是它的目标。我的问题是:
unwrap
没有给出单调的增加阶段?unwrap
的输出似乎会显着减少局部最小值;是否有一个平滑的"单调滤波器"我可以手动应用以确保相位单调增加?示例代码显示随机信号的展开阶段具有负导数的点:
% generate a random signal and compute its Hilbert phase
x = rand(1000,1);
a = unwrap(angle(hilbert( detrend(x,'constant') )));
% uncomment to smooth the unwrapped phase
% a = medfilt1(a,10); n = find(diff(a) < 0);
% show the unwrapped phase in a plot along with points where the derivative is < 0
da = gradient(a);
neg = find( da < 0 );
mean( -da(neg) ) % average magnitude of negative gradients
plot(a,'Linewidth',1.5); hold on;
plot(neg,a(neg),'ro'); hold off;
答案 0 :(得分:1)
在您的示例中,您的问题不在于解包,您的问题在于信号中的大量噪音。你的信号经常跳跃&gt; pi / 2 /步,标准偏差> π/ 4。在这种情况下,像unwrap这样的简单算法无法确定跳转应该是哪个方向,你也不会感到惊讶。
Unwrap假设所有跳跃x> pi,实际上是大小为x - 2 * pi的跳跃。如果您事先了解跳跃必须如何表现,并且展开并不满足这些,那么请编写自己的展开。展开仅约5行&#34;真实&#34;码。您可以通过matlab命令edit unwrap