Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package octave-forge-signal for
openSUSE:Factory checked in at 2022-11-09 12:57:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/octave-forge-signal (Old)
and /work/SRC/openSUSE:Factory/.octave-forge-signal.new.1597 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "octave-forge-signal"
Wed Nov 9 12:57:52 2022 rev:6 rq:1034677 version:1.4.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/octave-forge-signal/octave-forge-signal.changes
2022-07-19 17:19:17.336360804 +0200
+++
/work/SRC/openSUSE:Factory/.octave-forge-signal.new.1597/octave-forge-signal.changes
2022-11-09 12:58:18.680644196 +0100
@@ -1,0 +2,10 @@
+Tue Nov 8 17:08:13 UTC 2022 - Stefan Br??ns <[email protected]>
+
+- Update to version 1.4.3:
+ * Minor bug fixes and documentation improvements have been made to
+ the following functions:
+ fir2 remez residuez
+ sos2tf sos2zp xcorr
+ zp2sos
+
+-------------------------------------------------------------------
Old:
----
signal-1.4.2.tar.gz
New:
----
signal-1.4.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ octave-forge-signal.spec ++++++
--- /var/tmp/diff_new_pack.KVO9ju/_old 2022-11-09 12:58:19.140646790 +0100
+++ /var/tmp/diff_new_pack.KVO9ju/_new 2022-11-09 12:58:19.148646835 +0100
@@ -18,12 +18,12 @@
%define octpkg signal
Name: octave-forge-%{octpkg}
-Version: 1.4.2
+Version: 1.4.3
Release: 0
Summary: Signal processing tools for Octave
License: GPL-3.0-or-later AND SUSE-Public-Domain
Group: Productivity/Scientific/Math
-URL: https://octave.sourceforge.io
+URL: https://gnu-octave.github.io/packages/%{octpkg}/
Source0:
https://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz
BuildRequires: gcc-c++
BuildRequires: hdf5-devel
++++++ signal-1.4.2.tar.gz -> signal-1.4.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/DESCRIPTION new/signal-1.4.3/DESCRIPTION
--- old/signal-1.4.2/DESCRIPTION 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/DESCRIPTION 2022-10-28 13:26:05.000000000 +0200
@@ -1,6 +1,6 @@
Name: signal
-Version: 1.4.2
-Date: 2022-04-22
+Version: 1.4.3
+Date: 2022-10-28
Author: various authors
Maintainer: Mike Miller <[email protected]>
Title: Signal Processing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/NEWS new/signal-1.4.3/NEWS
--- old/signal-1.4.2/NEWS 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/NEWS 2022-10-28 13:26:05.000000000 +0200
@@ -1,3 +1,13 @@
+Summary of important user-visible changes for signal 1.4.3:
+----------------------------------------------------------
+
+ ** Minor bug fixes and documentation improvements have been made to the
+ following functions:
+
+ fir2 remez residuez
+ sos2tf sos2zp xcorr
+ zp2sos
+
Summary of important user-visible changes for signal 1.4.2:
----------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/fir2.m new/signal-1.4.3/inst/fir2.m
--- old/signal-1.4.2/inst/fir2.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/fir2.m 2022-10-28 13:26:05.000000000 +0200
@@ -74,6 +74,13 @@
if nargin < 4, grid_n=[]; endif
if nargin < 5, ramp_n=[]; endif
+ if (! (isscalar (n) && (n == fix (n)) && (n >= 0)))
+ error ("fir2: n must be a non negative integer");
+ else
+ # ensure n is used as a double type
+ n = double(n);
+ endif
+
## find the window parameter, or default to hamming
w=[];
if length(grid_n)>1, w=grid_n; grid_n=[]; endif
@@ -189,6 +196,14 @@
%! assert (h(4) <= 1/sqrt (2))
%! assert (h(5), 1, 2e-3)
+%!test #bug 59066
+%! f = [0, 0.45, 0.45, 0.55, 0.55, 1]; m = [1, 1, 0, 0, 1, 1];
+%! b = fir2 (int32(50), f, m);
+%! assert(numel(b), 51)
+%!
+%! fail ("fir2 (50.1, f, m)", "fir2: n must be a non negative integer")
+%! fail ("fir2 (-1, f, m)", "fir2: n must be a non negative integer")
+
%!demo
%! f=[0, 0.3, 0.3, 0.6, 0.6, 1]; m=[0, 0, 1, 1/2, 0, 0];
%! [h, w] = freqz(fir2(100,f,m));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/residuez.m
new/signal-1.4.3/inst/residuez.m
--- old/signal-1.4.2/inst/residuez.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/residuez.m 2022-10-28 13:26:05.000000000 +0200
@@ -76,7 +76,7 @@
[r,p,f,m]=residue(conj(fliplr(NUM)),conj(fliplr(DEN)));
p = 1 ./ p;
r = r .* ((-p) .^m);
- if f, f = conj(fliplr(f)); endif
+ f = conj(fliplr(f));
endfunction
@@ -170,3 +170,10 @@
%! assert(p(is),pise,100*eps);
%! assert(f,[],100*eps);
%! assert(m,[1;1;1;1;1],100*eps);
+
+%!test # bug 57359
+%! [r,p,k] = residuez([1 1 1.5 .5],[1 1.5 .5]);
+%! [rs,is] = sort(r);
+%! assert(r(is), [-1; 2], 100*eps);
+%! assert(p(is), [-0.5; -1], 100*eps);
+%! assert(k, [0 1], 100*eps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/sos2tf.m
new/signal-1.4.3/inst/sos2tf.m
--- old/signal-1.4.2/inst/sos2tf.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/sos2tf.m 2022-10-28 13:26:05.000000000 +0200
@@ -1,4 +1,5 @@
## Copyright (C) 2005 Julius O. Smith III <[email protected]>
+## Copyright (C) 2021 Charles Praplan
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -17,7 +18,7 @@
## -*- texinfo -*-
## @deftypefn {Function File} {[@var{b}, @var{a}] =} sos2tf (@var{sos})
## @deftypefnx {Function File} {[@var{b}, @var{a}] =} sos2tf (@var{sos},
@var{g})
-## Convert series second-order sections to direct form @math{H(z) = B(z)/A(z)}.
+## Convert series second-order sections to transfer function.
##
## INPUTS:
## @itemize
@@ -28,8 +29,13 @@
## @var{sos} = [@var{B1}.' @var{A1}.'; ...; @var{BN}.' @var{AN}.']
## @end example
## where
-## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [1 a1 a2]} for
-## section 1, etc. The b0 entry must be nonzero for each section.
+## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [a0 a1 a2]} for
+## section 1, etc.
+##
+## a0 is usually equal to 1 because all 2nd order transfer functions
+## can be scaled so that a0 = 1.
+## However, this is not mandatory for this implementation, which supports
+## all kinds of transfer functions, including first order transfer functions.
## See @code{filter} for documentation of the second-order direct-form filter
## coefficients @var{B}i and @var{A}i.
##
@@ -40,7 +46,8 @@
## @end itemize
##
## RETURNED:
-## @var{b} and @var{a} are vectors specifying the digital filter @math{H(z) =
B(z)/A(z)}.
+## @var{b} and @var{a} are vectors specifying the analog or digital filter
+## @math{H(s) = B(s)/A(s)} or @math{H(z) = B(z)/A(z)}.
## See @code{filter} for further details.
##
## @seealso{tf2sos, zp2sos, sos2pz, zp2tf, tf2zp}
@@ -66,16 +73,26 @@
A = conv(A, sos(i,4:6));
endfor
- nB = length(B);
- while nB && B(nB)==0
- B=B(1:nB-1);
- nB=length(B);
+ nA = length (A);
+ nB = length (B);
+ if nA ~= nB
+ error('Internal error: length (A) not equal to length (B)');
+ # This error cannot occur (if the above calls to the conv function
+ # are not modified and if the conv function is also not modified)
+ endif;
+
+ # Removing trailing zeros if present in numerator and denominator
+ while nB && B(nB)==0 && A(nB)==0
+ B = B(1:nB-1);
+ A = A(1:nA-1);
+ nB = length (B);
endwhile
- nA = length(A);
- while nA && A(nA)==0
- A=A(1:nA-1);
- nA=length(A);
+ # Removing leading zeros if present in numerator and denominator
+ while nB && B(1)==0 && A(1)==0
+ A = A(2:end);
+ B = B(2:end);
+ nB--;
endwhile
B = B .* prod (g);
@@ -120,3 +137,44 @@
%! assert (Bh, 8 * B, 10*eps);
%! assert (Ah, A, 10*eps);
+## Test with trailing zero in numerator
+%!test
+%! sos = [1, 1, 0, 0, 1, 0.5];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, sos(1,1:3) , 10*eps);
+%! assert (Ah, sos(1,4:6), 10*eps);
+
+## Test with trailing zero in denominator
+%!test
+%! sos = [0, 1, 1, 1, 0.5, 0];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, sos(1,1:3) , 10*eps);
+%! assert (Ah, sos(1,4:6), 10*eps);
+
+## Test with trailing zero both in numerator and in denominator
+%!test
+%! sos = [1, 1, 0, 1, 0.5, 0];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, [1, 1] , 10*eps);
+%! assert (Ah, [1, 0.5], 10*eps);
+
+## Test with leading zero in numerator
+%!test
+%! sos = [0, 1, 1, 1, 1, 0.5];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, sos(1,1:3) , 10*eps);
+%! assert (Ah, sos(1,4:6), 10*eps);
+
+## Test with leading zero in denominator
+%!test
+%! sos = [1, 1, 0, 0, 1, 0.5];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, sos(1,1:3) , 10*eps);
+%! assert (Ah, sos(1,4:6), 10*eps);
+
+## Test with leading zero both in numerator and in denominator
+%!test
+%! sos = [0, 1, 1, 0, 1, 0.5];
+%! [Bh, Ah] = sos2tf (sos);
+%! assert (Bh, [1, 1] , 10*eps);
+%! assert (Ah, [1, 0.5], 10*eps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/sos2zp.m
new/signal-1.4.3/inst/sos2zp.m
--- old/signal-1.4.2/inst/sos2zp.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/sos2zp.m 2022-10-28 13:26:05.000000000 +0200
@@ -1,4 +1,5 @@
## Copyright (C) 2005 Julius O. Smith III <[email protected]>
+## Copyright (C) 2021 Charles Praplan
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -29,8 +30,13 @@
## @var{sos} = [@var{B1}.' @var{A1}.'; ...; @var{BN}.' @var{AN}.']
## @end example
## where
-## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [1 a1 a2]} for
-## section 1, etc. The b0 entry must be nonzero for each section.
+## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [a0 a1 a2]} for
+## section 1, etc.
+##
+## a0 is usually equal to 1 because all 2nd order transfer functions can
+## be scaled so that a0 = 1.
+## However, this is not mandatory for this implementation, which supports
+## all kinds of transfer functions, including first order transfer functions.
## See @code{filter} for documentation of the second-order direct-form filter
## coefficients @var{B}i and @var{A}i.
##
@@ -75,22 +81,43 @@
print_usage;
endif
- gains = sos(:,1); # All b0 coeffs
- k = prod(gains)*g; # pole-zero gain
- if k==0, error('sos2zp: one or more section gains is zero'); endif
- sos(:,1:3) = sos(:,1:3)./ [gains gains gains];
-
[N,m] = size(sos);
if m~=6, error('sos2zp: sos matrix should be N by 6'); endif
- z = zeros(2*N,1);
- p = zeros(2*N,1);
+ k = g;
+ for i = 1:N
+ b = sos(i,1:3);
+ N2 = 3;
+ while N2 && b(1)==0 # Removing leading zeros
+ b = b(2:end);
+ N2 = N2 - 1;
+ endwhile
+
+ a = sos(i,4:6);
+ N2 = 3;
+ while N2 && a(1)==0 # Removing leading zeros
+ a = a(2:end);
+ N2--;
+ endwhile
+
+ if isempty (a)
+ warning ('Infinite gain detected');
+ k = Inf;
+ elseif a(1) == 0
+ warning ('Infinite gain detected');
+ k = Inf;
+ elseif isempty (b)
+ k = 0;
+ else
+ k = k * b(1) / a(1);
+ endif
+ endfor
+
+ z = [];
+ p = [];
for i=1:N
- ndx = [2*i-1:2*i];
- zi = roots(sos(i,1:3));
- z(ndx) = zi;
- pi = roots(sos(i,4:6));
- p(ndx) = pi;
+ z=[z; roots(sos(i,1:3))];
+ p=[p; roots(sos(i,4:6))];
endfor
endfunction
@@ -106,3 +133,45 @@
%! k = 4;
%! [z2,p2,k2] = sos2zp(sos,1);
%! assert({cplxpair(z2),cplxpair(p2),k2},{z,p,k},100*eps);
+
+## Test with trailing zero in numerator
+%!test
+%! sos = [1, 1, 0, 1, 1, 0.5];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
+
+## Test with trailing zero in denominator
+%!test
+%! sos = [0, 1, 1, 1, 0.5, 0];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
+
+## Test with trailing zero both in numerator and in denominator
+%!test
+%! sos = [1, 1, 0, 1, 0.5, 0];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
+
+## Test with leading zero in numerator
+%!test
+%! sos = [0, 1, 1, 1, 1, 0.5];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
+
+## Test with leading zero in denominator
+%!test
+%! sos = [1, 1, 0, 0, 1, 0.5];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
+
+## Test with leading zero both in numerator and in denominator
+%!test
+%! sos = [0, 1, 1, 0, 1, 0.5];
+%! [Z, P] = sos2zp (sos);
+%! assert (Z, roots (sos(1,1:3)), 10*eps);
+%! assert (P, roots (sos(1,4:6)), 10*eps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/xcorr.m
new/signal-1.4.3/inst/xcorr.m
--- old/signal-1.4.2/inst/xcorr.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/xcorr.m 2022-10-28 13:26:05.000000000 +0200
@@ -1,6 +1,7 @@
## Copyright (C) 1999-2001 Paul Kienzle <[email protected]>
## Copyright (C) 2004 <[email protected]>
## Copyright (C) 2008, 2010 Peter Lanspeary <[email protected]>
+## Copyright (C) 2022 Octave-Forge community <[email protected]>
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -77,7 +78,7 @@
## return the biased average, R/N,
## @item unbiased
## return the unbiased average, R(k)/(N-|k|),
-## @item coeff
+## @item coeff or normalized
## return the correlation coefficient, R/(rms(x).rms(y)),
## where "k" is the lag, and "N" is the length of @var{X}.
## If omitted, the default value is "none".
@@ -135,26 +136,36 @@
## If length(x) == length(y) + k, then you can use the simpler
## ( hankel(x(1:k),x(k:N-k)) * y ) ./ N
-function [R, lags] = xcorr (X, Y, maxlag, scale)
+function [R, lags] = xcorr (X, varargin)
if (nargin < 1 || nargin > 4)
print_usage;
endif
- ## assign arguments that are missing from the list
- ## or reassign (right shift) them according to data type
- if nargin==1
- Y=[]; maxlag=[]; scale=[];
- elseif nargin==2
- maxlag=[]; scale=[];
- if ischar(Y), scale=Y; Y=[];
- elseif isscalar(Y), maxlag=Y; Y=[];
+ ## assign optional arguments according to data type
+ maxlag=[]; scale=[]; Y=[];
+
+ for idx=1:length(varargin)
+ arg = varargin{idx};
+ if ischar(arg)
+ if isempty(scale)
+ scale = arg;
+ else
+ error ("xcorr: unexpected char value '%s' when scale is already set to
'%s'", arg, scale);
+ endif
+ elseif isscalar(arg)
+ if isempty(maxlag)
+ maxlag = arg;
+ else
+ error ("xcorr: unexpected scalar value '%f' when maxlag is already set
to '%f'", arg, maxlag);
+ endif
+ elseif idx == 1
+ Y = arg;
+ else
+ error ("xcorr: unknown optional input variable at position %d", idx);
endif
- elseif nargin==3
- scale=[];
- if ischar(maxlag), scale=maxlag; maxlag=[]; endif
- if isscalar(Y), maxlag=Y; Y=[]; endif
- endif
+
+ endfor
## assign defaults to missing arguments
if isvector(X)
@@ -167,7 +178,7 @@
if isempty(scale), scale='none'; endif
## check argument values
- if isempty(X) || isscalar(X) || ischar(Y) || ! ismatrix(X)
+ if isempty(X) || isscalar(X) || ! ismatrix(X)
error("xcorr: X must be a vector or matrix");
endif
if isscalar(Y) || ischar(Y) || (!isempty(Y) && !isvector(Y))
@@ -179,6 +190,7 @@
if !isscalar(maxlag) || !isreal(maxlag) || maxlag<0 || fix(maxlag)!=maxlag
error("xcorr: maxlag must be a single non-negative integer");
endif
+
##
## sanity check on number of requested lags
## Correlations for lags in excess of +/-(N-1)
@@ -248,7 +260,7 @@
R = R ./ N;
elseif strcmp(scale, 'unbiased')
R = R ./ ( [ N-maxlag:N-1, N, N-1:-1:N-maxlag ]' * ones(1,columns(R)) );
- elseif strcmp(scale, 'coeff')
+ elseif strcmp(scale, 'coeff') || strcmp(scale, 'normalized')
## R = R ./ R(maxlag+1) works only for autocorrelation
## For cross correlation coeff, divide by rms(X)*rms(Y).
if !isvector(X)
@@ -328,3 +340,91 @@
## endfor
##endif
##--------------------------------------------------------------
+
+%!shared x, y
+%! x = 0.5.^(0:15);
+%! y = circshift(x,5);
+
+## Test input validation
+%!error xcorr ()
+%!error xcorr (1)
+%!error xcorr (x, 1, x)
+%!error xcorr (x, 'none', x)
+%!error xcorr (x, x, 'invalid')
+%!error xcorr (x, 'invalid')
+
+%!test
+%! [c,lags] = xcorr(x);
+%! # largest spike at 0 lag, where X matches itself - ie the center
+%! [m, im] = max(c);
+%! assert(m, 4/3, 1e-6)
+%! assert(im, (numel(lags)+1)/2);
+%!
+%! [c1,lags1] = xcorr(x, x);
+%! [m, im] = max(c1);
+%! assert(m, 4/3, 1e-6)
+%! assert(im, (numel(lags1)+1)/2);
+%! assert(c1, c, 2*eps);
+%! assert(lags1, lags);
+
+%!test
+%! [c,lags] = xcorr(x,y);
+%! # largest spike at 0 lag, where X matches Y
+%! [m, im] = max(c);
+%! assert(m, 4/3, 1e-6)
+%! assert(lags(im), -5);
+
+%!test
+%! [c0,lags0] = xcorr(x,y);
+%! [c1,lags1] = xcorr(x,y, 'none');
+%! assert(c0, c1);
+%! assert(lags0, lags1);
+
+%!test
+%! [c0,lags0] = xcorr(x,y);
+%! [c1,lags1] = xcorr(x,y, 'normalized');
+%! assert(lags0, lags1);
+%! [m, im] = max(c1);
+%! # at 0 lag, should be 1
+%! assert(m, 1, 1e-6);
+%! [c2,lags2] = xcorr(x,y, 'coeff');
+%! assert(c1, c2);
+%! assert(lags1, lags2);
+
+%!test
+%! [c0,lags0] = xcorr(x,y);
+%! [c1,lags1] = xcorr(x,y, 'biased');
+%! assert(lags0, lags1);
+%! [m, im] = max(c1);
+%! assert(m, 1/12, 1e-6);
+%!
+%! [c1,lags1] = xcorr(x, 'biased');
+%! assert(lags0, lags1);
+%! [m, im] = max(c1);
+%! assert(m, 1/12, 1e-6);
+
+%!test
+%! [c0,lags0] = xcorr(x,y);
+%! [c1,lags1] = xcorr(x,y, 'unbiased');
+%! assert(lags0, lags1);
+%! [m, im] = max(c1);
+%! assert(m, 1/8.25, 1e-6);
+
+%!test
+%! [c,lags] = xcorr(x,y, 10);
+%! [m, im] = max(c);
+%! assert(lags(im), -5);
+%! assert(lags(1), -10);
+%! assert(lags(end), 10);
+%!
+%! [c,lags] = xcorr(x,10);
+%! [m, im] = max(c);
+%! assert(lags(1), -10);
+%! assert(lags(end), 10);
+
+%!test
+%! [c0,lags0] = xcorr(x,y, 'normalized', 10);
+%! [c1,lags1] = xcorr(x,y, 10, 'normalized');
+%! assert(c0, c1);
+%! assert(lags0, lags1);
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/inst/zp2sos.m
new/signal-1.4.3/inst/zp2sos.m
--- old/signal-1.4.2/inst/zp2sos.m 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/inst/zp2sos.m 2022-10-28 13:26:05.000000000 +0200
@@ -1,154 +1,213 @@
-## Copyright (C) 2005 Julius O. Smith III <[email protected]>
-##
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; see the file COPYING. If not, see
-## <https://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @deftypefn {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z})
-## @deftypefnx {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z},
@var{p})
-## @deftypefnx {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z},
@var{p}, @var{k})
-## @deftypefnx {Function File} {@var{sos} =} zp2sos (@dots{})
-## Convert filter poles and zeros to second-order sections.
-##
-## INPUTS:
-## @itemize
-## @item
-## @var{z} = column-vector containing the filter zeros
-## @item
-## @var{p} = column-vector containing the filter poles
-## @item
-## @var{k} = overall filter gain factor
-## If not given the gain is assumed to be 1.
-## @end itemize
-##
-## RETURNED:
-## @itemize
-## @item
-## @var{sos} = matrix of series second-order sections, one per row:
-## @example
-## @var{sos} = [@var{B1}.' @var{A1}.'; ...; @var{BN}.' @var{AN}.']
-## @end example
-## where
-## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [1 a1 a2]} for
-## section 1, etc. The b0 entry must be nonzero for each section.
-## See @code{filter} for documentation of the second-order direct-form filter
-## coefficients @var{B}i and %@var{A}i, i=1:N.
-##
-## @item
-## @var{g} is the overall gain factor that effectively scales
-## any one of the @var{B}i vectors.
-## @end itemize
-##
-## If called with only one output argument, the overall filter gain is
-## applied to the first second-order section in the matrix @var{sos}.
-##
-## EXAMPLE:
-## @example
-## [z, p, k] = tf2zp ([1 0 0 0 0 1], [1 0 0 0 0 .9]);
-## [sos, g] = zp2sos (z, p, k)
-##
-## sos =
-## 1.0000 0.6180 1.0000 1.0000 0.6051 0.9587
-## 1.0000 -1.6180 1.0000 1.0000 -1.5843 0.9587
-## 1.0000 1.0000 0 1.0000 0.9791 0
-##
-## g =
-## 1
-## @end example
-##
-## @seealso{sos2pz, sos2tf, tf2sos, zp2tf, tf2zp}
-## @end deftypefn
-
-function [sos,g] = zp2sos(z,p,k)
-
- if nargin<3, k=1; endif
- if nargin<2, p=[]; endif
-
- [zc,zr] = cplxreal(z(:));
- [pc,pr] = cplxreal(p(:));
-
- ## zc,zr,pc,pr
-
- nzc=length(zc);
- npc=length(pc);
-
- nzr=length(zr);
- npr=length(pr);
-
- ## Pair up real zeros:
- if nzr
- if mod(nzr,2)==1, zr=[zr;0]; nzr=nzr+1; endif
- nzrsec = nzr/2;
- zrms = -zr(1:2:nzr-1)-zr(2:2:nzr);
- zrp = zr(1:2:nzr-1).*zr(2:2:nzr);
- else
- nzrsec = 0;
- endif
-
- ## Pair up real poles:
- if npr
- if mod(npr,2)==1, pr=[pr;0]; npr=npr+1; endif
- nprsec = npr/2;
- prms = -pr(1:2:npr-1)-pr(2:2:npr);
- prp = pr(1:2:npr-1).*pr(2:2:npr);
- else
- nprsec = 0;
- endif
-
- nsecs = max(nzc+nzrsec,npc+nprsec);
-
- ## Convert complex zeros and poles to real 2nd-order section form:
- zcm2r = -2*real(zc);
- zca2 = abs(zc).^2;
- pcm2r = -2*real(pc);
- pca2 = abs(pc).^2;
-
- sos = zeros(nsecs,6);
- sos(:,1) = ones(nsecs,1); # all 2nd-order polynomials are monic
- sos(:,4) = ones(nsecs,1);
-
- nzrl=nzc+nzrsec; # index of last real zero section
- nprl=npc+nprsec; # index of last real pole section
-
- for i=1:nsecs
-
- if i<=nzc # lay down a complex zero pair:
- sos(i,2:3) = [zcm2r(i) zca2(i)];
- elseif i<=nzrl # lay down a pair of real zeros:
- sos(i,2:3) = [zrms(i-nzc) zrp(i-nzc)];
- endif
-
- if i<=npc # lay down a complex pole pair:
- sos(i,5:6) = [pcm2r(i) pca2(i)];
- elseif i<=nprl # lay down a pair of real poles:
- sos(i,5:6) = [prms(i-npc) prp(i-npc)];
- endif
- endfor
-
- ## If no output argument for the overall gain, combine it into the
- ## first section.
- if (nargout < 2)
- sos(1,1:3) *= k;
- else
- g = k;
- endif
-
-endfunction
-
-%!test
-%! B=[1 0 0 0 0 1]; A=[1 0 0 0 0 .9];
-%! [z,p,k] = tf2zp(B,A);
-%! [sos,g] = zp2sos(z,p,k);
-%! [Bh,Ah] = sos2tf(sos,g);
-%! assert({Bh,Ah},{B,A},100*eps);
+## Copyright (C) 2005 Julius O. Smith III <[email protected]>
+## Copyright (C) 2021 Charles Praplan
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; see the file COPYING. If not, see
+## <https://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z})
+## @deftypefnx {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z},
@var{p})
+## @deftypefnx {Function File} {[@var{sos}, @var{g}] =} zp2sos (@var{z},
@var{p}, @var{k})
+## @deftypefnx {Function File} {@var{sos} =} zp2sos (@dots{})
+## Convert filter poles and zeros to second-order sections.
+##
+## INPUTS:
+## @itemize
+## @item
+## @var{z} = column-vector containing the filter zeros
+## @item
+## @var{p} = column-vector containing the filter poles
+## @item
+## @var{k} = overall filter gain factor. If not given the gain is assumed to
be 1.
+## @end itemize
+##
+## RETURNED:
+## @itemize
+## @item
+## @var{sos} = matrix of series second-order sections, one per row:
+## @example
+## @var{sos} = [@var{B1}.' @var{A1}.'; ...; @var{BN}.' @var{AN}.']
+## @end example
+## where
+## @code{@var{B1}.' = [b0 b1 b2] and @var{A1}.' = [a0 a1 a2]} for
+## section 1, etc.
+## See @code{filter} for documentation of the second-order direct-form filter
+## coefficients @var{B}i and %@var{A}i, i=1:N.
+##
+## @item
+## @var{g} is the overall gain factor that effectively scales
+## any one of the @var{B}i vectors.
+## @end itemize
+##
+## If called with only one output argument, the overall filter gain is
+## applied to the first second-order section in the matrix @var{sos}.
+##
+## EXAMPLE:
+## @example
+## [z, p, k] = tf2zp ([1 0 0 0 0 1], [1 0 0 0 0 .9]);
+## [sos, g] = zp2sos (z, p, k)
+##
+## sos =
+## 1.0000 0.6180 1.0000 1.0000 0.6051 0.9587
+## 1.0000 -1.6180 1.0000 1.0000 -1.5843 0.9587
+## 0 1.0000 1.0000 0 1.0000 0.9791
+##
+## g =
+## 1
+## @end example
+##
+## @seealso{sos2zp, sos2tf, tf2sos, zp2tf, tf2zp}
+## @end deftypefn
+
+function [SOS,G] = zp2sos(z,p,k,DoNotCombineReal)
+
+ if nargin<3, k=1; endif
+ if nargin<2, p=[]; endif
+
+ DoNotCombineReal = 1;
+
+ [zc, zr] = cplxreal (z(:));
+ [pc, pr] = cplxreal (p(:));
+
+ nzc = length (zc);
+ npc = length (pc);
+
+ nzr = length (zr);
+ npr = length (pr);
+
+ if DoNotCombineReal
+
+ # Handling complex conjugate poles
+ for count = 1:npc
+ SOS(count, 4:6) = [1, -2 * real(pc(count)), abs(pc(count))^2];
+ endfor
+
+ # Handling real poles
+ for count = 1:npr
+ SOS(count + npc, 4:6) = [0, 1, -pr(count)];
+ endfor
+
+ # Handling complex conjugate zeros
+ for count = 1:nzc
+ SOS(count, 1:3) = [1, -2 * real(zc(count)), abs(zc(count))^2];
+ endfor
+
+ # Handling real zeros
+ for count = 1:nzr
+ SOS(count+nzc, 1:3) = [0, 1, -zr(count)];
+ endfor
+
+ # Completing SOS if needed (sections without pole or zero)
+ if npc + npr > nzc + nzr
+ for count = nzc + nzr + 1 : npc + npr % sections without zero
+ SOS(count, 1:3) = [0, 0, 1];
+ end
+ else
+ for count = npc + npr + 1 : nzc + nzr % sections without pole
+ SOS(count, 4:6) = [0, 0, 1];
+ endfor
+ endif
+
+ else
+
+ # Handling complex conjugate poles
+ for count = 1:npc
+ SOS(count, 4:6) = [1, -2 * real(pc(count)), abs(pc(count))^2];
+ endfor
+
+ # Handling pair of real poles
+ for count = 1:floor(npr/2)
+ SOS(count+npc, 4:6) = [1, - pr(2 * count - 1) - pr(2 * count), pr(2 *
count - 1) * pr(2 * count)];
+ endfor
+
+ # Handling last real pole (if any)
+ if mod (npr,2) == 1
+ SOS(npc + floor (npr / 2) + 1, 4:6)= [0, 1, -pr(end)];
+ endif
+
+
+ # Handling complex conjugate zeros
+ for count = 1:nzc
+ SOS(count, 1:3)= [1, -2 * real(zc(count)), abs(zc(count))^2];
+ endfor
+
+ # Handling pair of real zeros
+ for count = 1:floor(nzr / 2)
+ SOS(count+nzc, 1:3)= [1, - zr(2 * count - 1) - zr(2 * count), zr(2 *
count - 1) * zr(2 * count)];
+ endfor
+
+ # Handling last real zero (if any)
+ if mod (nzr, 2) == 1
+ SOS(nzc + floor (nzr / 2) + 1, 1:3) = [0, 1, -zr(end)];
+ endif
+
+ # Completing SOS if needed (sections without pole or zero)
+ if npc + ceil(npr / 2) > nzc + ceil(nzr / 2)
+ for count = nzc + ceil (nzr / 2) + 1 : npc + ceil (npr / 2) % sections
without zero
+ SOS(count, 1:3) = [0, 0, 1];
+ endfor
+ else
+ for count = npc + ceil(npr / 2) + 1:nzc + ceil (nzr / 2) % sections
without pole
+ SOS(count, 4:6) = [0, 0, 1];
+ endfor
+ endif
+ endif
+
+ if ~exist ('SOS')
+ SOS=[0, 0, 1, 0, 0, 1];
+ endif
+
+ ## If no output argument for the overall gain, combine it into the
+ ## first section.
+ if (nargout < 2)
+ SOS(1,1:3) = k * SOS(1,1:3);
+ else
+ G = k;
+ endif
+
+%!test
+%! B=[1 0 0 0 0 1]; A=[1 0 0 0 0 .9];
+%! [z,p,k] = tf2zp(B,A);
+%! [sos,g] = zp2sos(z,p,k);
+%! [Bh,Ah] = sos2tf(sos,g);
+%! assert({Bh,Ah},{B,A},100*eps);
+
+%!test
+%! sos = zp2sos ([]);
+%! assert (sos, [0, 0, 1, 0, 0, 1], 100*eps);
+
+%!test
+%! sos = zp2sos ([], []);
+%! assert (sos, [0, 0, 1, 0, 0, 1], 100*eps);
+
+%!test
+%! sos = zp2sos ([], [], 2);
+%! assert (sos, [0, 0, 2, 0, 0, 1], 100*eps);
+
+%!test
+%! [sos, g] = zp2sos ([], [], 2);
+%! assert (sos, [0, 0, 1, 0, 0, 1], 100*eps);
+%! assert (g, 2, 100*eps);
+
+%!test
+%! sos = zp2sos([], [0], 1);
+%! assert (sos, [0, 0, 1, 0, 1, 0], 100*eps);
+
+%!test
+%! sos = zp2sos([0], [], 1);
+%! assert (sos, [0, 1, 0, 0, 0, 1], 100*eps);
+
+%!test
+%! sos = zp2sos([-1-j -1+j], [-1-2j -1+2j], 10);
+%! assert (sos, [10, 20, 20, 1, 2, 5], 100*eps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/signal-1.4.2/src/remez.cc
new/signal-1.4.3/src/remez.cc
--- old/signal-1.4.2/src/remez.cc 2022-04-23 13:21:25.000000000 +0200
+++ new/signal-1.4.3/src/remez.cc 2022-10-28 13:26:05.000000000 +0200
@@ -763,7 +763,7 @@
Parks-McClellan optimal FIR filter design.\n\
@table @var\n\
@item n\n\
-gives the number of taps in the returned filter\n\
+gives the filter order, where the generated filter length taps is n+1\n\
@item f\n\
gives frequency at the band edges [b1 e1 b2 e2 b3 e3 @dots{}]\n\
@item a\n\