整理自:http://blog.sina.com.cn/s/blog_6163bdeb0102dwfw.html

今天偶人发现原来matlab自带了短时傅里叶变换的分析函数,老版本的matlab是specgram函数,新的改成了spectrogram函数,虽然一说到时频分析,都会说到小波分析,小波分析要比短时傅里叶要好云云,但在分析信号的瞬时频谱时,短时傅里叶还是有它的用武之地的。前一阵也看了一些有关小波分析的matlab实现,发现帮助中使用小波也多是除噪、压缩,都说小波是时频显微镜,它的用武之地还是在于查看高频在哪一级分解中,进而可以有效滤除一些信号,比如除噪,所以短时傅里叶变换查看瞬时频率正好互补一下。时频分析还认识的不深,一个阶段的想法而已。

另外,之前对matlab的扫频函数chirp做过总结,见http://blog.sina.com.cn/s/blog_6163bdeb0100qbqo.html,里面就是使用spectrogram函数来查看产生的扫频信号的瞬时频率的,当时不知道那个函数是干啥,就感觉好神奇,现在正好看到,总结一下吧!

spectrogram

功能:使用短时傅里叶变换得到信号的频谱图。

语法:

  [S,F,T,P]=spectrogram(x,window,noverlap,nfft,fs)

  [S,F,T,P]=spectrogram(x,window,noverlap,F,fs)

说明: 当使用时无输出参数,会自动绘制频谱图;有输出参数,则会返回输入信号的短时傅里叶变

   换。当然也可以从函数的返回值S,F,T,P绘制频谱图,具体参见例子。

参数:

x---输入信号的向量。默认情况下,即没有后续输入参数,x将被分成8段分别做变换处理,

    如果x不能被平分成8段,则会做截断处理。默认情况下,其他参数的默认值为

window---窗函数,默认为nfft长度的海明窗Hamming

noverlap---每一段的重叠样本数,默认值是在各段之间产生50%的重叠

nfft---做FFT变换的长度,默认为256和大于每段长度的最小2次幂之间的最大值。

另外,此参数除了使用一个常量外,还可以指定一个频率向量F

fs---采样频率,默认值归一化频率

Window---窗函数,如果window为一个整数,x将被分成window段,每段使用Hamming窗函数加窗。

如果window是一个向量,x将被分成length(window)段,每一段使用window向量指定的

窗函数加窗。所以如果想获取specgram函数的功能,只需指定一个256长度的Hann窗。

Noverlap---各段之间重叠的采样点数。它必须为一个小于window或length(window)的整数。

其意思为两个相邻窗不是尾接着头的,而是两个窗有交集,有重叠的部分。

Nfft---计算离散傅里叶变换的点数。它需要为标量。

Fs---采样频率Hz,如果指定为[],默认为1Hz。

S---输入信号x的短时傅里叶变换。它的每一列包含一个短期局部时间的频率成分估计,

时间沿列增加,频率沿行增加。

 如果x是长度为Nx的复信号,则S为nfft行k列的复矩阵,其中k取决于window,

如果window为一个标量,则k = fix((Nx-noverlap)/(window-noverlap))

如果window为向量,则k = fix((Nx-noverlap)/(length(window)-noverlap))

对于实信号x,如果nfft为偶数,则S的行数为(nfft/2+1),如果nfft为奇数,

    则行数为(nfft+1)/2,列数同上。

F---在输入变量中使用F频率向量,函数会使用Goertzel方法计算在F指定的频率处计算频谱图。

指定的频率被四舍五入到与信号分辨率相关的最近的DFT容器(bin)中。而在其他的使用nfft

语法中,短时傅里叶变换方法将被使用。对于返回值中的F向量,为四舍五入的频率,其长度

等于S的行数。

T---频谱图计算的时刻点,其长度等于上面定义的k,值为所分各段的中点。

P---能量谱密度PSD(Power Spectral Density),

对于实信号,P是各段PSD的单边周期估计;

对于复信号,当指定F频率向量时,P为双边PSD。

P矩阵的元素计算公式如下P(I,j)=k|S(I,j)|2,其中的的k是实值标量,定义如下

对于单边PSD,计算公式如下,其中w(n)表示窗函数,Fs为采样频率,在0频率和奈奎斯特

频率处,分子上的因子2改为1;

对于双边PSD,计算公式如下

如果采样频率没有指定,分母上的Fs由2*pi代替。

spectrogram(...)当调用函数时没有输出参数,将会自动绘制各段的PSD估计,绘制的命令如下

surf(T,F,10*log10(abs(P)));

axis tight;

view(0,90);

spectrogram(...,'freqloc')使用freqloc字符串可以控制频率轴显示的位置。当freqloc=xaxis

时,频率轴显示在x轴上,当freqloc=yaxis时,频率轴显示在y轴上,默认是显示在x轴

