Matlab 傅立叶变换 短时傅立叶变换 小波变换

clc;
clear;


%generate signal 
fs = 10; %采样频率
N = 10000;  %数据总长度
n = 0:N-1;
t = n/fs;  %时间序列


for i=1:N
    if t(i)<500
        x(i)=sin(10*t(i));   
    else
        x(i)=sin(20*t(i));
    end   
end
x;
subplot(411)
plot(t,x);
axis([0,1000,-1,1]);


%fourier Transform
y_FFT = fft(x,N);   %对信号快速Fourier变换
mag1 = abs(y_FFT); %Fourier变换后的振幅
f = n*fs/N;  %频率序列
subplot(412)
plot(f,mag1);
axis([0,10,0,3000]);
xlabel('频率/HZ');
ylabel('振幅');
title('Fourier Transform');


%STFT, Hamming windows
h=hanning(N);
[y_STFT,ff,tt,pp] = spectrogram(x,h,100,N,fs);
mag2 = abs(y_STFT);
subplot(413);
n1 = 1:5001;
f1 = n1*fs/N; %频率序列
plot(f1,mag2);
axis([0,10,0,2000]);
xlabel('N');
ylabel('频率/HZ');
title('STFT');


%wavelet transform, morlet
c = cwt(x,1:1,'morl');
mag3 =abs(c);
subplot(414);
plot(f,mag3);
axis([0,100,0,0.15]);
xlabel('频率/HZ');
ylabel('振幅');
title('wavelet');



傅立叶变换,假设信号是平稳、周期。如果信号不满足该条件,就不能使用。而且傅立叶变化,是一种全局的变换,没有刻画出特定时间或特定频率段内的信号特性,不能分析信号在某一个时刻的频谱。



短时傅立叶将信号分成许多小的时间隔,用傅立叶变换分析每一个时间间隔,以便确定该时间间隔存在的频率。因此短时傅立叶变换在一定程度上克服了标准傅立叶变换不具有局部分析能力的缺陷。
然而短时傅立叶变换选择的窗口函数,是一光滑的低通函数,只在τ的附近有值,在其余处迅速衰减掉。也就是说短时傅立叶变换实质上是具有单一分辨率的分析,若要改变分辨率,则必须重新选择窗函数。
另外,短时傅立叶变换,如果每一段的时间太短,则频率的分辨率就低,如果每一段的时间太长,则时域的分辨率太低,并且这两者一定是矛盾的。



小波变换的基本思想是将函数在核函数上展开,核函数具有时间与频率分辨率,因而小波变换具有时间和频率分辨率。所以小波变换可以针对非平稳信号进行分析,并且得到每一个时刻的频谱分量。
小波分析用到的函数(即小波函数)则具有多样性,同一个工程问题用不同的小波函数进行分析有时结果相差甚远。
在短时傅立叶变换中,变换系数S(ω,τ)主要依赖于信号在[τ-δ,τ+δ]片段中的情况,时间宽度是2δ(因为δ是由窗函数g(t)唯一确定的,所以2δ是一个定值)。

在小波变换中,变换系数Wf(a,b)主要依赖于信号在[b-aΔφ,b+aΔφ)片断中的情况,时间宽度是2aΔφ,该时间的宽度是随尺度a变化而变化的,所以小波变换具有时间局部分析能力。

你可能感兴趣的:(Matlab 傅立叶变换 短时傅立叶变换 小波变换)