为什么展开不给出单调阶段?
Why does unwrap not give a monotonic phase?
我正在玩分析信号,instantaneous frequency 的计算经常会产生负面结果。频率为负数是令人不安的。
虽然 "instantaneous frequency" 的概念在数学上没有严格的意义,但从希尔伯特阶段推导它是很常见的。
甚至不涉及数学细节,对每个人来说应该有意义的一件事是假设它与希尔伯特相位的导数成正比,如果相位是单调递增的,它应该总是非负的。
我认为 Matlab 的 unwrap
函数的主要目的正是为了确保相位单调递增。从随机信号的简单实验(见下文),绘制 unwrap
返回的结果,它似乎无论如何都是它的目标。我的问题是:
- 为什么
unwrap
不给出单调递增相位?
- 如下例所示,平滑
unwrap
的输出似乎显着减少了局部最小值的数量;是否有平滑的 "monotonic filter" 可以手动应用以确保相位单调递增?
显示随机信号展开相位上具有负导数的点的示例代码:
% 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;
在您的示例中,问题不在于解包,而是信号中的大量噪声。您的信号有规律地跳跃 > pi/2 / 步,标准偏差 > pi/4。在这种情况下,您不会对像 unwrap 这样的简单算法无法确定跳跃的方向感到惊讶。
Unwrap 假定所有跳跃 x > pi,实际上是大小为 x - 2*pi 的跳跃。如果您事先了解跳跃的行为方式,并且 unwrap 不能满足这些要求,那么请编写您自己的 unwrap。 Unwrap 只有大约 5 行 "real" 代码。可以通过matlab命令edit unwrap
看到这个源码
我正在玩分析信号,instantaneous frequency 的计算经常会产生负面结果。频率为负数是令人不安的。
虽然 "instantaneous frequency" 的概念在数学上没有严格的意义,但从希尔伯特阶段推导它是很常见的。 甚至不涉及数学细节,对每个人来说应该有意义的一件事是假设它与希尔伯特相位的导数成正比,如果相位是单调递增的,它应该总是非负的。
我认为 Matlab 的 unwrap
函数的主要目的正是为了确保相位单调递增。从随机信号的简单实验(见下文),绘制 unwrap
返回的结果,它似乎无论如何都是它的目标。我的问题是:
- 为什么
unwrap
不给出单调递增相位? - 如下例所示,平滑
unwrap
的输出似乎显着减少了局部最小值的数量;是否有平滑的 "monotonic filter" 可以手动应用以确保相位单调递增?
显示随机信号展开相位上具有负导数的点的示例代码:
% 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;
在您的示例中,问题不在于解包,而是信号中的大量噪声。您的信号有规律地跳跃 > pi/2 / 步,标准偏差 > pi/4。在这种情况下,您不会对像 unwrap 这样的简单算法无法确定跳跃的方向感到惊讶。
Unwrap 假定所有跳跃 x > pi,实际上是大小为 x - 2*pi 的跳跃。如果您事先了解跳跃的行为方式,并且 unwrap 不能满足这些要求,那么请编写您自己的 unwrap。 Unwrap 只有大约 5 行 "real" 代码。可以通过matlab命令edit unwrap