为什么展开不会给出单调阶段?

时间:2016-02-22 15:18:55

标签: matlab derivative phase

我正在使用分析信号,而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;

1 个答案:

答案 0 :(得分:1)

在您的示例中,您的问题不在于解包,您的问题在于信号中的大量噪音。你的信号经常跳跃&gt; pi / 2 /步,标准偏差> π/ 4。在这种情况下,像unwrap这样的简单算法无法确定跳转应该是哪个方向,你也不会感到惊讶。

Unwrap假设所有跳跃x> pi,实际上是大小为x - 2 * pi的跳跃。如果您事先了解跳跃必须如何表现,并且展开并不满足这些,那么请编写自己的展开。展开仅约5行&#34;真实&#34;码。您可以通过matlab命令edit unwrap

查看此源代码