基础时频分析方法及应用

前言

        隔振器的评价指标通常采用振动信号的频谱,主要有功率谱密度,诺莫等级图等。运动台的评价指标通常站在时域的角度,关注误差信号的时域大小和均方根误差等。在实际装备中,运动台和隔振台在同一个设备上联合控制,单纯从时域或者频域的指标衡量,并不能充分体现两者的性能。

        以隔振台为例,近似静态的系统中隔振台,主要考虑大地振动,其上加速度信号从时域角度看近似白噪声,从频域角度看低频分量得到显著的衰减。当在系统中加入运动台,运动台的运动过程中会产生明显的力扰动,在时域将有所体现。同时如果考虑长时间段的频谱,其包含了各个运动时刻力扰动的叠加,受到轨迹的影响较大,其不利于隔振器针对某些特殊运动状态下的隔振效果评判。例如运动台的启停时刻,相对来说力扰动更加剧烈,在匀速阶段相对来说力扰动较小。为了更好的综合评判性能,引入时频分析方法。

        本文采用分析软件为MATLAB,文章中的代码均为说明性质的伪代码,如需完整的仿真文件请通过邮箱联系我们。

目录

前言

1.短时傅里叶变换

2.小波变换


1.短时傅里叶变换

        傅里叶变换是经典的时频转换算法,其能够将时域信号的转化成频谱信息。传统的傅里叶分析将信号完全在展开,不包含任何的时域信息。

        传统的傅里叶分析函数有几个需要主要关心的核心参数:采样频率Fs,采样点数N,通常采样点数应该为2的幂次,在MATLAB中因为有现成的函数,其对采样点数的限制可以忽略。

采样时间:T=\frac{N}{Fs}

频谱分辨率:\Delta F=\frac{Fs}{N}=\tfrac{1}{T}

单边频谱范围:0\sim \frac{Fs}{2}

function [f,Amp]=HSERL_FFT_Analysis(time,signal)
    N=length(time);
    Fs=1/(time(2)-time(1));
    S=fft(signal);
    Mag=abs(S/N);
    Amp=Mag(1:N/2+1);
    Amp(2:end-1)=Amp(2:end-1);
    f=Fs/N*(0:(N/2));
end

        测试两种类型的变频信号,传统傅里叶变换无法对其进行分辨。

Fs=200;
Ts=1/Fs;
T=1;
t=0:Ts:T-Ts;

%%
figure
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*10*t(1:end/2));
y(end/2:end)=sin(2*pi*30*t(end/2:end));
subplot(2,2,1)
plot(t,y,"LineWidth",1)

[f,Amp]=HSERL_FFT_Analysis(t,y);
subplot(2,2,3)
plot(f,Amp,"LineWidth",2)

y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*30*t(1:end/2));
y(end/2:end)=sin(2*pi*10*t(end/2:end));
subplot(2,2,2)
plot(t,y,"LineWidth",1)

[f,Amp]=HSERL_FFT_Analysis(t,y);
subplot(2,2,4)
plot(f,Amp,"LineWidth",2)

%%
figure
y=chirp(t,1,1,20); 
subplot(2,2,1)
plot(t,y,"LineWidth",1)

[f,Amp]=HSERL_FFT_Analysis(t,y);
subplot(2,2,3)
plot(f,Amp,"LineWidth",2)

y=chirp(t,20,1,1); 
subplot(2,2,2)
plot(t,y,"LineWidth",1)

[f,Amp]=HSERL_FFT_Analysis(t,y);
subplot(2,2,4)
plot(f,Amp,"LineWidth",2)

         短时傅里叶变换是在傅里叶变换的基础上进行引入时域信息的基础尝试,其本质在于不对整个信号施加时间窗,而是建立小的时间窗,将时间窗在整个时间序列中滑移,得到一系列频谱。

          MATLAB中有现成的stft()函数进行短时傅里叶变换,该函数从2019a版本开始使用,其中主要需要的设置的参数为时间窗的长度以及每次的滑移的长度。窗的类型通常采用汉明窗或者汉宁窗。通过移动的窗函数能够实现不同信号时间段内的频谱计算。windownum为采用的窗口大小,noverlap为重叠窗口大小,noverlap越大,窗口滑移越小。假如窗口大小为40点,重叠窗口大小为30点,则每次切换窗口移动10个点。

function [t,f,Amp]=HSERL_SFTF_Analysis(time,signal,windownum,noverlap)
    Fs=1/(time(2)-time(1));
    N=length(time);
    window = hamming(windownum); 
    [S,F,T]=stft(signal,Fs, 'Window', window, 'OverlapLength', noverlap, 'FFTLength', N);
    t=T;
    f=F(end/2:end);
    Mag=abs(S/windownum);
    Amp=Mag(end/2:end,:);
    Amp(2:end-1)=Amp(2:end-1);
end

         同样 测试上述两种类型的变频信号,在短时傅里叶变换的分析下可以明显观察到信号频谱的变化。    

