⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stft2.m

📁 该工具箱为时频分析中的一类重要变换,离散时频分布的工具箱,其中提供基本算法的程序.可直接应用
💻 M
字号:
function [tfd, t, f] = stft2(x, fs, nfreq, decf, w, how)% stft2 -- Compute samples of the type II short-time Fourier transform.%%  Usage%    [tfd, t, f] = stft2(x, fs, nfreq, decf, w, how)%%  Inputs%    x      signal vector%    fs     sampling frequency of x (optional, default is 1 sample/second)%    nfreq  number of samples to compute in frequency (optional, default%           is 256)%    decf   sub-sampling factor in time of the stft (optional, default %           is 1, i.e. no sub-sampling)%    w      if length(w)==1 then the window is a guassian with duration 'w'%           (see chirplets.m), otherwise 'w' is the window.  'w' must have an%           odd length to have a center point. (optional, default is a %           gaussian with a duration of 5)%    how    if how='short' then the stft is computed for the same times%           as the signal and %               size(tfd,2) = length(x)%           if how='long' then the stft will be computed for times before%           and after the times of the signal and%               size(tfd,2) = length(x) + length(w) - 1%           (optional, default is 'short')%%  Outputs%    tfd   matrix containing the STFT of signal x%    t     vector of sampling times (optional)%    f     vector of frequency values (optional)% Copyright (C) -- see DiscreteTFDs/Copyrightx = x(:);N=length(x);error(nargchk(1, 6, nargin));if (nargin < 2) fs = 1; endif (nargin < 3)  M = 63;  w = chirplets(M,[1 (M+1)/2 0 0 5]);  nfreq = 256;endif (nargin < 4) decf = 1; endif (nargin < 5)  M = 63;  w = chirplets(M,[1 (M+1)/2 0 0 5]);endif (nargin < 6) how = 'short'; endif (length(w)==1)  M = 2*round(32*w/5)-1;  w = chirplets(M,[1 (M+1)/2 0 0 w]);else  w = w(:);  M = length(w);endif (round(M/2) == M/2)  error('window length must be odd')endif (N <= M)  error('the signal must be longer than the window')end% Create a matrix filled with signal values.x = [x; zeros(decf,1)];   % prevents going past the end of the arrayif (how(1) == 'l')  L = ceil((M+N-1)/decf);  tfd=zeros(M,L);  tfd(M,1)=x(1);  for n=2:L,    tfd(1:M-decf,n)=tfd(1+decf:M,n-1);    t = (n-1)*decf+1;      % real time    if (t-decf+1 <= N)    % we still have new data to add      tfd(M-decf+1:M,n) = x(t-decf+1:t);    end  endelse % how == 'short'  L = ceil(N/decf);  tfd=zeros(M,L);  tfd((M+1)/2:M,1)=x(1:(M+1)/2);  for n=2:L,    tfd(1:M-decf,n)=tfd(1+decf:M,n-1);    t = (n-1)*decf+1;      % real time    if ((M-1)/2+t-decf+1 <= N)      tfd(M-decf+1:M,n)=x((M-1)/2+t-decf+1:(M-1)/2+t);    end  endend% Window the data.w=w*ones(1,L);tfd=tfd.*w;% take care of the case if M > nfreqif (M>nfreq)  P = ceil(M/nfreq);  tfd = [tfd ; zeros(P*nfreq-M,L)];  tfd = reshape(tfd,nfreq,P,L);  tfd = squeeze(sum(tfd,2));end% Perform the column ffts to get the stft.tfd = fft(tfd, nfreq);tfd = tfdshift(tfd)/sqrt(nfreq);if (how(1) == 'l')  t = 1/fs * ((0:N+M-2) - (M-1)/2);  t = t(1:decf:end);else  t = 1/fs * (0:N-1);  t = t(1:decf:end);endf = -fs/2:fs/nfreq:fs/2;f = f(1:nfreq);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -