zoukankan      html  css  js  c++  java
  • 时频分析:窗口傅立叶变换

    下面的matlab代码通过窗口傅立叶变换计算了信号的功率谱和互功率谱(power spectrum for time frequency analysis)

    % this code will test the buildin cpsd function and  calculate windowed FAST Fourier Transformation
    % by DocNan 
    clear all; close all; clc;
    tic;
    
    t=(2.5:0.00001:3.5)';
    f=(linspace(0,211000,length(t)))';
    phi=cumtrapz(t,2*pi*f);
    
    sig1=3*sin(phi)+5*randn(length(t),1);
    %sig2=3*sin(phi+1*pi/8.0*0)+15*randn(length(t),1);
    sig2=5*randn(length(t),1);
    
    
    % prepare to buffer the original signal, this step is likely to cut original signal into many small windows and form a large matrix
    noverlap=round(0.8*256);
    Fs=round(1/(t(2)-t(1)));
    window_size=256;%(2,4,8,16,32,64,128,256,512,1024,2048,4096,8192) define the size of window function, small section to do cspd
    overlap_rate=0.997;% define the window overlap rate.
    overlap_number=round(overlap_rate*window_size);% define the 85% overlap of the window
    sig1_buffer=buffer(sig1,window_size,overlap_number); % get the overlapped time window matrix.
    sig2_buffer=buffer(sig2,window_size,overlap_number); % get the overlapped time window matrix.
    
    
    % apply the smooth window to the buffered signal
    window_matrix=gausswin(window_size)*ones(1,size(sig1_buffer,2));
    sig1_buffer=sig1_buffer.*window_matrix;
    sig2_buffer=sig2_buffer.*window_matrix;
    
    
    % calculate power spectrum, only keep the part with positive or zero frequency(half the spectrum)
    pxx=fft(sig1_buffer);
    pxx=2*pxx(1:size(pxx,1)/2+1,:);
    
    % calculate cross power spectrum, cpsd will remove the negative part of spectrum by default
    pxy=cpsd(sig2_buffer,sig1_buffer,window_size);
    
    
    t_new=linspace(t(1),t(end),size(pxy,2));
    f=linspace(0,Fs/2,size(pxy,1));
    
    
    fig1=figure();
    pcolor(t_new,f/1000,10*log10(abs(pxy)));
    shading flat;
    ylabel('f(kHz)');
    xlabel('t(s)');
    legend('CPSD');
    colorbar;
    colormap(gca,jet);
    
    
    fig2=figure();
    pcolor(t_new,f/1000,10*log10(abs(pxx)));
    shading flat;
    ylabel('f(kHz)');
    xlabel('t(s)');
    legend('PSD');
    colorbar;
    colormap(gca,jet);
    
    toc;
    disp(['cost time=',num2str(toc),'s']);
    
    
  • 相关阅读:
    【AS3代码】小游戏打飞机源代码
    【AS3代码】键盘的输入和输出
    PHP多维数组排序
    【AS3代码】一个完整的游戏框架
    【AS3代码】小画板升级版(带重绘回放和清空功能)
    Liunx命令工作总结(1)
    Java NIO基础 我们到底能走多远系列(17)
    ibatis 一对多 解决方案
    图片上传+预览+剪切解决方案我们到底能走多远系列(20)
    Liunx命令工作总结(2)
  • 原文地址:https://www.cnblogs.com/docnan/p/7050860.html
Copyright © 2011-2022 走看看