上。如果在指定freqloc的同时,又有输出变量,则freqloc将被忽略。

例.计算并显示二次扫频信号的PSD图,扫频信号的频率开始于100Hz,在1s时经过200Hz

T = 0:0.001:2;

X = chirp(T,100,1,200,'q');

spectrogram(X,128,120,128,1E3);

title('Quadratic Chirp');

频率显示在y轴上:

t=0:0.001:2; % 2 secs @ 1kHz sample rate
y=chirp(t,100,1,200,'q'); % Start @ 100Hz, cross 200Hz at t=1sec
spectrogram(y,kaiser(128,18),120,128,1E3,'yaxis');
title('Quadratic Chirp: start at 100Hz and cross 200Hz at t=1sec');

例.计算并显示线性扫频信号的PSD图,扫频信号由直流开始,在1s时经过150Hz,控制频率轴显示在y轴上

T = 0:0.001:2;

X = chirp(T,0,1,150);

[S,F,T,P] = spectrogram(X,256,250,256,1E3);

surf(T,F,10*log10(P),'edgecolor','none'); axis tight;

view(0,90);

xlabel('Time (Seconds)'); ylabel('Hz');

函数使用的注意:

nfft越大,频域的分辨率就越高(分辨率=fs/nfft),但离瞬时频率就越远;

noverlap影响时间轴的分辨率,越接近nfft,分辨率越高,相应的冗余就越多,计算量越大,但计算机只要能承受,问题不大。

spectrogram函数做短时傅里叶分析的更多相关文章

  1. Matlab_spectrogram_短时傅里叶分析_实现与讨论

    在语音与音乐处理过程中,常用到短时傅里叶变换(Short Time Fourier Transformation, STFT).在一些学习路径中,STFT也是学习小波之前的预备知识.本文简单实现了 M ...

  2. RCurl getURL()函数做debug

    getURL()函数做获取网页做debug,三步骤 1.首先创建一个对象debugGatherer(),该对象包含三个函数:(update(), value(), reset()); R> de ...

  3. python3中匿名函数做参数,匿名函数做实参,eval关键字

    一:说到匿名函数,大家都感到陌生又熟悉,今天我带大家了解一下py3中的匿名函数,以及匿名函数作为函数的参数的情况 主要通过以下实例来说明: 实例一: newarr =[33,44444,6222,88 ...

  4. C++ 友元 (全局函数做友元) (类做友元) (成员函数做友元)

    1 //友元 全局函数做友元 2 /* 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 ...

  5. 【Go语言学习笔记】函数做参数和闭包

    函数做参数 在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型.类似于重写(同名覆盖). 回调函数:函数有一个参数是函数类型,这个 ...

  6. 用CIL写程序:写个函数做加法

    前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...

  7. Swift 函数做参数和闭包做参数的一个细节差别

    函数作参数,示例为传入一个String和一个添加前缀的函数,返回一个添加完前缀的String: func demo(str:String,addPrefix:(String)->String)- ...

  8. shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性

    shingling算法用于计算两个文档的相似度,例如,用于网页去重.维基百科对w-shingling的定义如下: In natural language processing a w-shinglin ...

  9. Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good

    API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭. const IDTIMEDOUT = 32000; function MessageBoxTim ...

随机推荐

  1. libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

    Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...

  2. libgdx学习记录6——动作Action

    libgdx中的Action类能够有效的帮助我们实现位移.旋转.缩放.淡入淡出等效果,对游戏的设计很有用. Action是一个抽象类,本身不可以实例化.一般使用的它的继承类,常用的有 MoveToAc ...

  3. Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述

    目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...

  4. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  5. 深入浅出OAuth2.0授权

    一.前言 说到OAuth,先来一段百度到的比较官方的解释: OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信 ...

  6. JavaScript快速入门-ECMAScript本地对象(Array)

    Array对象 Array对象和python里面的list对象一样,是用来存储多个对象值的对象,且方法和属性基本上类似. 一.属性 lenght 二.方法  1.concat()  用于连接两个或多个 ...

  7. 前端项目模块化的实践3:使用 TypeScript 的收益

    以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...

  8. LintCode——旋转字符串

    描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例:对于字符串 "abcdefg"     offset=0 => "abcdefg&qu ...

  9. Linux 终端快捷键整理

    一.历史命令相关快捷键 快捷键 说明 ↑.↓ 显示历史命令 !! 执行上一个命令 !n 执行历史命令中第 n 条命令 !-n 执行历史命令中倒数第 n 条命令 二.移动相关快捷键 快捷键 说明 Ctr ...

  10. 通过blockchain_go分析区块链交易原理

    原文链接-石匠的Blog 1.背景 在去中心化的区块链中进行交易(转账)是怎么实现的呢?本篇通过blockchain_go来分析一下.需要进行交易,首先就需要有交易的双方以及他们的认证机制,其次是各自 ...