How to design controller with control toolbox tools

4 views (last 30 days)
Hi,
I am a newbye in designing controller circuitries, sorry if I am asking a trivial question...
I have a system of which I measured the impulse response "ir" of the open loop transfer function at a samplerate of 48 kHz. Now, I want to design a controller to increase the bandwidth of the overall system. The impulse response is pretty long (let us assume approx. 512). I tested a few ways to achieve my goal:
1) I use "freqz" to derive frequency domain transfer function, then "frd" and "n4sid" to derive system model of order 10, 20 or 30. Unfortunately, when plotting with "bode", the approximation has pretty much nothing to do with the original transfer function ("bode" of the output from frd is the reference) with respect to phase and magnitude.
2) I use "tf(ir, [1 zeros(1, length(ir)-1], 1/48000)" to derive a model. This works pretty well, the bode command shows that the transfer function is good in terms of the magnitude. The phase, however, is shifted by a large amount which seems to be a multiple of 360 (what is the policy to compute the phase in Bode?). Unfortunately, even though tools such as "sisotool", "ltiviewer" and "pidtool" can be started, these end up blocking Matlab in busy state forever. Presumably, the impulse response is simply to long and the model too complex.
3) I use "iddata(ir', [1 zeros(1, length(ir)-1)]', 1/48000)" to produce a time series with the impulse as the input data and the measured impulse response ir as the output data. Then, "armax" is used to approximate a model. As in 1), the approximation is not even similar to the original transfer function.
Has anyone a good idea how I may design my controller circuitry? Is the Matlab toolchain at all capable to design controllers at higher samplerates? The system of which I measured the impulse response is too complex to express the transfer function by means of, e.g., a second order Laplace function..
Thank you and best regards
Hauke

Answers (1)

Rajiv Singh
Rajiv Singh on 3 Jun 2013
You could try something along the lines of:
m0 = idtf(ir, [1 zeros(1, length(ir)-1], 1/48000);
m1 = balred(idss(m0), N); % play with some values of N, see HSVD, BALRED
You could also try time series modeling:
data = iddata(ir', [], 1/48000); % time series (no inputs)
model = ssest(data, 1:10); 5 pick best order between 1 and 10; see SSEST, N4SID
final_model = noise2meas(model);

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!