时频分析之短时傅里叶变换(STFT)
目录
一、STFT
1.基本理论
2.spectrogram函数
3.频率分辨率和时间分辨率
3.1分辨率的影响因素
3.2提高频率分辨率的方法
二、MATLAB代码
参考文献
一、STFT
1.基本理论
傅里叶变换只反映出信号在频域的特性,无法在时域内对信号进行分析。为了将时域和频域相联系,Gabor于1946年提出了短时傅里叶变换(short-time Fourier transform
,STFT),其实质是加窗的傅里叶变换。STFT的过程是:在信号做傅里叶变换之前乘一个时间有限的窗函数 h(t),并假定非平稳信号在分析窗的短时间隔内是平稳的,通过窗函数 h(t)在时间轴上的移动,对信号进行逐段分析得到信号的一组局部“频谱”。信号的短时傅里叶变换定义为:
由上式知,信号在时间 t 处的短时傅里叶变换就是信号乘上一个以 t 为中心的“分析窗”后所作的傅里叶变换。乘以分析窗函数等价于取出信号在分析时间点 t 附近的一个切片。对于给定时间 t,可以看作是该时刻的频谱。特别是,当窗函数取时,则短时傅里叶变换就退化为传统的傅里叶变换。要得到最优的局部化性能,时频分析中窗函数的宽度应根据信号特点进行调整,即正弦类信号用大窗宽,脉冲型信号用小窗宽。
短时傅里叶变换的优缺点:优点是其基本算法即是傅里叶变换,易于解释其物理意义;缺点是STFT 的窗宽是固定的,不能进行自适应调整。
2.spectrogram函数
function varargout = spectrogram(x,varargin):用于短时傅里叶变换(STFT)的频谱图。
S = SPECTROGRAM(X),返回由矩阵S中的向量X指定的信号的短时傅立叶变换。默认情况下,X被分成8个有50个重叠的段,每个段用Hamming窗口加窗。用于计算离散傅里叶变换的频率点的数目等于256或大于段长度的下一次幂的256。如果X不能精确地分成八段,X将被截断。
S = SPECTROGRAM(X,WINDOW),当WINDOW是一个向量时,将X分成与WINDOW长度相同的段,然后用WINDOW指定的向量对每个段进行加窗。如果WINDOW是一个整数,函数将X分成长度等于该整数值的段,并用Hamming窗口对每个段进行加窗。如果未指定WINDOW,则使用默认值。
S = SPECTROGRAM(X,WINDOW,NOVERLAP),指定相邻线段之间重叠的NOVERLAP采样。如果WINDOW是整数,则NOVERLAP必须是小于WINDOW的整数。如果WINDOW是向量,则NOVERLAP必须是小于WINDOW长度的整数。如果未指定NOVERLAP,则使用默认值获得50个重叠。
S = SPECTROGRAM(X,WINDOW,NOVERLAP,NFFT),指定用于计算离散傅里叶变换的频率点的数目。如果未指定NFFT,则使用默认NFFT。
S = SPECTROGRAM(X,WINDOW,NOVERLAP,NFFT,Fs),指定采样率Fs(Hz)。如果Fs指定为空,则默认为1Hz。如果未指定,则使用规范化频率。
S的每一列包含X的短期、时间局部化频率含量的估计值。S列中的时间从左到右递增。频率从0开始沿行递增。如果X是一个长度为NX的复信号,则S是一个具有NFFT行和k=fix((NX-NOVERLAP)/(length(WINDOW)-NOVERLAP))列的复矩阵。对于实X,如果NFFT是偶数,S有(NFFT/2+1)行;如果NFFT是奇数,S有(NFFT+1)/2行。
[S,F,T] = SPECTROGRAM(...),返回频率向量F和时间向量T,在该向量下计算频谱图。F的长度等于S的行数。T的长度为k(如上定义),其值对应于每个线段的中心。如果没有提供采样率,F包含归一化频率。
[S,F,T] = SPECTROGRAM(X,WINDOW,NOVERLAP,F),计算矢量F中指定的归一化频率下的双面谱图。F必须至少有两个元素。
[S,F,T] = SPECTROGRAM(X,WINDOW,NOVERLAP,F,Fs),计算矢量F中指定频率下的双侧频谱图。F必须以赫兹表示,并且至少有两个元素。
[S,F,T,P] = SPECTROGRAM(...),P是表示每段功率谱密度(PSD)的矩阵。对于实信号,SPECTROGRAM返回每段PSD的单边修正周期图估计值;对于复信号,如果指定了频率向量,则返回双边PSD。
3.频率分辨率和时间分辨率
3.1分辨率的影响因素
窗口的长度会影响时间分辨率和频率分辨率。窗口越长,截取的信号越长,时间分辨率越低,频率分辨率越高;窗口越短,截取的信号越短,时间分辨率越高,频率分辨率越低。
从定量的角度来看,STFT的时间分辨率取决于平移步长,而频率分辨率则取决于。显然,一方的增加必然意味着另一方的减小。这就是所谓的时频测不准原理,具体关系为:
3.2提高频率分辨率的方法
利用spectrogram函数自带两种提高频率分辨率的方法
方法1:将小于某个数值的数归零,提高频率分辨率。
调用格式:[S,F,T,P] = SPECTROGRAM(...,'MinThreshold',THRESH);当10*log10(P)的对应元素小于THRESH(以分贝为单位指定阈值)时,将P的元素设置为零。
方法2:利用功率谱将能量集中的原理,提高频率分辨率。
调用格式:[S,F,T,P] = SPECTROGRAM(...,'reassigned');将每个PSD估计值重新设定为其重心位置。
二、MATLAB代码
clc;
clear;
close all;
tic;
%% 产生信号
fs = 1000; % 采样频率1KHz
t = 0:1/fs:1-1/fs;
N=size(t,2);
f1=10;
f2=30;
x=3*cos(2*pi*f1*t)+5*sin(2*pi*f2*t);
figure(1);
plot(t,x);%% 短时傅里叶变换
wlen=500;%设置窗口长度。窗口越长时间分辨率越差,频率分辨率越好。
hop=1;%每次平移的步长,最小为1。越小图像时间精度越好,但计算量大。
x=wkeep1(x,N+1*wlen);%中间截断
h=hamming(wlen);%设置海明窗的窗长
[B, F, T, P] = spectrogram(x,h,wlen-hop,N,fs); % B是F行T列的频率峰值,P是对应的能量谱密度
figure(2);
imagesc(T,F,P);
set(gca,'YDir','normal')
colorbar;
xlabel('时间 t/s');
ylabel('频率 f/Hz');
title('短时傅里叶时频图');
toc;
参考文献
[1]宫宇新,何满潮,汪政红,等.岩石破坏声发射时频分析算法与瞬时频率前兆研究[J].岩石力学与工程学报,2013,32(4):787-799.
[2]时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API).
[3]matlab时频分析之短时傅里叶变换 spectrogram.
时频分析之短时傅里叶变换(STFT)相关推荐
- matlab时频分析之短时傅里叶变换 spectrogram
matlab时频分析之短时傅里叶变换 spectrogram 短时傅里叶变换常用于缓慢时变信号的频谱分析,可以观察沿时间变化的频谱信号. 其优点如下图所示,弥补了频谱分析中不能观察时间的缺点,也弥补了 ...
- 时频分析:短时傅里叶变换
目录 1 傅里叶变换的缺陷 2 短时傅里叶变换(窗式傅里叶变换) 3 小波部分 4 补充部分 1 傅里叶变换的缺陷 FFT在平稳信号的分析和处理中有着突出贡献的原因在于,人们利用它可以把复杂的时间信号 ...
- 时频分析:短时傅里叶变换(1)
目录: 文章目录 目录: 前言 1傅里叶变换的缺陷 2短时傅里叶变换(窗式傅里叶变换) 3小波部分 4补充部分 补充 前言 最近需要对处理的数据做时频分析,因此恶补了一下相关的知识,光是学习并没有用处 ...
- matlab 时频分析(短时傅里叶变换、STFT)
短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...
- 时频分析:短时傅里叶变换应用
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2举栗子: 2.1跟踪声音信号里的鸟声轨迹 2.2谱图3d可视化 参考: 前言 之前讲了时频分析的原理,和matlab里面的相 ...
- 时频分析:短时傅里叶变换实现(2)
目录: 文章目录 补充 #前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. 想要复习原理的同学,可以参照一一下这篇: 短时傅里叶分析 本次讲解中阶的函数,基础的可以参见前面的: 短 ...
- 时频分析:短时傅里叶变换实现(1)
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下: 前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. 想要复习原理的同学,可以参照一 ...
- 数字信号处理——时频分析(短时傅里叶变换)
短时傅里叶变换的概念 背景: 傅里叶变换的局限性:在做傅里叶变换的时候,使用的是(-∞,∞)的时间信息来计算单个频率的频谱,所以傅里叶变换是一种全局性的描述,不能反映信号局部区域的信息,故如果信号在某 ...
- 时频分析:短时傅立叶变换实现(5)
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下 3.1谱图聚集和门限设置 参考: 前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. ...
- 时频分析:短时傅立叶变换实现(4)
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下 3.1重新分配平方鸟声的谱图 3.2设置了下限的谱图 参考: 前言 之前讲了时频分析的原理,现在来讲讲 ...
最新文章
- C# 视频多人脸识别的实现
- The prefix tx for element tx:annotation-driven is not bound.
- 2017 Android 面试题 [ 基础与细节 ]
- 查找数组中任一峰值的下标
- [itint5]棋盘漫步
- 再有人问你MySQL索引原理,就把这篇文章甩给他!
- C#开发笔记之19-如何用C#实现优雅的Json解析(序列化/反序列化)方案?
- ajax获取session值_java程序员你真的了解session与cookie吗?
- 遇到一个valgrind自身的bug
- android百度地图根据点路线规划,Android 百度地图路径规划一直都是搜索不到结果...
- H5 --力导向图、关系图谱
- SSH复用代码最终版
- kali 破解无线密码
- 关于PV、EV、AC、CV、SV、CPI、SPI、BAC、ETC、EAC的解析及计算
- HDU 3533 BFS
- shell脚本俄罗斯方块小游戏
- 计算机考研404是什么意思,研路分享:我的404分考研高分心得体会
- 树莓派 python 驱动 lcd tft spi 2.8寸 ili9341 240x320
- python对sqlite增删改查_Python操作sqlite3数据库 增删改查
- VC驿站《实用C++》教程开篇
热门文章
- 淘宝商品详情API接口(商品描述信息查询接口)
- python django 商品进销存管理系统(毕设、课设、学习)
- 机器翻译 | 反向翻译 (back-translation) 笔记
- 《论文阅读》D3DLO: DEEP 3D LIDAR ODOMETRY
- selenium模拟鼠标滑动
- vue 网页点击置顶图标缓慢置顶
- ABBYY FineReader15老牌ocr文字识别软件
- python linux区域截屏,用Python写一个像QQ可快捷键唤起区域截屏的应用
- 2011年50大最佳网站
- 【JAVA】poi-tl简单实现调查问卷word模板