📄 remez.m
字号:
dev = -nu*dev;
y = des(l) + nu*dev*add./wt(l);
if dev <= devl
warnStr = sprintf(...
['\n *** FAILURE TO CONVERGE ***' ...
'\n Probable cause is machine rounding error.' ...
'\n Number of iterations = %g' ...
'\n If the number of iterations exceeds 3, the design may' ...
'\n be correct, but should be verified with an FFT.'],niter);
warning(warnStr)
break;
end
devl = dev;
jchnge = 0;
k1 = iext(1);
knz = iext(nz);
klow = 0;
nut = -nu;
j = 1;
flag34 = 1;
while j < nzz
kup = iext(j+1);
l = iext(j) + 1;
nut = -nut;
if j == 2
y1 = comp;
end
comp = dev;
flag = 1;
if l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l + 1;
while l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l + 1;
else
break;
end
end
iext(j) = l - 1;
j = j + 1;
klow = l - 1;
jchnge = jchnge + 1;
flag = 0;
end
end
if flag
l = l - 2;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0 | jchnge > 0
break;
end
l = l - 1;
end
if l <= klow
l = iext(j) + 1;
if jchnge > 0
iext(j) = l - 1;
j = j + 1;
klow = l - 1;
jchnge = jchnge + 1;
else
l = l + 1;
while l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
break;
end
l = l + 1;
end
if l < kup & dtemp > 0
comp = nut*err;
l = l + 1;
while l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l + 1;
else
break;
end
end
iext(j) = l - 1;
j = j + 1;
klow = l - 1;
jchnge = jchnge + 1;
else
klow = iext(j);
j = j + 1;
end
end
elseif dtemp > 0
comp = nut*err;
l = l - 1;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l - 1;
else
break;
end
end
klow = iext(j);
iext(j) = l + 1;
j = j + 1;
jchnge = jchnge + 1;
else
klow = iext(j);
j = j + 1;
end
end
end
while j == nzz
ynz = comp;
k1 = min([k1 iext(1)]);
knz = max([knz iext(nz)]);
nut1 = nut;
nut = -nu;
l = 0;
kup = k1;
comp = ynz*1.00001;
luck = 1;
flag = 1;
l = l + 1;
while l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = err*nut - comp;
if dtemp > 0
comp = nut*err;
j = nzz;
l = l + 1;
while l < kup
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l + 1;
else
break;
end
end
iext(j) = l - 1;
j = j + 1;
klow = l - 1;
jchnge = jchnge + 1;
flag = 0;
break;
end
l = l + 1;
end
if flag
luck = 6;
l = ngrid + 1;
klow = knz;
nut = -nut1;
comp = y1*1.00001;
l = l - 1;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = err*nut - comp;
if dtemp > 0
j = nzz;
comp = nut*err;
luck = luck + 10;
l = l - 1;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l - 1;
else
break;
end
end
klow = iext(j);
iext(j) = l + 1;
j = j + 1;
jchnge = jchnge + 1;
flag = 0;
break;
end
l = l - 1;
end
if flag
flag34 = 0;
if luck ~= 6
iext = [k1 iext(2:nz-nfcns)' iext(nz-nfcns:nz-1)']';
jchnge = jchnge + 1;
end
break;
end
end
end
if flag34 & j > nzz
if luck > 9
iext = [iext(2:nfcns+1)' iext(nfcns+1:nz-1)' iext(nzz) iext(nzz)]';
jchnge = jchnge + 1;
else
y1 = max([y1 comp]);
k1 = iext(nzz);
l = ngrid + 1;
klow = knz;
nut = -nut1;
comp = y1*1.00001;
l = l - 1;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = err*nut - comp;
if dtemp > 0
j = nzz;
comp = nut*err;
luck = luck + 10;
l = l - 1;
while l > klow
% gee
c = ad./(cos(2*pi*grid(l))-x);
err = (c*y'/sum(c) - des(l))*wt(l);
dtemp = nut*err - comp;
if dtemp > 0
comp = nut*err;
l = l - 1;
else
break;
end
end
klow = iext(j);
iext(j) = l + 1;
j = j + 1;
jchnge = jchnge + 1;
iext = [iext(2:nfcns+1)' iext(nfcns+1:nz-1)' iext(nzz) iext(nzz)]';
break;
end
l = l - 1;
end
if luck ~= 6
iext = [k1 iext(2:nz-nfcns)' iext(nz-nfcns:nz-1)']';
jchnge = jchnge + 1;
end
end
end
end
% Inverse Fourier transformation
nm1 = nfcns - 1;
fsh = 1.0e-6;
gtemp = grid(1);
x(nzz) = -2;
cn = 2*nfcns - 1;
delf = 1/cn;
l = 1;
kkk = 0;
if (edge(1) == 0 & edge(jb) == .5) | nfcns <= 3
kkk = 1;
end
if kkk ~= 1
dtemp = cos(2*pi*grid(1));
dnum = cos(2*pi*grid(ngrid));
aa = 2/(dtemp - dnum);
bb = -(dtemp+dnum)/(dtemp - dnum);
end
for j = 1:nfcns
ft = (j-1)*delf;
xt = cos(2*pi*ft);
if kkk ~= 1
xt = (xt-bb)/aa;
ft = acos(xt)/(2*pi);
end
xe = x(l);
while xt <= xe & xe-xt >= fsh
l = l + 1;
xe = x(l);
end
if abs(xt-xe) < fsh
a(j) = y(l);
else
grid(1) = ft;
% gee
c = ad./(cos(2*pi*ft)-x(1:nz));
a(j) = c*y'/sum(c);
end
l = max([1, l-1]);
end
grid(1) = gtemp;
dden = 2*pi/cn;
for j = 1:nfcns
dnum = (j-1)*dden;
if nm1 < 1
alpha(j) = a(1);
else
alpha(j) = a(1) + 2*cos(dnum*(1:nm1))*a(2:nfcns)';
end
end
alpha = [alpha(1) 2*alpha(2:nfcns)]'/cn;
if kkk ~= 1
p(1) = 2*alpha(nfcns)*bb + alpha(nm1);
p(2) = 2*aa*alpha(nfcns);
q(1) = alpha(nfcns-2) - alpha(nfcns);
for j = 2:nm1
if j == nm1
aa = aa/2;
bb = bb/2;
end
p(j+1) = 0;
sel = 1:j;
a(sel) = p(sel);
p(sel) = 2*bb*a(sel);
p(2) = p(2) + 2*a(1)*aa;
jm1 = j - 1;
sel = 1:jm1;
p(sel) = p(sel) + q(sel) + aa*a(sel+1);
jp1 = j + 1;
sel = 3:jp1;
p(sel) = p(sel) + aa*a(sel-1);
if j ~= nm1
sel = 1:j;
q(sel) = -a(sel);
q(1) = q(1) + alpha(nfcns - 1 - j);
end
end
alpha(1:nfcns) = p(1:nfcns);
end
if nfcns <= 3
alpha(nfcns + 1) = 0;
alpha(nfcns + 2) = 0;
end
alpha=alpha';
% now that's done!
if neg <= 0
if nodd ~= 0
h = [.5*alpha(nz-1:-1:nz-nm1) alpha(1)];
else
h = .25*[alpha(nfcns) alpha(nz-2:-1:nz-nm1)+alpha(nfcns:-1:nfcns-nm1+2) ...
2*alpha(1)+alpha(2)];
end
elseif nodd ~= 0
h = .25*[alpha(nfcns) alpha(nm1)];
h = [h .25*[alpha(nz-3:-1:nz-nm1)-alpha(nfcns:-1:nfcns-nm1+3) ...
2*alpha(1)-alpha(3) ] 0];
else
h = .25*[alpha(nfcns) alpha(nz-2:-1:nz-nm1)-alpha(nfcns:-1:nfcns-nm1+2) ...
2*alpha(1)-alpha(2)];
end
function y = remezdd(k, n, m, x)
%REMEZDD Lagrange interpolation coefficients.
% Author: T. Krauss 1993
% Was Revision: 1.4, Date: 1994/01/25 17:59:44
y = 1;
q = x(k);
for l=1:m
xx = 2*(q - x(l:m:n));
y = y*prod(xx(xx ~= 0));
end
y=1/y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -