Problem with polyfit and polyval

Illustration
Timothy - 2021-02-01T09:54:09+00:00
Question: Problem with polyfit and polyval

Hello there, I took some manual measurements of the frequency response of a pre-amplifier and now I want to do a polyfit to get a smoother approximation (as I only measured some key points, the resolution is quite irregular) of the FR, which I do with polyfit. But so far, it returns me ZERO for all the polynomial coefficients! I'm probably doing a really simple mistake. This is the code (the Amp.mat file is annexed):     %%Frequency Response Plot close all; clear all load('Amp.mat'); % Manual Measurements of the FR Freq = Amp(:,1); % Frequency G = Amp(:,3)./Amp(:,2); % Gain Phase = Amp(:,4); % Phase GFit = polyfit(Freq,G,length(Freq)); GFitVal = polyval(GFit,Freq); PhaseFit = polyfit(Freq,Phase,length(Freq)); PhaseFitVal = polyval(PhaseFit,Freq); figure; subplot(2,1,1) semilogx(Freq,G, ... Freq,GFitVal); grid on; legend('G', ... 'GFitVal'); xlabel('Frequency (Hz)') ylabel('Gain') title('Gain x Frequency of the Pre-amplifier') subplot(2,1,2) semilogx(Freq,Phase, ... Freq,PhaseFitVal); grid on; legend('Phase', ... 'PhaseFit'); xlabel('Frequency (Hz)') ylabel('Phase (degrees)') title('Phase x Frequency of the Pre-amplifier') % Impulse Response x = 0:1e5; GS = polyval(GFit,x); PhaseS = polyval(PhaseFit,x); FilterFreq = [flip(GS(2:end)).*exp(1i*(-flip(PhaseS(2:end)))) ... GS.*exp(1i*PhaseS)]; FilterIR = ifft(FilterFreq); figure; stem(FilterIR) grid on; xlabel('Samples (n)') ylabel('Level') title('Impulse Response of the Pre-amplifier')  

Expert Answer

Profile picture of Kshitij Singh Kshitij Singh answered . 2025-11-20

It took me a few minutes to come up with this purely signal processing approach, so no curve fitting required. Experiment with the numerator and denominator orders of the transfer function to get the result you want. (Another option would be the firls function, and there are other empirical methods to consider depending on what you want to do. There is also the entire System Identification Toolbox! You are doing system identification here.)
 
It should give you everything you want:
 
D = load('Philippe Amp.mat');
Freq = D.Amp(:,1);                                              % Hz Frequency Vector
Vi = D.Amp(:,3);
Vo = D.Amp(:,4);
H = Vo./Vi;                                                     % Amplitude Transfer Function
Phase = D.Amp(:,4);
W = Freq/max(Freq)*pi;                                          % Radian Frequency Vector

figure(1)                                                       % Look At The Data
subplot(2,1,1)
plot(Freq,Vi,  Freq,Vo)
grid
subplot(2,1,2)
plot(Freq, Phase)
grid

figure(2)
subplot(2,1,1)
plot(Freq, 20*log10(H))
ylabel('Magnitude (dB)')
grid
axis([xlim    -40  0])
subplot(2,1,2)
plot(Freq, Phase)
ylabel('Phase (degrees)')
grid

Hc = H .* exp(1i*pi*Phase/180);                                 % Create Complex Frequency Response
Hc(1) = interp1(Freq(2:end),Hc(2:end), 0, 'spline','extrap');   % Replace Initial ‘NaN’ Value

OrdNum = 3;
OrdDen = 5;
[b,a] = invfreqz(Hc, W, OrdNum, OrdDen);                        % Transfer Function Coefficients

figure(3)
freqz(b, a, 4096)                                               % Bode Plot

figure(4)
impz(b, a)                                                      % Impulse Response


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!