Question
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')
Related Questions
Expert Answer
Kshitij Singh
PhD Expert
Answered Aug 13, 2026
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
Have a different question? Ask here