JUK1
findComplexRationalApproximation.m
Go to the documentation of this file.
1 function [poles,residues,remainder,proportional] = findComplexRationalApproximation(freqBins,freqData)
2 % This function takes in frequency data and fits a rational approximation
3 % using Vector Fitting
4 % freqBins is in Hz
5 
6 % Number of poles to use in fit
7 numPoles = 12;
8 
9 % Scale incoming frequencies
12 
13 % Distribute poles evenly across S-plane
14 poleFreqs = linspace(freqBins(1),freqBins(end),numPoles);
15 wPoleFreqs = 2*pi*poleFreqs;
16 sigma = -0.1;
17 sPoleFreqs = sigma + 1j*wPoleFreqs; %This is a row vector
18 
19 % Or just use real poles
20 % sPoleFreqs = linspace(-1e9,-0.1e9,numPoles);
21 
22 % Create vector of simulation frequencies
24 
25  % Turn this into a matrix, with identical frequencies along the rows
26  s = repmat(1j*wFreqBins(:),1,numPoles);
27 
28 for ii = 1:250
29  % Ensure poles are stable
30  sPoleFreqs = flipReal(sPoleFreqs);
31 
32  [r,ctilde,Asim] = getResidues(sPoleFreqs,freqData,wFreqBins);
33 
34  % Extract zeros
35  % Form matrix with poles on diagonal
36  Az = diag(sPoleFreqs);
37 
38  Bz = ones(size(sPoleFreqs,2),1);
39 
40  % Determine zeros (which become new poles)
41  z(:,ii) = eig(Az-Bz*ctilde.');
42 
43  % Set next iteration poles equal to zeros
44  sPoleFreqs = z(:,ii).';
45 end
46 
47 % Ensure poles are stable
48 sPoleFreqs = flipReal(sPoleFreqs);
49 
50 % Get residues for these final (stable) poles
51 [r,~,Asim, residual] = getResidues(sPoleFreqs,freqData,wFreqBins);
52 
53 % Extract resiudes: Asim*res = f(s)
54 freqDataFull = freqData(:);
56 
57 % Compute residual error and print to screen
58 residual = norm(Asim*r - freqDataFull);
59 
60 % Count number of useful output variables
62 
63 % Extract these output variables
64 res = r(1:numVar);
65 
66 %Plot modelled vs actual data
67 %plot(freqBins,abs(freqData),'-x'); hold on;
68 %plot(freqBins,abs(Asim*res(:)),'o'); hold off;
69 
70 % Undo scaling of outgoing residues, poles, remainder term and proportional
71 % terms
73 residues = res(1:numVar-2,:)*maxFreq;
76 end
pi
Definition: Freq.m:24
Extract these output variables res
Get residues for these Asim
Get residues for these residual
Scale incoming frequencies maxFreq
Count number of useful output variables numVar
Undo scaling of outgoing poles
end numPoles()
Definition: getResidues.m:14
Undo scaling of outgoing residues
Create vector of simulation frequencies wFreqBins
Plot modelled vs actual data plot(freqBins, abs(freqData),'-x')
Turn this into a matrix
Turn this into a with identical frequencies along the rows s
Extract zeros Form matrix with poles on diagonal Az
Find a complex rational model for freq domain data for a
freqDataFull
Definition: getResidues.m:41
The partial fraction expansions consits of terms
Definition: getResidues.m:35
ctilde
Definition: getResidues.m:59
for j
Definition: interch.m:13
end if abs(real(dotprod))>rstoerst rstoerst