短时傅里叶变换(STFT)及matlab

这篇具有很好参考价值的文章主要介绍了短时傅里叶变换(STFT)及matlab。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔记~自用版~

短时傅里叶变换的基础理论

        短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种时频分析方法,它将信号在时间域上分成若干个短时段,对每个短时段进行窗函数加窗后再做傅里叶变换,得到每个时刻的频率成分。与离散傅里叶变换(Discrete Fourier Transform, DFT)和连续傅里叶变换(Continuous Fourier Transform, CFT)相比,STFT具有时间和频率分辨率都高的优点。

        在STFT中,使用一个滑动窗口(也称为时间窗口、分析窗口),将输入信号分成若干个短时段。对于每个短时段,都可计算出它的傅里叶变换。由于窗函数的存在,每个短时段的傅里叶变换只能反映该短时段内的频率信息。这个过程的结果是,在时间轴上得到了一系列变换后的频谱图

        例如,假设对一段音频信号进行时频分析。首先将该信号分成若干个长度为W的短时段,假设窗函数为h(n),那么第k个短时段的STFT可以表示为:

短时傅里叶变换(STFT)及matlab

其中,x(n)为原始信号,n为时域采样点,k表示第k个短时段,ω表示频率。这个公式的意思是:对第k个短时段的信号进行窗函数加窗后,再做傅里叶变换,得到该短时段的频率成分

       将所有的短时段的STFT组合起来,就可以得到整个信号的时频图谱。其中,横轴表示时间轴,纵轴表示频率轴,颜色表示该时刻该频率成分的幅度大小

       STFT一个很明显的缺点——窗函数长度不能太短,否则无法准确反映频率信息,也不能太长,否则时域分辨率将下降。这个问题可以通过使用一些基于STFT的变种方法来解决,例如连续小波变换(Continuous Wavelet Transform, CWT)和可变长窗口的短时傅里叶变换(Variable-Length Window STFT, VSTFT)等.......后续讨论

Matlab使用与演示

STFT(短时傅里叶变换)是一种时频分析方法,可以将信号在时间域和频率域上进行矩阵表示。具体来说,STFT 将整段信号分成若干小段,并对每个小段信号在时域上进行窗函数和 DFT 处理,最后得到了信号在时间和频率两个维度上的矩阵表达。

Matlab 中计算 STFT 变换的函数是 spectrogram,语法如下:

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

其中,'x'表示输入信号,'window'表示窗函数的长度(以采样点为单位),'noverlap'表示相邻两个窗口之间的重叠长度(以采样点为单位,默认为 'window*0.5'),'nfft' 表示进行 DFT 变换时采用的点数(必须是2的幂次方,默认为256),'fs' 表示采样率。函数返回值包括:

- 'S':STFT 谱矩阵,行数为 'nfft/2+1',列数为 STFT 小段数。
- 'F':频率向量,单位为 Hz,长度为 'nfft/2+1'。
- 'T':时间向量,单位为秒,长度为 STFT 小段数。
- 'P':功率谱矩阵,与 STFT 谱矩阵 'S' 相同。

现在,我们来看一下示例代码的具体实现过程:

% 生成一个包含两个正弦波的信号
Fs = 1000; % 采样率
t = 0:1/Fs:1; % 时间序列
x = sin(2*pi*50*t) + sin(2*pi*120*t);

% STFT 参数设置
winlen = 0.5; % 每个小段的长度
overlap = 0.25; % 相邻小段的重叠长度
nfft = 1024; % DFT 点数

% 计算 STFT
[S,F,T,P] = spectrogram(x, round(winlen*Fs), round((1-overlap)*winlen*Fs), nfft, Fs);

step1: 首先,生成一个包含两个正弦波的信号 'x',采样率为 1000 Hz,时长为 1 秒。

step2: 然后,设置了 STFT 的参数。其中,'winlen'表示每个小段的长度为 0.5 秒,'overlap' 表示相邻两个小段之间重叠 0.25 秒,即两个小段之间有 0.25 秒的重复数据。'nfft' 表示进行 DFT 变换时采用 1024 个点进行傅里叶变换。

step3: 最后,调用'spectrogram'函数,计算 'x' 的 STFT 变换。实际上,该函数还会返回功率谱矩阵 'P',但在这里未加以使用。函数返回的 'S'、'F' 和 'T' 分别表示 STFT 谱矩阵、频率向量和时间向量。

在本例中,将 STFT 谱矩阵(即 'S')传递给 'imagesc'函数,以可视化 STFT 的频谱图。如下:

% 绘制 STFT 频谱图
imagesc(T, F, 20*log10(abs(S)));
axis xy;
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('STFT Spectrogram');
colorbar;

        使用 'imagesc' 函数将 STFT 显示为频谱图,其中输入参数 'T' 和 'F' 分别是时间向量频率向量,输入参数 'abs(S)' 表示 STFT 谱矩阵的模值(因为模值更能体现信号在不同频率下的强度)。同时使用 '20*log10' 函数对 STFT 谱矩阵取对数,并乘以 20,目的是将 STFT 谱矩阵从线性单位(即幅度)转换为对数单位(即分贝),以增强其可视化效果。最后,使用 'axis xy' 让横轴表示时间,纵轴表示频率,通过 'colorbar' 添加颜色条,最后用 'xlabel'、'ylabel' 和 'title' 函数添加轴标签和标题。得到图像:

