在Matlab中,做短时傅里叶变换需要使用函数spectrogram,而在Matlab2019中,引入了一个新的函数stft,下面我们就来看下这两个函数都如何使用。

短时傅里叶变换的基本原理就是将数据分段加窗,做fft,在分段时会有overlap,因此一个向量的短时傅里叶变换结果是一个矩阵。了解了这点,下面的函数及参数就更加容易理解了。

spectrogram

参数列表

先来看spectrogram函数,在更早期的版本中,这个函数的名字是specgram,几种常用的用法如下:

spectrogram(x)

s = spectrogram(x)

s = spectrogram(x, window)

s = spectrogram(x, window, noverlap)

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

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

[s, f, t] = spectrogram(x, window, noverlap, nfft, fs)

[s, f, t] = spectrogram(x, window, noverlap, f, fs)

[s, f, t, p] = spectrogram(x, window, noverlap, f, fs)

其中,

x表示输入信号;

window表示窗函数,如果window的值是一个整数,那么被分段的x的每一段的长度都等于window,并采用默认的Hamming窗;如果window是一个向量,那么被分段后每一段的长度都等于length(window),且输入的向量即为所要加的窗函数;

overlap表示两段之间的重合点数,overlap的值必须要小于窗长,如果没有指定overlap,默认是窗长的一半,即50%的overlap;

nfft表示fft的点数,fft的点数跟窗长可以是不同的,当没有指定该参数时,Matlab会取max(256, 2^(ceil(log2(length(window))))),即当窗长小于256时,fft的点数是256;当窗长大于256时,fft的点数取大于窗长的最小的2的整数次幂;

fs表示采样率,用来归一化显示使用;

f表示显示的频谱范围,f是一个向量,长度跟s的行数相同;

当x是实信号且nfft为偶数时,s的行数为(nfft/2+1)

当x是实信号且nfft为奇数时,s的行数为(nfft+1)/2

当x是复信号时,s的行数为nfft

当在输入的参数列表中指定f后,函数会在f指定的频率处计算频谱图,返回的f跟输入的f是相同的;

t表示显示的时间范围,是一个向量,长度跟s的列数相同;

p表示功率谱密度,对于实信号,p是各段PSD的单边周期估计;对于复信号,当指定F频率向量时,P为双边PSD;如何计算PSD

Examples

首先,生成信号如下,4个点频信号拼接起来:

clc;clear all;close all;

fs = 10e6;

n = 10000;

f1 = 10e3; f2 = 50e3; f3 = 80e3; f4 = 100e3;

t = (0:n-1)'/fs;

sig1 = cos(2*pi*f1*t);

sig2 = cos(2*pi*f2*t);

sig3 = cos(2*pi*f3*t);

sig4 = cos(2*pi*f4*t);

sig = [sig1; sig2; sig3; sig4];

信号的时域波形如下:

在这里插入图片描述

直接调用spectrogram(sig),可得如下结果,图中默认横轴是频率,纵轴是时间

在这里插入图片描述

为了绘图更灵活,我们不直接用spectrogram绘图,而且求出s后,再对s单独绘图,这次我们指定window的大小为256

s = spectrogram(sig, 256);

t = linspace(0, 4*n/fs, size(s,1));

f = linspace(0, fs/2, size(s,2));

figure;

imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency');

colorbar;

在这里插入图片描述

noverlap默认是50%,现在我们把它设为window的长度减1,即每次的步进为1

s = spectrogram(sig, 256, 255);

t = linspace(0, 4*n/fs, size(s,1));

f = linspace(0, fs/2, size(s,2));

figure;

imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency');

colorbar;

在这里插入图片描述

再加上nfft和fs参数,我们指定fft点数就是窗长

s = spectrogram(sig, 256, 128, 256, fs);

这个的图形跟之前一样,不再画了

如果在返回值中,增加f和t,这样我们下面就不用再重新定义f和t了

[s, f, t] = spectrogram(sig, 256, 128, 256, fs);

figure;

imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency');

colorbar;

从上面的图中我们可以看出,我们的4个信号的频率都比较小,而画出来的图显示的频谱范围比较大,导致下面很大一部分信息我们其实都不需要。这时,我们就可以通过指定f的区间来计算频谱。为了显示效果更好,我们把其他参数也调一下

window = 2048;

noverlap = window/2;

f_len = window/2 + 1;

f = linspace(0, 150e3, f_len);

[s, f, t] = spectrogram(sig, window, noverlap , f, fs);

figure;

imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency');

colorbar;

在这里插入图片描述

最后再把功率谱密度的返回值加上

[s, f, t, p] = spectrogram(sig, window, nfft, f, fs);

figure;

imagesc(t, f, p);xlabel('Samples'); ylabel('Freqency');

colorbar;

在这里插入图片描述

stft

这个函数在Matlab的解释并不是很多,example也只写了两个,但用法比较简单:

window = 2048;

noverlap = window/2;

nfft = window;

[s, f, t, p] = spectrogram(sig, window, noverlap, nfft, fs);

figure;

imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency');

title('使用spectrogram画出的短时傅里叶变换图形');

colorbar;

ss = stft(sig,fs,'Window',hamming(window),'OverlapLength',window/2,'FFTLength',nfft);

figure;

imagesc(t, f, 20*log10((abs(ss(1024:end,:)))));xlabel('Samples'); ylabel('Freqency');

title('使用stft画出的短时傅里叶变换图形');

