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

📄 myspecgram.m

📁 To see an spectrogram of a signal non perodical
💻 M
字号:
% usage: [Timefreq [, f [, t]]] = specgram(x [, n [, Fs [, window [, overlap]]]])% Original version by Paul Kienzle; modified by Sean Fulop March 2002% Generate a spectrogram for the signal. This chops the signal into% overlapping slices, windows each slice and applies a Fourier% transform to determine the frequency components at that slice.%% x: vector of samples% n: size of fourier transform window, or [] for default=256% Fs: sample rate, or [] for default=2 Hz% window: shape of the fourier transform window, or [] for default=hanning(n)%    Note: window length can be specified instead, in which case%    window=hanning(length)% overlap: overlap with previous window, or [] for default=length(window)/2% Example%    x = chirp([0:0.001:2],0,2,500);  # freq. sweep from 0-500 over 2 sec.%    Fs=1000;                  # sampled every 0.001 sec so rate is 1 kHz%    step=ceil(20*Fs/1000);    # one spectral slice every 20 ms%    window=ceil(100*Fs/1000); # 100 ms data window%    specgram(x, 2^nextpow2(window), Fs, window, window-step);%function [Timefreq, f_r, t_r] = myspecgram(x, n, Fs, window, overlap)  if nargin < 1 | nargin > 5    error('usage: ([Y [, f [, t]]] = specgram(x [, n [, Fs [, window [, overlap]]]]) ')  end  % assign defaults  if nargin < 2 | isempty(n), n = min(256, length(x)); end  if nargin < 3 | isempty(Fs), Fs = 2; end  if nargin < 4 | isempty(window), window = hanning(n); end  if nargin < 5 | isempty(overlap), overlap = length(window)/2; end  % if only the window length is given, generate hanning window  if length(window) == 1, window = hanning(window); end  % should be extended to accept a vector of frequencies at which to  % evaluate the fourier transform (via filterbank or chirp  % z-transform)  if length(n)>1,     error('specgram doesn''t handle frequency vectors yet') end  % compute window offsets  win_size = length(window);  if (win_size > n)    n = win_size;    warning('specgram fft size adjusted---must be at least as long as frame')end  step = win_size - overlap;  % build matrix of windowed data slices  offset = [ 1 : step : length(x)-win_size ];  S = zeros (n, length(offset));  for i=1:length(offset)    S(1:win_size, i) = x(offset(i):offset(i)+win_size-1) .* window;end  % compute fourier transform  STFT = fft(S);         % extract the positive frequency components  if rem(n,2)==1    ret_n = (n+1)/2;  else    ret_n = n/2;end  inst = input('Do you want to see a spectrogram of this STFT (y/n)?', 's');  if strcmp(inst,'n') | strcmp(inst,'no')      f = [0:ret_n-1]*Fs/n; t = offset/Fs;    if nargout>0, Timefreq = STFT; end    if nargout>1, f_r = f; end    if nargout>2, t_r = t; end       return   else      if nargout>0, Timefreq = STFT; end   STFT = STFT(1:ret_n, :);  f = [0:ret_n-1]*Fs/n;  t = offset/Fs;    if nargout>1, f_r = f; end  if nargout>2, t_r = t; end  maxfreq = input('Please enter the maximum frequency (Hz)\n you wish to see on the display:');  STFTmag = abs(STFT(2:n*maxfreq/Fs,:)); % magnitude of STFTSTFTmag = STFTmag/max(max(STFTmag)); % normalize so max magnitude will be 0 dbSTFTmag = max(STFTmag, 10^(-35/10)); % clip everything below -35 dB% imagesc(t, f(2:n*maxfreq/Fs), 20*log10(STFTmag)); axis xy; colormap(flipud(gray));% display as an indexed grayscale image showing the log magnitude of the STFT, % i.e. a spectrogram; the colormap is flipped to invert the default setting,% in which white is most intense and black least---in speech science we want% the opposite of that.pcolor(t, f(2:n*maxfreq/Fs), 20*log10(STFTmag));axis xy;colormap(flipud(gray));shading interp;end inst = input('How about a snazzy 3-D color spectrogram (y/n)','s');if strcmp(inst,'no') | strcmp(inst, 'n')    returnelse figure;surf(t, f(2:n*maxfreq/Fs), 20*log10(STFTmag));axis xy; view(20,84);colormap(jet);shading interp;end 

⌨️ 快捷键说明

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