<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<a href="https://h5.youzan.com/v2/goods/3nj52dd9seo3z" target="_blank"><img src="https://img-blog.csdnimg.cn/2019042818380821.jpg"></a> <div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<p>目录:</p>
短时傅里叶变换(2)
前言
之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现。
想要复习原理的同学,可以参照一一下这篇:短时傅里叶分析
本次讲解中阶的函数,基础的可以参见前面的:短时傅里叶实现(1)
后续的请参见下篇。
实验环境
本文的所有实验都是在matlab2016a下通过的。
Matlab spectrogram函数
谱图函数:使用短时傅里叶变换化成短时傅里叶变换的谱图。
1语法
>
s = spectrogram(x,window,noverlap,nfft,Fs)
- 1
2使用说明
s = spectrogram(x,window,noverlap,nfft,Fs)
返回输入信号的短时傅里叶变换,该函数和之前的返回结果有所不同,它的时间轴和频率轴发生了变化
详细说明:
返回输入信号x的谱图,结果存储在矩阵s中,其他参数的设置和之前一样,Fs是采样频率,单位为Hz,如果Fs是[]的话,它默认是1Hz,如果Fs没有定义的话,将使用归一化的频率。
s的每一列都是x短时局部锁定的频率成分,时间轴从左至右,频率轴从下至上。
如果x是长度为NX的复信号,s是一个有NFFT行的复矩阵,以及fix((nx-noverlap)/(length(window)-noverlap))列。对于实信号,如果NFFT是偶数则s的行数是(NFFT/2+1),如果NFFT是奇数,则行数为(NFFT+1)/2.
3代码如下:
3.1坐标轴变换
%产生一个平方鸟声(chirp)信号,采样频率是1khz,采样时间是2秒,前一秒的信号是100hz,后一秒的信号是200hz。
t = 0:0.001:2;
x = chirp(t,100,1,200,'quadratic');
%计算并展示x的谱图
% 将信号分割成每段128个点的信号,使用汉宁窗加窗。
% 选择120个点作为连续的重叠部分
%计算谱值 【128/2+1】=65个频率点,[(length(x)-120)/(128-120)]=235个时间块。
spectrogram(x,128,120,128,1e3)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
使用Blackman窗代替汉宁窗,将重叠点下降到60个,画出时间轴,它的轴是逆转的。
spectrogram(x,blackman(128),60,128,1e3)
ax = gca;
ax.YDir = 'reverse';
- 1
- 2
- 3
如图所示
3.2鸟声信号的功率谱密度
3.2.1平方鸟声信号
计算并展示一个分段鸟声信号的功率谱密度,开始时是100hz,并在1秒时变成了200hz。采样率为1000hz,分段的每一段长度为128点,每一段有120个点重合,使用128点的离散傅里叶变换和默认的海明窗
t = 0:0.001:2;
x = chirp(t,100,1,200,'quadratic');
spectrogram(x,128,120,128,1e3,'yaxis')
title('Quadratic Chirp')
- 1
- 2
- 3
- 4
如图所示
3.2.线性鸟声信号
计算并展示一个线性鸟声信号每一段的功率谱密度,开始时是直流,并在t=1s时达到150hz。
信号设置,采样率1khz,每一段的长度为256个点,每一段的重叠是250个点,使用默认的海明窗和256点离散傅里叶变换。
t = 0:0.001:2;
x = chirp(t,0,1,150);
spectrogram(x,256,250,256,1e3,'yaxis')
title('Linear Chirp')
- 1
- 2
- 3
- 4
如图所示
3.3对数鸟声信号
计算并展示一个对数鸟声信号每一段的功率谱密度,开始时是20hz,并在t=1s时达到60hz。
信号设置,采样率1khz,每一段的长度为256个点,每一段的重叠是250个点,使用默认的海明窗和256点离散傅里叶变换。
t = 0:0.001:2;
x = chirp(t,20,1,60,'logarithmic');
spectrogram(x,256,250,[],1e3,'yaxis')
title('Logarithmic Chirp')
- 1
- 2
- 3
- 4
如图所示:
在这张图里,当你使用对数频率轴时,图像会变成一条直线
代码如下:
ax = gca;
ax.YScale = 'log';
- 1
- 2
这也展示对坐标轴的设置会影响展示效果。
参考:
mathworks