Hi Mike,
On Fri, Jan 02, 2009 at 01:46:06PM -0800, Mike Gross wrote:
> Here is a patch to the welchwin.m function in the signal package. The
> version in the current svn has an error that leads to asymmetric
> windows. This patch fixes the problem.
Your fix is good.
However, according to the Matlab documentation,
a non-symmetric window function may be more useful when used with
the DFT (i.e. fft or periodogram).
The fft method of spectral analysis assumes that the data is
periodic with a period of N, so that a symmetric window has
an extra zero on the end.
Matlab solve this problem by allowing an optional second argument
which can have a value "symmetric" or "periodic". The default is
"symmetric".
If you can wait, I will check the code below more thoroughly tomorrow,
fix the documentation string, add a #!demo, and
(if possible) check it is compatible with the Matlab welchwin.
> I also noticed that some of the window functions have a division by 0
> and return NaN when generating a window of length 1. Examples are
> blackmannuttall, blackmanharris, and barthannwin.
> Does anyone have an opinion about modifying the functions to always
> return a valid number for a window length greater than 0?
Except for the rectangular window function it seems that symmetric window
functions should require L>2. If L<3, I would report an error.
The minimum length of non-rectangular periodic windows is L=2.
See below.
> At the same time I could put in checks to verify that the window length
> is an integer.
Good idea.
See below.
Many thanks,
Peter
-------------------------------------------------------------------
function [w] = new_welchwin(L,c)
if (nargin < 1 || nargin>2 ); usage('welchwin(L,[c])'); end
symmetric=1;
if ( nargin==2 )
if ( ! ischar(c) || size(c,1) != 1 ||
( ! strcmp(c,'periodic') && ! strcmp(c,'symmetric') ) )
error( "arg 2 (c) must be \"periodic\" or \"symmetric\"" )
endif
symmetric = ! strcmp(c,'periodic');
endif
minL = 2 + symmetric;
if ( ! isreal(L) || ! isscalar(L) || L<minL || fix(L) != L )
error("arg 1 (L) must be an integer larger than %d", minL-1 );
endif
N = (L-symmetric)/2;
n = 0:L-1;
w = 1 - ((n-N)./N).^2;
endfunction;
------------------------------------------------------------------------------
_______________________________________________
Octave-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/octave-dev