时频分析之S变换
时频分析之S变换
S变换原理解析
S变换的提出
1996年,由R.G Stockwell 提出了S变换,和其他时频分析工具一样,通过S变换,我们可以同时从时域以及频域观察一个信号的能量分布。S变换融合了短时傅里叶变换和小波变换的优点。关于S变换,最早发表于TSP上的文章Localization of the complex spectrum: the S transform:
Stockwell R G , Mansinha L , Lowe R P . Localization of the complex spectrum: the S transform[J]. IEEE Transactions on Signal Processing, 2002, 44(4):998-1001.
S变换采用高斯函数作为窗,且该时间窗和频率有关,在低频部分时窗较大,在高频部分时窗时窗较小。作为线性时频分析方法,它的频率分辨率和时间分辨率无法同时达到最优。
由于在高频时,时窗较小,当信号在高频比较丰富时,S变换得到的时频分辨率就会出现比较严重的混叠现象。
S变换的定义
对应信号$x(t) \in L^2(R)$,$L^2(R)$为能量有限函数空间,$x(t)$的S变换的表达式为
$$
S(\tau,f)=\int_{-\infty}^{+\infty}x(t)\frac{|f|}{\sqrt{2\pi}}\mathrm{e}^{-\frac{(t-\tau)^2f^2}{2}}\mathrm{e}^{-j2\pi ft}dt
$$
式中,$x(t)$是关于时间的连续函数,$\tau$是一个控制参数,用来确定高斯窗在时间轴上的位置,$f$是频率。其中高斯窗函数定义为:
$$
\omega(t,f)=\frac{1}{\sigma(f)\sqrt{2\pi}}\mathrm{e}^{-\frac{t^2}{2\sigma(f)^2}}
$$
窗口的标准差为:
$$
\sigma(f)=\frac{1}{|f|}
$$
由上式可以看出,标准差$\sigma(f)$为频率的函数,取值为绝对值的倒数。由此可知$\omega(t,f)$会随着频率的变换而自适应调整。
图1 不同频率对应的时窗
可以看到,随着频率的增大,高斯窗的方差逐渐减小,窗的宽度也随之变小。因此时窗宽度与频率成反比。此外,S变换还具有不受线性交叉项的影响和无损可逆性的优点,即可根据S变换得到的时频分布无损地还原被分析的时域信号。
因此S变换的时频分辨率和频率的关系入下:
- 在处理低频信号时,S变换的窗口较宽,这有助于捕捉低频信号的细微变化,从而提高频率分辨率。
- 相反,在处理高频信号时,S变换的窗口较窄,这有助于精确地定位高频信号的时间位置,从而提高时间分辨率。
S变换实例
下面我们对一个线性调频信号进行测试
SampFreq = 1000; %采样频率
t = 0 : 1/SampFreq : 1;
LFM_k0 = -200; % 调频斜率
LFM_f0 = 300; % 载频
LFM_A0 = exp(-0.5*t); % 调幅
Sig = LFM_A0.*cos(2*pi*(LFM_f0*t+(LFM_k0/2)*t.^2)); %线性调频信号
对线性调频信号Sig进行绘制:
figure
plot(t,Sig,'linewidth',1);
xlabel('Time(s)');ylabel('Amplitude');
title('原始数据');
图2 线性调频信号的时域波形
调用st()函数进行S变换,st()函数的matlab代码可以参考S变换matlab实现
ST = st(Sig); %进行S变换
fre = 1 : 1 : SampFreq / 2;
figure; %绘制时频图
imagesc(t,fre,abs(ST));
colormap('parula'); %指定色系:parula、turbo、jet等等
colorbar; %显示图像的颜色条,提供对图像色彩和值的对应
xlabel('Time(s)');ylabel('Frequency(Hz)');
title('S变换');
axis xy; %设置为普通坐标形式
图3 线性调频信号的时频分布
可以看到,由于线性调频信号的调频斜率为负数,因此沿着时间轴信号的瞬时频率逐渐减小,在高频处存在明显的频率发散现象。
S逆变换
由S变换的结果$S(\tau,f)$,可以通过逆变换得到时域信号:
$$
s(t)=\int_{-\infty}^{+\infty}\left{\int_{-\infty}^{+\infty}S(\tau,f)d\tau\right}\mathrm{e}^{j2\pi ft}df
$$
测试程序入下:
figure
restore = real(inverse_st(ST));
plot(restore);
title('S逆变换');
图4 逆S变换结果