先摘抄一段:
通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只包含正频率部分,而且这个复信号的实部正好就是我们原来的实值信号。简单的推导可知,复信号的虚部是原信号的希尔伯特变换。这样构造出来的信号就叫做解析信号。因此,如何生成解析信号与如何对一个信号进行希尔伯特变换其实是等价的问题。获得解析信号后可以计算波形的包络、瞬时频率、相位等,是非常有用的。
下面详细解释一下:
1,构造解析信号:
假设实值信号为,那么构建解析信号的过程如下图所示:
解析信号为
2,计算瞬时幅值、瞬时相位和瞬时频率
2.1 计算瞬时幅值
2.2 计算瞬时相位
2.3 计算瞬时频率
一旦知道了瞬时相位,信号的载波就可以被恢复出来,恢复出来的载波被称为temporal fine structure (TFS)。
3,matlab 代码
%Demonstrate extraction of instantaneous amplitude and phase from
%the analytic signal constructed from a real-valued modulated signal.
fs = 600; %sampling frequency in Hz
t = 0:1/fs:1-1/fs; %time base
a_t = 1.0 + 0.7 * sin(2.0*pi*3.0*t) ; %information signal
c_t = chirp(t,20,t(end),80); %chirp carrier
x = a_t .* c_t; %modulated signal
subplot(2,1,1); plot(x);hold on; %plot the modulated signal
z = hilbert(x); %form the analytical signal
inst_amplitude = abs(z); %envelope extraction
inst_phase = unwrap(angle(z));%inst phase
inst_freq = diff(inst_phase)/(2*pi)*fs;%inst frequency
%Regenerate the carrier from the instantaneous phase
regenerated_carrier = cos(inst_phase);
plot(inst_amplitude,'r'); %overlay the extracted envelope
title('Modulated signal & extracted envelope');xlabel('n');ylabel('x(t) & |z(t)|');
subplot(2,1,2); plot(cos(inst_phase));
title('Extracted carrier or TFS');xlabel('n'); ylabel('cos[\omega(t)]');
需要注意的是,matlab中hilbert函数,并不是求解Hilbert变换的结果,而是直接生成解析信号。
如果采用octave软件运行,需要先 pkg load signal