colorbar;

在这里插入图片描述

FPGA

FPGA时序约束教程

C++

信号处理

Julia

(还未补充完整)

欢迎关注微信公众号:

在这里插入图片描述

matlab 短时傅立叶变换,Matlab中短时傅里叶变换 spectrogram和stft的用法相关推荐

  1. MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法

    在Matlab中,做短时傅里叶变换需要使用函数spectrogram,而在Matlab2019中,引入了一个新的函数stft,下面我们就来看下这两个函数都如何使用. 短时傅里叶变换的基本原理就是将数据 ...

  2. matlab离散傅立叶变换的应用,离散傅里叶变换 - MATLAB Simulink - MathWorks 中国

    离散傅里叶变换 离散傅里叶变换(即 DFT)是数字信号处理的首要工具.该产品的基础是快速傅里叶变换 (FFT),这是一种可减少执行时间的 DFT 计算方法.许多工具箱函数(包括 Z 域频率响应.频谱和 ...

  3. 【音频分析】短时傅立叶变换结果为啥是对称?每个结果对应的频率是多少?

    传统艺能,又来搞傅立叶变换. 在短时傅立叶变换只有离散的一些频率,变换之后的频谱分布有哪些规律呢? 解释对称性 上公式,N是时间域的窗口采样数(即数组长度) 正变换 F(k)=∑n=0N−1f(n)∗ ...

  4. 关于短时傅立叶变换的基线的选取以及可靠频率点的关系

    针对基线校正时的基线长度,短时傅立叶变换时,整个时间窗内傅立叶变换的结果会赋值给时间窗中间时间点.这样一来,基线开头和结尾各有一半时间窗长度的短时傅立叶结果是不太可靠的.例如,如果基线是-500-0m ...

  5. 傅立叶变换在图像处理中的应用

    1.为什么要进行傅里叶变换,其物理意义是什么? 傅立叶变换是数字信号处理领域一种很重要的算法.要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义.傅立叶原理表明:任何连续测量的时序或信号,都可以表 ...

  6. [转载]傅立叶变换在图像处理中的作用

    原文地址:傅立叶变换在图像处理中的作用作者:白屋顶黑乌鸦 从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换.它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分.在不同的研究领域,傅里叶 ...

  7. 分数阶傅立叶变换 matlab,【综述】分数阶傅里叶变换(FRFT)

    原标题:[综述]分数阶傅里叶变换(FRFT) 作者:WTT整理 傅里叶级数(傅里叶变换)几乎在所有科学和工程领域发挥着重要作用.黎曼积分和勒贝格积分均起源于对傅里叶级数的研究,傅里叶级数(傅里叶变换) ...

  8. 信号与系统仿真实验——实验二 傅立叶变换MATLAB的实现及傅里叶变换性质的分析

    [ 实验目的] 1.利用MATLAB分析非周期信号的频谱 2.观察信号频谱变化验证傅里叶变换性质 [ 实验内容] [ 实验报告要求] (1)记录实验一和实验三中的波形: (2)总结实验二中频谱特性曲线 ...

  9. 时频分析:短时傅立叶变换实现(4)

    目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下 3.1重新分配平方鸟声的谱图 3.2设置了下限的谱图 参考: 前言 之前讲了时频分析的原理,现在来讲讲 ...

  10. 边缘指示函数matlab,matlab图像处理——傅立叶变换边缘提取

    第一部分 图像的傅立叶变换 一. 实验目的 1.了解图像变换的意义和手段: 2. 熟悉傅里叶变换的基本性质: 3. 熟练掌握FFT的方法及应用: 4. 通过实验了解二维频谱的分布特点: 5. 通过本实 ...

最新文章

  1. 从空间数据库中删除所有拓扑对象
  2. 端口扫描程序nmap使用详解
  3. 选择结构_穿透的switch语句
  4. FrameLayout 测量过程
  5. CSS中meta标签的viewport
  6. “中文直达”能推动移动上网入口洗牌吗?
  7. 以太坊 ERC EIP是什么
  8. 张季跃 201771010139《面向对象程序设计(java)》第八周学习总结
  9. 喜马拉雅下载成mp3方法
  10. smartDNS让你的网络一触即达
  11. 开源中国软件频道_编程小黑马
  12. 掌阅电子书全系列安装第三方app教程(无需破解)
  13. PAT乙级 打印沙漏(20)
  14. 2023年全国最新工会考试精选真题及答案36
  15. WeQuant交易策略—5日均线
  16. 上位机与1200组态步骤_西门子1200PLC的S7通讯组态编程
  17. FPGA error:buffers of the same direction cannot be placed in series.
  18. 闲人闲谈PS之二十一——SAP自定义程序增加附件上传下载功能
  19. loadrunner入门教程(11)--回放脚本
  20. 微信小程序 python 自动化测试_微信小程序的自动化测试框架

热门文章

  1. Windows 10 语言包下载 LCU补丁添加 DISM++及wsusscn3.cab下载(WindowsISO映像定制 )
  2. Ubuntu 设置 IP 地址和 hostname
  3. PHP字符串解析函数
  4. php 判断是否为字符串,php怎么判断是不是字符串
  5. Video.js - HTML5 视频播放器
  6. Xshell上传文件到Ubuntu服务器
  7. 《罪恶街区/Vice Street》手游用户协议
  8. android 表情包
  9. Python微信公众号后台开发教程001
  10. MongoDb学习(五)--Gridfs--上传下载