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

📄 dpssint.m

📁 多频道功率谱计算程序
💻 M
字号:
function [En,V] = dpssint(N, W, M, int) 
% Syntax: [En,V]=dpssint(N,W); [En,V]=dpssint(N,W,M,'spline'); 
%  Dpssint calculates discrete prolate spheroidal 
%  sequences for the parameters N and W. Note that 
%  W is normally 2, 5/2, 3, 7/2, or 4 - not i/N. The  
%  dpss are interpolated from previously calculated  
%  dpss of order M (128, 256, 512, or 1024). 256 is the  
%  default for M. The interpolation can be 'linear'  
%  or 'spline'. 'Linear' is faster, 'spline' the default. 
%  Linear interpolation can only be used for M>N.  
%  Returns: 
%              E: matrix of dpss (N by 2W) 
%              V: eigenvalue vector (2W) 
%  
% Errors in the interpolated dpss are very small but should be  
% checked if possible. The differences between interpolated 
% values and values from dpsscalc are generally of order 
% 10ee-5 or better. Spline interpolation is generally more 
% accurate. Fractional errors can be very large near 
% the zero-crossings but this does not seriously affect 
% windowing calculations. The error can be reduced by using 
% values for M which are close to N. 
% 
% Written by Eric Breitenberger, version date 10/3/95. 
% Please send comments and suggestions to eric@gi.alaska.edu 
% 
 
if     nargin==2, 
  M=256; int='spline'; 
elseif nargin==3, 
  if isstr(M), int=M; M=256;  
  else, int='spline';, end 
end 
 
if int=='linear' & N>M 
  error('Linear interpolation cannot be used for N>M. Use splining instead.') 
end 
 
if rem(W,1)==0 
  filename=['s' int2str(M) '_' int2str(W) '.mat'];  
else 
  filename=['s' int2str(M) '_' int2str(10*W) '.mat'];  
end 
 
if exist(filename)==2 
  eval(['load ' filename]) 
else 
  filename 
  error('Requested DPSS file not found.') 
end 
 
 
k=2*W;  % Use only first k values 
E=E(:,1:k); 
V=V(1:k); 
En=zeros(N,k); 
x=1:M; 
 
% The scaling for the interpolation: 
% This is not necessarily optimal, and  
% changing s can improve accuracy. 
  
s=M/N; 
midm=(M+1)/2; 
midn=(N+1)/2; 
delta=midm-s*midn; 
xi=linspace(1-delta, M+delta, N); 
 
% Interpolate from M values to N 
% Spline interpolation is a bit better, 
% but takes about twice as long. 
% Errors from linear interpolation are  
% usually smaller than errors from scaling. 
 
if int=='linear' 
  for i=1:k, En(:,i)=interp1(x,E(:,i),xi); end 
elseif int=='spline' 
  for i=1:k, En(:,i)=spline(x,E(:,i),xi)'; end 
end 
 
% Re-normalize the eigenvectors 
En=En./(ones(N,1)*sqrt(sum(En.*En))); 

⌨️ 快捷键说明

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