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')
Kshitij Singh answered .
2025-11-20
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