Hay dos métodos muy buenos para estimar funciones de transferencia. Busque moen4 y fitfrd.
Para usar moen4 necesitas básicamente una entrada y una salida de una prueba. El algoritmo luego calcula la función de transferencia que mejor se ajusta a los datos. Los resultados tienden a ser bastante buenos para algunos sistemas, y menos para los sistemas que tienen un comportamiento no lineal significativo (para los cuales no existe una función de transferencia lineal).
Aquí hay un código que puede usar tanto para frd fit como para moen4 fit. Puede trazar los datos de freq_response_frd (frd object) directamente usando la función bode () para obtener un diagrama de bode de sus datos de entrada. Sus datos de entrada deben tener una cobertura de frecuencia suficiente, así que use una señal de chirrido que aumenta con la frecuencia en el tiempo y recopile la respuesta resultante en otra matriz. Luego, pase ambas matrices a id_model_moen y obtendrá su función de transferencia nuevamente.
Por lo general, limito las frecuencias que se analizan porque si traza el rango completo devuelto por fft obtendrá mucho ruido fuera del rango para el que incluso tiene datos de prueba, por lo que es una parte inútil de los resultados.
function [mag, phase, f] = freq_response_mag_phase(out, in, t, freqlim)
dt = (t(end) - t(1)) / (length(t) - 1);
NFFT = length(t);
Fs = 1.0 / dt;
fb = fft(out, NFFT);
fa = fft(in, NFFT);
f = [0:NFFT-1]*Fs/NFFT * 2 * pi;
% find first bin after our test range. We will discard bins after it.
ix = ceil(NFFT/2);
if(exist("freqlim", "var"))
ix = find(f>freqlim,1);
end
f = f(1:ix);
mag = abs(fb(1:ix)) ./ abs(fa(1:ix));
phase = unwrap(angle(fb(1:ix))) - unwrap(angle(fa(1:ix)));
end
function response = freq_response_frd(out, in, t, freqlim)
if(exist("freqlim", "var"))
[mag, phase, f] = freq_response_mag_phase(out, in, t, freqlim);
else
[mag, phase, f] = freq_response_mag_phase(out, in, t);
end
response = frd(mag .* exp(1i .* phase), f);
end
function sys_tf = id_model_frd(out, in, t, nr)
resp = freq_response_frd(out, in, t);
sys = fitfrd(resp, nr);
[b, a] = ss2tf(minreal(sys));
sys_tf = tf(b, a);
end
function sys_tf = id_model_moen(out, in, t, nr)
dt = (t(end) - t(1)) / (length(t) - 1);
sys = moen4(iddata(out, in, dt), nr);
[b,a] = ss2tf(d2c(sys));
sys_tf = tf(b, a);
end