Đăng vào

Vẽ giản đồ Bode từ dữ liệu thực nghiệm bằng Matlab

Giới thiệu

Bài viết này sẽ hướng dẫn xử lý và lọc sơ bộ tín hiệu trước khi tính toán và vẽ giản đồ Bode. Giả sử tiến hành khảo sát hệ thống với thời gian lấy mẫu 0.01s, tín hiệu ngõ vào và ngõ ra đo được có dạng như trong bảng dưới. Sau mỗi lần khảo sát, dữ liệu được lưu vào file data.mat. Sau nhiều lần các dữ liệu được lưu vào file data1.mat, data2.mat ... Các file dữ liệu mẫu download ở cuối bài viết.

Times Input Ouput
0 0 0.5000
0.0100 0.6909 0.9618
0.0200 1.0065 0.9001
0.0300 0.7767 0.3506
0.0400 0.1292 -0.3846
... ... ...

Kiểm tra dữ liệu

Dùng hàm plot để vẽ đồ thị tín hiệu thô, qua đó có đánh gia sơ bộ

% Tien Anh
% https://bmshop.vn
load('data1.mat') % import data
times = data(:,1); % times
figure(1);
grid on
hold on
plot(times,data(:,2),'-r'); % input
plot(times,data(:,3),'-b'); % output

Kết quả:

Tín hiệu thô

Tín hiệu thô

Bộ lọc butterworth

Giới thiệu bộ lọc butterworth: (đang cập nhật)

load('data1.mat') % import data
times = data(:,1); % times
% su dung ham dtrend de offset data
% Minh chua ro doan nay lam
input=dtrend(data(:,2),3);
output=dtrend(data(:,3),3);
% Minh chua ro cach dung bo loc butter
[B,A] = butter(3,0.2);
input_filted = filter(B,A,input);
output_filted = filter(B,A,output);
figure(3);
grid on
hold on
plot(times,input_filted,'-r',times,output_filted,'-b');

Kết quả:

Tín hiệu sau khi
lọc

Tín hiệu sau khi lọc

Vẽ giản đồ Bode

%% Plot bode from experimental data - version 0.5
%   Author: Tien Anh
%   Info: https://bmshop.vn
%   Info: Matlab 2014a
%%
clc;
clear all;
points_bode = [0 0 0];
% vong lap ve cho 9 mau du lieu
for idx=1:9
    filename=sprintf('data%s.mat',num2str(idx));
    Data = importdata(filename);
    times = Data(:,1);
    t_sampling = Data(2,1)-Data(1,1); % Sampling time
    %% Offset data
    input=dtrend(Data(:,2),3);
    output=dtrend(Data(:,3),3);
    %% Butterworth Filter
    [m,n] = butter(3,0.2);
    input_filted = filter(m,n,input);
    output_filted = filter(m,n,output);
    index_in=0;
    %% Find maxima of input
    for k=2:length(input_filted)-1
        if input_filted(k)>input_filted(k-1) && input_filted(k)>input_filted(k+1)
            index_in = [index_in;k];
        end
    end
    index_in(1,:)=[]; % Trim data
    %% Find average of input frequencies
    temp = 0;
    for k=1:length(index_in)-1
        temp=[temp;1/((times(index_in(k+1))-times(index_in(k))))];
    end
    temp(1,:)=[]; % Trim data
    freq = mean(temp);
    Wn = 2*pi*freq;
    index_out=0;
    %% Find maxima of output
    for k=2:length(output_filted)-1
        if output_filted(k)>output_filted(k-1) && output_filted(k)>output_filted(k+1)
            index_out = [index_out;k];
        end
    end
    index_out(1,:)=[]; % Trim data

    %% Tim bien do va do lech pha
    bode_data = zeros(1,2);
    for k=1:length(index_out)
        if (output_filted(index_out(k))/input_filted(index_in(k))>=1)
            L = 20*log10(output_filted(index_out(k))/input_filted(index_in(k)));
            phi = (times(index_in(k))-times(index_out(k)))*360;
            bode_data=[bode_data;[L,phi]];
        end
    end
    bode_data(1,:)=[];

    points_bode = [points_bode;[mean(bode_data) Wn]];
end
points_bode(1,:)=[];
%% Make plot
figure(1); clf
%  Magnitude plot on top
subplot(2, 1, 1)
semilogx(points_bode(:,3), points_bode(:,1), 'r-o');
grid on
%  Phase plot on bottom
subplot(2,1,2)
semilogx(points_bode(:,3), points_bode(:,2), 'r-o')
grid on

Kết quả:

Plot bode from experimental
data

Plot bode from experimental data