Back Substitution
From Wikimization
(Difference between revisions)
Ranjelin (Talk | contribs)
(New page: <pre> %mapping coefficients by back substitution. %This routine is for thd+n measurement only. %fn is function of time in optional second dimension. function [zeta signum flip] = backsubz...)
Next diff →
Revision as of 19:24, 29 December 2024
%mapping coefficients by back substitution. %This routine is for thd+n measurement only. %fn is function of time in optional second dimension. function [zeta signum flip] = backsubz2(E, fn, Nh, precision) %fn is complex 2*fft/N if nargin < 4, precision = 34; end mp.Digits(precision); %requires Advanpix Multiprecision Toolbox if size(fn,1) ~= Nh, disp(' ');disp('backsubz2(): fn length error');disp(' '); return; end zeta = zeros(Nh,size(fn,2),'mp'); signum = ones (Nh,size(fn,2),'mp'); flip = 0; zero = mp('0'); one = mp('1'); two = mp('2'); pi = mp('pi'); twopi = mp('2*pi'); theta1 = atan2(-imag(fn(1,:)), real(fn(1,:))); for i=Nh:-1:1 hi1 = zero; if mod(i,2) %odd for n=(i+3)/2:ceil(Nh/2) hi1 = hi1 + nchoosek(two*n-one, n-(i+one)/two)*zeta(2*n-1,:); end else %even for n=(i+2)/2:floor(Nh/2) hi1 = hi1 + nchoosek(two*n, n-i/two) *zeta(2*n,:); end end thetai = atan2(-imag(fn(i,:)), real(fn(i,:))); % signum(i,:) = mypsi(cos(i*theta1)).*mypsi(cos(thetai)); %%% "Perhaps better for computation..." varpi = abs(alias(thetai + pi - i*theta1, twopi)) < abs(alias(thetai - i*theta1, twopi)); signum(i,varpi) = -one; zeta(i,:) = signum(i,:).*abs(fn(i,:)) - hi1; end zeta = two.^((1:Nh)'-1).*zeta./abs(E.^(1:Nh)'); t = find(zeta(1,:) < 0); %back substitution assumes positive zeta(1,:) if any(t), flip = 1; end zeta (1:2:Nh,t) = -zeta (1:2:Nh,t); signum(1:2:Nh,t) = -signum(1:2:Nh,t); end %nonplatonic alias frequency function function fa = alias(f,Fs) %Fs is sample rate [Hz] or 2*pi. fa = f - Fs*round(f/Fs); end