短时傅里叶变换(STFT)及matlab

 也可以选择对S做归一化处理。如下:

S = abs(S)/ max(abs(S(:)));
imagesc(T, F, S);
axis xy;
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('STFT Spectrogram');
colorbar;

得到图像:

短时傅里叶变换(STFT)及matlab

可以非常清晰的看到结果~  文章来源地址https://www.toymoban.com/news/detail-472784.html

到了这里,关于短时傅里叶变换(STFT)及matlab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 傅里叶变换与Matlab

      很多初学者学习了傅里叶变换之后,只是对其公式死记硬背,从而达到做题的目的,但并不理解其原理,对于很多时频分析问题的理解不够透彻。之前自己也是如此,在经过深入学习之后,对变换公式的的本质进行探讨,理解变换的原理及意义所在,同时将傅里叶变换和

    2024年01月20日
    浏览(52)
  • matlab快速傅里叶变换

    快速傅里叶变换(FFT)是数字信号处理中常用的算法之一,可以用于信号分析、滤波、频率估计和信号生成等。在 Matlab 中,快速傅里叶变换是一个重要的工具,可以快速地计算信号的频域表示,帮助研究人员更好地理解和分析信号。本文将介绍 Matlab 中的快速傅里叶变换及其

    2024年02月09日
    浏览(46)
  • Matlab:二维傅里叶变换

    fft2 函数将二维数据变换为频率空间。例如,您可以变换二维光学掩膜以揭示其衍射模式。 以下公式定义 m×n 矩阵 X 的离散傅里叶变换 Y。 i 是虚数单位,p 和 j 是值范围从 0 到 m–1 的索引,q 和 k 是值范围从 0 到 n–1 的索引。在此公式中,X 和 Y 的索引平移 1 位,以反映 M

    2023年04月17日
    浏览(44)
  • 图像Radon变换与傅里叶变换(matlab)

    图像变化的介绍 图像变换是将图像从空间域变换到变换域。图像变换的目的是根据图像在变换域的某些性质对其处理。通常这些性质在空间域内很难获取。在变换域内处理结束后,将处理的结果进行反转变换到空间域。 我们所看到的图像是在空域上的,其信息具有很强的相

    2024年02月05日
    浏览(49)
  • 快速傅里叶变换MATLAB代码实现

    任何连续测量的时序或信号,都可以表示为不同频率的余弦(或正弦)波信号的无限叠加。FFT(Fast Fourier Transform)是离散傅立叶变换的快速算法,可以将一个信号变换到频域。 对于包含 n n n 个均匀采样点的向量 x x x ,其傅里叶变换定义为 y k + 1 = ∑ j = 0 n − 1 ω j k x j + 1

    2023年04月09日
    浏览(73)
  • MATLAB——FFT(快速傅里叶变换)

    基础知识 FFT即快速傅里叶变换,利用周期性和可约性,减少了DFT的运算量。常见的有按时间抽取的基2算法(DIT-FFT)按频率抽取的基2算法(DIF-FFT)。 1.利用自带函数fft进行快速傅里叶变换 若已知序列 x = [ 4 , 3 , 2 , 6 , 7 , 8 , 9 , 0 ] x=[4,3,2,6,7,8,9,0] x = [ 4 , 3 , 2 , 6 , 7 , 8 , 9 , 0 ]

    2024年02月03日
    浏览(75)
  • MATLAB——DFT(离散傅里叶变换)

    题目1: 已知有限长序列x(n)为: x(n)=[0,1,2,3,4,5,6,7,8,9],求x(n)的DFT和IDFT。要求 1)画出序列傅里叶变换对应的|X(k)|和arg[X(k)]图形。 2)画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较。 知识点: DFT(Discrete Fourier Transform)和IDFT(Inverse Discrete Fourier Transform)是互为逆运算的变换

    2023年04月23日
    浏览(54)
  • 傅里叶变换的相关实验——matlab实现

    图像变换是数字图像处理中常用的技术,在图像增强、图像复原、图像压缩编码等数字图像处理中,都会用到图像变换技术,傅里叶变换是数字图像处理中应用最广的一种变换。 从空间域到频率的唯一途径是进行傅里叶变换; 傅里叶变换有明确的物理意义,即任何时域连续

    2023年04月11日
    浏览(45)
  • matlab傅里叶变换及矩阵数据统计

    目录 一、   设计任务及指标. 3 二、  设计过程. 3 1、   界面设计. 3 2、   具体设计. 5 傅里叶变换设计思路:. 5 按钮的回调函数:. 5 弹出式菜单部分:. 6 单选按钮部分:. 7 矩阵部分:. 8 三、  设计遇到问题及总结. 9 1.傅里叶变换部分. 9 2.修饰样式部分. 10 四、  课程学

    2024年04月23日
    浏览(42)
  • 【MATLAB图像处理】傅里叶变换--幅度谱、相位谱、逆变换

    fft2()  傅里叶正变换 fftshift()  频谱搬移-直流量(f=0)搬移至频谱中心 幅度谱只包含亮度信息(f),逆变换后由于没有位置信息(x,y)导致无法重构图像;相位谱只包含位置信息(x,y),逆变换后由于没有亮度信息(f)导致重构图像只有轮廓没有亮度。而同时利用幅度谱

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包