当啁啾信号应用于其输入时,我试图通过计算系统的频率响应函数 (FRF) 来识别振动系统。在比较计算的 FRF 和传递函数的波特图后,我发现共振已经被很好地检测到,但反共振没有。
该系统具有以下形式:
我有一个假设:
线性系统对正弦信号的稳态响应是另一个具有相同频率的正弦信号,其幅值和相位取决于系统。当我施加啁啾信号时,系统从未达到稳定状态。因此,虽然系统对 \sin(\omega_{n_{z_1}}\cdot 2\pi) 的输出,但由于刺激 (弱)具有瞬态响应的频谱部分。
在我看来,正确的计算应该只测量与特定时刻输入频率相对应的输出分量。
- 你知道如何纠正这个问题吗?
- 是否可以应用移动过滤器或窗口来纠正此问题?
这是我的代码:
% Identification of the Frequency Response of a Transfer Function with
% Resonance and Antiresonance peaks
%% Cleaning the house
clc;
clear;
close all;
%% Definition of the System
wn_z1 = 10*2*pi; % Anti-Resonance Natural frequency 10 Hz
wn_p1 = 80*2*pi; % Resonance Natural frequency 80 Hz
chi_z = 0; % Damping factor of the zeros
chi_p = 0; % Damping factor of the poles
s = tf('s');
sys_1 = (s^2+2*chi_z*wn_z1*s+ wn_z1^2)/(s^2+2*chi_p*wn_p1*s+wn_p1^2);
zpk(sys_1)
%% Definition of the Chirp Input
h = 0.001;
time = 0:0.001:60;
freq_ini = 0.1*2*pi; % Initial frequency considered (0.1 Hz)
freq_final = 240*2*pi; % Final frequency considered (240 Hz)
chirp_input = 1.5*chirp(time,freq_ini,time(end),freq_final,'logarithmic');
frequency_evolution = logspace(log10(freq_ini),log10(freq_final),length(time));
figure(1);
subplot(2,1,1);plot(time,chirp_input); xlabel('time (s)'); ylabel('Chirp amplitude')
subplot(2,1,2);plot(time,frequency_evolution/(2*pi)); xlabel('time (s)'); ylabel('Frequency (Hz)');
%% Execution of the simulation
[sys_output,~] = lsim(sys_1,chirp_input,time);
%% Computation of the FRF
fft_input = fft(chirp_input,2^12); %% Considering zero padding
fft_output = fft(sys_output ,2^12); %% Considering zero padding
fft_input = fft_input(1:length(fft_input)/2);
fft_output = fft_output(1:length(fft_output)/2);
fft_output = fft_output(:);
fft_input = fft_input(:);
FRF = abs(fft_output)./abs(fft_input);
frequency_vector = linspace(0,1/(2*h),length(FRF));
%% Comparing the Bode Plot (Matlab) with the FRF (own implementation)
opts = bodeoptions('cstprefs');
opts.FreqUnits = 'Hz';
close all;
bodemag(sys_1,opts,'r'); hold on;
semilogx(frequency_vector, 20*log10(FRF ),'b')
xlim([0.1,frequency_vector(end)])
legend('Matlab Bode','FRF Identification')