简体   繁体   中英

How to find the bode plot of a matrix in matlab?

I'm trying to find the system transfer function of a set of input-output data using the FFT method. The algorithm I'm following is as follows:

  1. Load the input data and output data into matlab.
  2. FFT the input data and output data.
  3. Divide the output FFT by the input FFT and take the magnitude. Since the input for our example is a unit impulse, the input FFT is 1.0.
  4. Plot the result as a Bode' plot.
  5. Treat the resulting Bode' plot as a frequency response - which it really is - and use frequency response methods to fit a transfer function to the calculated Bode' plot.

My code is:

load testdata.mat; // testdata is a 2 column matrix (1001x2 matrix)

input = fft(signal(:,1)); // FFT of input data (1001x1 complex matrix)

output = fft(signal(:,2)); // FFT of output data (1001x1 complex matrix)

fft_ratio = output/input; // (1001x1001 complex matrix)

fft_ratio_mag = abs(fft_ratio); // (1001x1001 matrix) except column 1, all other    columns have '0' data

bode(fft_ratio_mag(:,1))

I get the following error:

Error using bode (line 84)
Not enough input arguments.

Please guide me how to go about steps 4 and 5 in the above algorithm.

Use element-wise divide , not matrix divide, and plot using the plot function. To produce a plot similar to that shown in the bode function you can plot using semilogx but do the dB and degree conversions yourself:

fft_ratio = output ./ input % note the dot
subplot(2,1,1)
semilogx(20*log10(abs(fft_ratio)))
subplot(2,1,2)
semilogx(plot((180/pi)*angle(fft_ratio))

Generate the x-axis using however you like, I usually use normalized radian frequency from 0 to 1, which is just linspace(0,1,length(fft_ratio)) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM