changeset 11543:57dfca79c58a octave-forge

signal: handle length argument of 1 correctly in window functions
author mtmiller
date Wed, 13 Mar 2013 04:31:54 +0000
parents 5fa97735f2ff
children 51db7d0c81ce
files main/signal/NEWS main/signal/inst/barthannwin.m main/signal/inst/blackmanharris.m main/signal/inst/blackmannuttall.m main/signal/inst/flattopwin.m main/signal/inst/nuttallwin.m
diffstat 6 files changed, 62 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/main/signal/NEWS	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/NEWS	Wed Mar 13 04:31:54 2013 +0000
@@ -10,7 +10,18 @@
       fwht
       ifwht
 
- ** The function `blackmanharris' was fixed to return a column vector.
+ ** Improved Matlab compatibility for the following window functions:
+
+      barthannwin
+      blackmanharris
+      blackmannuttall
+      chebwin
+      flattopwin
+      nuttallwin
+
+    The changes include always returning a column vector, returning a valid
+    window for a length argument of 1, and making all arguments after the
+    length optional.
 
  ** signal is no longer dependent on the optim package.
 
--- a/main/signal/inst/barthannwin.m	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/inst/barthannwin.m	Wed Mar 13 04:31:54 2013 +0000
@@ -26,9 +26,14 @@
     error("L must be a positive integer");
   endif
   L = round(L);
-  N = L-1;
-  n = 0:N;
 
-  w = 0.62 -0.48.*abs(n./(L-1) - 0.5)+0.38*cos(2.*pi*(n./(L-1)-0.5));
-  w = w';
+  if (L == 1)
+    w = 1;
+  else
+    N = L-1;
+    n = 0:N;
+
+    w = 0.62 -0.48.*abs(n./(L-1) - 0.5)+0.38*cos(2.*pi*(n./(L-1)-0.5));
+    w = w';
+  endif
 endfunction
--- a/main/signal/inst/blackmanharris.m	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/inst/blackmanharris.m	Wed Mar 13 04:31:54 2013 +0000
@@ -26,11 +26,15 @@
     error("L must be a number");
   endif
 
-  N = L-1;
-  a0 = 0.35875;
-  a1 = 0.48829;
-  a2 = 0.14128;
-  a3 = 0.01168;
-  n = (0 : N)';
-  w = a0 - a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) - a3.*cos(6.*pi.*n./N);
+  if (L == 1)
+    w = 1;
+  else
+    N = L-1;
+    a0 = 0.35875;
+    a1 = 0.48829;
+    a2 = 0.14128;
+    a3 = 0.01168;
+    n = (0 : N)';
+    w = a0 - a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) - a3.*cos(6.*pi.*n./N);
+  endif
 endfunction
--- a/main/signal/inst/blackmannuttall.m	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/inst/blackmannuttall.m	Wed Mar 13 04:31:54 2013 +0000
@@ -26,12 +26,16 @@
     error("L must be a number");
   endif
 
-  N = L-1;
-  a0 = 0.3635819;
-  a1 = 0.4891775;
-  a2 = 0.1365995;
-  a3 = 0.0106411;
-  n = 0:N;
-  w = a0 - a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) - a3.*cos(6.*pi.*n./N);
-  w = w.';
+  if (L == 1)
+    w = 1;
+  else
+    N = L-1;
+    a0 = 0.3635819;
+    a1 = 0.4891775;
+    a2 = 0.1365995;
+    a3 = 0.0106411;
+    n = 0:N;
+    w = a0 - a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) - a3.*cos(6.*pi.*n./N);
+    w = w.';
+  endif
 endfunction
--- a/main/signal/inst/flattopwin.m	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/inst/flattopwin.m	Wed Mar 13 04:31:54 2013 +0000
@@ -40,6 +40,10 @@
     endif
   endif
     
-  x = 2*pi*[0:L-1]'/divisor;
-  w = (1-1.93*cos(x)+1.29*cos(2*x)-0.388*cos(3*x)+0.0322*cos(4*x))/4.6402;
+  if (L == 1)
+    w = 1;
+  else
+    x = 2*pi*[0:L-1]'/divisor;
+    w = (1-1.93*cos(x)+1.29*cos(2*x)-0.388*cos(3*x)+0.0322*cos(4*x))/4.6402;
+  endif
 endfunction
--- a/main/signal/inst/nuttallwin.m	Wed Mar 13 04:19:57 2013 +0000
+++ b/main/signal/inst/nuttallwin.m	Wed Mar 13 04:31:54 2013 +0000
@@ -31,12 +31,16 @@
     warning('L rounded to the nearest integer.');
   end
 
-  N = L-1;
-  a0 = 0.355768;
-  a1 = 0.487396;
-  a2 = 0.144232;
-  a3 = 0.012604;
-  n = -N/2:N/2;
-  w = a0 + a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) + a3.*cos(6.*pi.*n./N);
-  w = w';
+  if (L == 1)
+    w = 1;
+  else
+    N = L-1;
+    a0 = 0.355768;
+    a1 = 0.487396;
+    a2 = 0.144232;
+    a3 = 0.012604;
+    n = -N/2:N/2;
+    w = a0 + a1.*cos(2.*pi.*n./N) + a2.*cos(4.*pi.*n./N) + a3.*cos(6.*pi.*n./N);
+    w = w';
+  endif
 endfunction