Fs=200;
Ts=1/Fs;
T=1;

%%
figure
t=0:Ts:T-Ts;
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*10*t(1:end/2));
y(end/2:end)=sin(2*pi*30*t(end/2:end));
subplot(3,2,1)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(3,2,3)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,5)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

t=0:Ts:T-Ts;
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*30*t(1:end/2));
y(end/2:end)=sin(2*pi*10*t(end/2:end));
subplot(3,2,2)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(3,2,4)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,6)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

%%
figure
t=0:Ts:T-Ts;
y=chirp(t,1,1,20); 
subplot(3,2,1)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(3,2,3)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,5)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

t=0:Ts:T-Ts;
y=chirp(t,20,1,1); 
subplot(3,2,2)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(3,2,4)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,6)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

        对于短时傅里叶变换来说窗函数的大小直接决定了时频分析的频率分辨率与时间分辨率,从定性的角度分析,窗口越大,处理的信号时间越长,其时间分辨率越低;窗口越小,处理的信号时间越短,频率分辨率越低。以一种变频信号为例,窗口较小时,频谱的泄露较大,但是在变频的时间点前后变化较大;窗口较大时,频谱泄露相对较小,但是对变频点的前后的频谱缓慢变化,对定位时间点不利。

        注意此处设置的窗口滑移点数都是1,每次的窗口滑移点数同样也是影响结果的因素,选择大的滑移点数能够有效的降低数据量,在合适的选择下引起的时域泄露可以接受。

Fs=200;
Ts=1/Fs;
T=1;

%%
figure
t=0:Ts:T-Ts;
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*10*t(1:end/2));
y(end/2:end)=sin(2*pi*30*t(end/2:end));
subplot(2,2,1)
plot(t,y,"LineWidth",1)

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(2,2,2)
surf(T,f,Amp);
view(0, 90);
axis tight;
colorbar;
title('windownum=40')

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,80,79);
subplot(2,2,3)
surf(T,f,Amp);
view(0, 90);
axis tight;
colorbar;
title('windownum=80')

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,120,119);
subplot(2,2,4)
surf(T,f,Amp);
view(0, 90);
axis tight;
colorbar;
title('windownum=120')

%%
figure
T=1;
t=0:Ts:T-Ts;
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*10*t(1:end/2));
y(end/2:end)=sin(2*pi*30*t(end/2:end));
subplot(2,2,1)
plot(t,y,"LineWidth",1)

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,40,39);
subplot(2,2,2)
waterfall(f,T(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])
title('windownum=40')

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,80,79);
subplot(2,2,3)
waterfall(f,T(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])
title('windownum=80')

[T,f,Amp]=HSERL_SFTF_Analysis(t,y,120,119);
subplot(2,2,4)
waterfall(f,T(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])
title('windownum=120')

2.小波变换

        短时傅里叶变换作为视频分析最初的尝试,其能够实现的简单的时频分析,然而其依赖与大小不变的窗口,固定的窗口大小导致其只能在固定的分辨率进行,对于一些瞬态的信号效果较差。

        小波变换克服了短时傅里叶变换的问题,在时域和频域上都有表征信号局部信息的能力,时间窗和频率窗能够动态调整。定性的讲,针对低频部分采用较低的时间分辨率,提高频率分辨率;针对高频部分采用较低的频率分辨率,提高时间分辨率。

        其适用于信号主要集成在低频域的情况。如果关注的频率成分位于中高端,例如语音信号,由于小波变换在高频段的频谱窗口宽,其小波系数包含多个频率分量,信号针对性变差。

function [t,f,Amp]=HSERL_CWT_Analysis(time,signal)
    Fs=1/(time(2)-time(1));
    [wt,f] = cwt(signal,'morse',Fs);
    t=time;
    Amp=abs(wt);
end

        小波变换得到的时频谱对于低频信号的频率分辨率较好,时间分辨率相对较差;对于高频信号的频率分辨率较差,时间分辨率较好。然而其得到的小波频谱如何转化成控制依据将是后续需要研究的部分。

Fs=200;
Ts=1/Fs;
T=1;

%%
figure
t=0:Ts:T-Ts;
y=zeros(1,Fs*T);
y(1:end/2)=sin(2*pi*10*t(1:end/2));
y(end/2:end)=sin(2*pi*30*t(end/2:end));
subplot(3,2,1)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_CWT_Analysis(t,y);
subplot(3,2,3)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,5)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

t=0:Ts:T-Ts;
y=chirp(t,1,1,20); 
subplot(3,2,2)
plot(t,y,"LineWidth",1)

[t,f,Amp]=HSERL_CWT_Analysis(t,y);
subplot(3,2,4)
surf(t,f,Amp);
view(0, 90);
axis tight;
colorbar;

subplot(3,2,6)
waterfall(f,t(1:10:end),Amp(:,1:10:end)');
set(gca,XDir="reverse",View=[30 50])

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值