一、解析信号

1. 定义

        解析信号没有负频率分量的复值函数,解析信号的实部和虚部是由希尔伯特变换相关联的实值函数。

2. 概念

希尔伯特变换python代码 求希尔伯特变换_希尔伯特变换python代码

3. 性质

        解析信号有如下性质:

(1)实部和虚部功率谱相同;

(2)实部和虚部自相关函数相同;

(3)实部和虚部的互相关函数是奇函数;

(4)解析信号的频谱只有正频段,且幅值变为原来的 2 倍(实现了由双边谱转变为单边谱);

(5)解析信号的功率谱也只有正频段,强度变为原来的 4 倍。

二、希尔伯特变换

1. 定义

        一个实值函数 x(t) 的希尔伯特变换是 x(t) 和 1/Πt 的卷积。因此希尔伯特变换的结果就是输入信号 x(t) 经过一个线性时不变系统(LTI)之后的输出,该线性时不变系统的脉冲响应为 1/Πt。

        信号经过希尔伯特变换之后,频域内各频率成分的幅值不变,但相位出现 90° 相移。即正频率滞后 Π/2,负频率导前 Π/2,因此希尔伯特变换器又称 90° 移相器。

2. 公式推导

希尔伯特变换python代码 求希尔伯特变换_傅里叶变换_02

3. 性质

        希尔伯特变换器又称 90° 移相器,如下图。两次希尔伯特变换之后,原信号相位翻转了 180°,四次希尔伯特变换之后又变回本身。

希尔伯特变换python代码 求希尔伯特变换_希尔伯特变换python代码_03

        Hilbert 变换有如下性质:

希尔伯特变换python代码 求希尔伯特变换_希尔伯特变换python代码_04

三、Hilbert解调原理

1. 信号解调

        信号解调是信号调制的反过程,是从已调制的高频信号中解调出原调制信号。信号调制包括调幅、调频、调相,因此信号解调的目的是:根据已有信号,提取出信号的包络、相位、频率信息。


2. 欧拉公式(Euler's formula)

希尔伯特变换python代码 求希尔伯特变换_傅里叶变换_05

3. 希尔伯特调制原理

希尔伯特变换python代码 求希尔伯特变换_信号处理_06

        总结 Hilbert 解调步骤:

希尔伯特变换python代码 求希尔伯特变换_傅里叶变换_07

4. 希尔伯特解调的意义

        我的疑问是:为什么要对已知的信号进行解调才能得到幅值、相位和频率信息?

        解答:

因为在实际问题中,我们只知道实数信号 希尔伯特变换python代码 求希尔伯特变换_傅里叶变换_08

 的结果,而不知道其具体形式,所以没有办法直接根据信号公式得到这些信息,所以就用到了希尔伯特解调原理~


四、Hilbert解调小栗子

%% 
clear; clc; close all; warning off;

%% 生成调制信号
fs = 400;  % 采样频率
Ts = 1 / fs;
N = 400;  % 观测时长
t = (0 : N-1) * Ts;

fa = 5;  % 调幅单频
fp = 10;  % 调相单频
fc = 30;  % 载波单频

a = 1 + 0.5 * cos(2 * pi * fa * t);  % 调幅包络
b = 0.5 * sin(2 * pi * fp * t);  % 调相
c = cos(2 * pi * fc * t);  % 载波
s = a .* cos(2 * pi * fc * t + b);  % 调制信号


%% Hilbert分析 
s_analy = hilbert(s);  % Matlab的hilbert命令得到的是解析信号
sh = imag(s_analy);  % 调制信号的希尔伯特变换
envelope = abs(s_analy);  % 解析信号包络的绝对值
angle = unwrap(angle(s_analy));  % 解析信号的相位
fi = diff(angle) / 2 / pi * fs;  % 瞬时频率

% 作图
figure;
subplot(2, 2, 1);plot(t, a); title('包络(调幅信号)');
subplot(2, 2, 2); plot(t, b); title('调相信号');
subplot(2, 2, 3); plot(t, c); title('载波');
subplot(2, 2, 4); 
plot(t, s, 'b'); hold on;
plot(t, sh, 'r--'); hold off;
legend('调制结果', '调制信号的希尔伯特变换'); title('调制信号');


%% FFT分析
NFFT = 2 ^ nextpow2(N);
f = (0 : NFFT-1) / NFFT * fs;

sFFT = fft(s, NFFT);  % 原始信号FFT
saFFT = fft(s_analy, NFFT);  % 解析信号FFT
envFFT = fft(envelope, NFFT);  % 包络的FFT

figure;
subplot(3, 2, 1); 
plot(t, envelope); hold on;
plot(t, a, '--'); hold off; 
legend('瞬时包络绝对值', '真实包络'); title('瞬时包络');
subplot(3, 2, 2); plot(t, angle); title('瞬时相位');
subplot(3, 2, 3); plot(t(2:end), fi); title('瞬时频率');
subplot(3, 2, 4); plot(f, abs(sFFT)); title('原始信号FFT');
subplot(3, 2, 5); plot(f, abs(saFFT)); title('解析信号FFT');
subplot(3, 2, 6); plot(f, abs(envFFT)); title('包络的FFT');

希尔伯特变换python代码 求希尔伯特变换_脉冲响应_09

希尔伯特变换python代码 求希尔伯特变换_调相_10

       可以看出,解析信号的频谱是单边谱,且幅值是原始实数信号频谱幅值的两倍。另一方面,希尔伯特解调之后存在边界效应,即边界误差较大。