时频分析:短时傅里叶变换实现(1)

目录:

前言

之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现。
想要复习原理的同学,可以参照一一下这篇:短时傅里叶分析
本次先讲解四个函数,后续的请参见下篇。

实验环境

本文的所有实验都是在matlab2016a下通过的。

Matlab spectrogram函数

谱图函数使用短时傅里叶变换

1语法

>

 s = spectrogram(x)
  s = spectrogram(x,window)
   s =spectrogram(x,window,noverlap)
   s =spectrogram(x,window,noverlap,nfft)   

2使用说明

s = spectrogram(x)
返回输入信号(x)的短时傅里叶变换,s的每一列包含着信号s短期时间锁定的频率成分
详细说明:
返回输入信号x的谱图,结果存储在矩阵s中。默认设置:X被分割为8段,每段都有50%重叠,每个段落都经过汉宁窗处理。nfft的点数是256或者比每段X最多点数大的2的倍数。如果x不能被分成8段,它会被截断。
S = spectrogram(X,WINDOW)
详细说明:当window是一个向量的时候,将x划分成每段长数和window一样长的n段,并使用window对每段信号进行处理,如果window是一个整数,则将x分成这么多段,并使用汉宁窗进行处理。
S = spectrogram(X,WINDOW,NOVERLAP) .
noverlp 重叠部分是x中重叠的点数,当window是整数的时候,它必须是个小于window的整数,当window是向量的时候它必须小于window的长度,默认值是50%重叠。
S = spectrogram(X,WINDOW,NOVERLAP,NFFT)
额外设置NFFT的点数。

3代码如下:

产生一个1024点的采样信号,信号源是两个正弦波的叠加,归一化频率分别是0.4pi,和0.8pi,高频信号的能量是低频的10倍。                                                                                                                 
N = 1024;
n = 0:N-1;
w0 = 2*pi/5;
计算短时傅里叶变换,并使用默认参数画出谱图。
x = sin(w0*n)+10*sin(2*w0*n);
s = spectrogram(x);
spectrogram(x,'yaxis')

这里写图片描述
重复验证计算:

  • 将源信号分割成几个段的信号 n s c = N x / 4.5 .
  • 使用汉宁窗进行加窗运算
  • 确定使用50%的重叠部分
    -对傅里叶计算的点做选择,点数由max(256,2^p),其中p等于 p = log 2 N x .

验证这俩个途径的计算结果是否相同:

Nx = length(x);
nsc = floor(Nx/4.5);
nov = floor(nsc/2);
nff = max(256,2^nextpow2(nsc));
t = spectrogram(x,hamming(nsc),nov,nff);
maxerr = max(abs(abs(t(:))-abs(s(:))))

maxerr =

     0

误差为0,因此,这种方法是可以使用的。
将信号分割成8个等长的部分,每个区段由50%的部分重叠。将FFT的长度确定为和之前的步骤一样长。计算短时傅里叶变换并确认它的结果和之前的两个步骤得出的结果一样。

ns = 8;
ov = 0.5;
lsc = floor(Nx/(ns-(ns-1)*ov));
t = spectrogram(x,lsc,floor(ov*lsc),nff);
maxerr = max(abs(abs(t(:))-abs(s(:))))

maxerr =

     0

误差为0,因此,这种方法是可以使用的。

猜你喜欢

转载自blog.csdn.net/lvsehaiyang1993/article/details/80576946