• 将时间序列转成图像——短时傅里叶方法 Matlab实现


    目录

    1 方法

    2 Matlab代码实现

    3 结果


    【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】

    其他:

    1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客

    2.将时间序列转成图像——小波变换方法 Matlab实现_vm-1215的博客-CSDN博客

    3.将时间序列转成图像——希尔伯特-黄变换方法 Matlab实现_vm-1215的博客-CSDN博客

    1 方法

    短时傅里叶变换(Short Time Fourier Transform, STFT)是傅里叶变换(Fourier Transform, FT)的一种变形,以确认时变信号的频率和相位在时间轴上的变化情况。其基本思想是:选择一个合适的窗函数(常见有方形、三角形、高斯函数等),假设时变信号在这个短时间间隔的窗内是一个平稳的信号,通过傅里叶变换计算出信号的频率和相位信息,然后在时间轴上移动窗函数,计算出不同短时间段内信号的频率和相位,最终实现信号的时频分析,得到其对应的时频图。

    Gf(ω,τ)=+g(tτ)f(τ)ejwtdτ" role="presentation">Gf(ω,τ)=+g(tτ)f(τ)ejwtdτ

    其中, $g(t)$" role="presentation">$g(t)$​ 为时间窗函数。 根据短时傅里叶变化的定义,给定时变信号 $f(t)$" role="presentation">$f(t)$​, 其编码步骤如下:

    1. 确定参数:信号长度 flen" role="presentation">flen​, 采样频率samplerate" role="presentation">samplerate​, 窗口长度 windowlen" role="presentation">windowlen​, 步长timestep" role="presentation">timestep​, 窗函数,重叠点数overlap" role="presentation">overlap​;
    2. 计算窗口滑定初始滑动次数为nmax=fix(flenoverlap(windowlenoverlap)×timestep)" role="presentation">nmax=fix(flenoverlap(windowlenoverlap)×timestep)​, 构造一个大小为windowlen×n" role="presentation">windowlen×n​、元素值都为0的初始时频矩阵S" role="presentation">S​。
    3. 根据当前窗口位蝠,截取信号片段,进行快速傅里叶变换,得到当前窗口中信号片段所对应的频率分布, 记为列向量P" role="presentation">P​;
    4. 更新当前滑动次数 : nnow=nnow+1" role="presentation">nnow=nnow+1​, 更新时频矩阵 S(nnow)=P" role="presentation">S(nnow)=P​;
    5. 判断当前滑动次数 nnow" role="presentation">nnow​ 是否等于总滑动次数 nmax" role="presentation">nmax​, 若是 : 编码完成, 输出时频矩阵S" role="presentation">S​; 否则,窗口滑动一个步长, 然后跳回步骤 2 ; 

    短时傅里叶变换的实现流程简单, 处理时间短且应用广泛, 但其时频分析后的时间-频 率窗口大小不变, 很难捕捉到一些细小的局部信息。

    2 Matlab代码实现

    1. clear, close all
    2. %% initialize parameters
    3. samplerate = 500; % in Hz
    4. nfft = 64; % try to use 32 or 16 to investigate the trade off between time and frequency resolution
    5. noverlap = round(nfft*0.5); % number of overlapping points (50%)
    6. %% generate simulated signals with step changes in frequency
    7. data = csvread('3_1_link6_28_5_30min.csv'); % input the signal from the Excle
    8. data = data'; % change the signal from column to row
    9. N = length(data); % calculate the length of the data
    10. taxis = [1:N]/samplerate; % time axis for whole data length
    11. figure, % plot the origianl signal
    12. plot(taxis,data),xlim([taxis(1) taxis(end)])
    13. xlabel('Time (s)')
    14. %% calculate spectrogram using STFT
    15. [spec,faxis,taxis]=spectrogram(data,hamming(nfft),noverlap,nfft,samplerate);
    16. Mag=abs(spec); % get spectrum magnitude
    17. im = figure;
    18. imagesc(taxis,faxis,Mag) % plot spectrogram as 2D imagsc
    19. colorbar
    20. title('Time-frequency analysis(STFT)')
    21. xlabel('Time (s)'),xlim([taxis(1) taxis(end)])
    22. ylabel('Frequency (Hz)')
    23. saveas(im,'STFT_1.bmp')

    3 结果

    【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】​

  • 相关阅读:
    人大金仓与哪吒科技达成战略合作,加快推动智慧港口建设
    npm run dev报filemanager-webpack-plugin相关错误
    10年的老测试告诉你八大测试用例设计方法
    通信电源专业技术交流
    杰理之应用配置文件《app_config.c》介绍【篇】
    付费进群搭建二维码
    购物网站的秒杀计时器实现
    在QML委托代理机制中使用C++数据模型
    Java设计模式之迭代器模式
    特征解耦,torch.cumprod(),np.random.seed(),plt.scatter
  • 原文地址:https://blog.csdn.net/weixin_41406486/article/details/127813870