0

我需要对输入为扭矩、输出为位置的积分过程进行频率分析。如果输入是正弦曲线,则输出如下所示:

在此处输入图像描述

我用来提取幅度比和相位的代码如下所示:

freq = 40;
freq_rad = freq * 2 * pi
phase_offset_rad = 30 * pi / 180
gain = 0                                                                                                                                                                           
fs = 500;                                                                                                                                                                          
L = 100;                                                                                                                                                                           
t = (0:L-1)*(1/fs);                                                                                                                                                                

in = 2 * sin(freq * 2 * pi * t);                                                                                                                                                   

pos_in = [];                                                                                                                                                                       
vel = 0;                                                                                                                                                                           
pos = 0;                                                                                                                                                                           
for i = 1:length(t)                                                                                                                                                                
    vel = vel + in(i);
    pos = pos + vel;
    pos_in = [pos_in; pos];                                                                                                                                                        
end                                                                                                                                                                                

out = pos_in;                                                                                                                                                                      
%out = (2 + gain) * sin(freq * 2 * pi * t + phase_offset_rad);

fft_in = fft(in);                                                                                                                                                                  
fft_out = fft(out);                                                                                                                                                                
[mag_in idx_in] = max(abs(fft_in));                                                                                                                                                
[mag_out idx_out] = max(abs(fft_out));                                                                                                                                             

phase = angle(fft_out(idx_out)) - angle(fft_in(idx_in))                                                                                                                            
phase_deg = phase / (pi / 180)                                                                                                                                                     
ratio = mag_out / mag_in                 

如果我在完全直的正弦信号上运行它,那么它就可以完美运行。但是一旦我像上面那样添加失真,相位和幅度值都不正确。我想我需要以某种方式“压平”信号。但我不确定如何从中提取正确的幅度。幅度是多少?我会在输出中说从一个“高原”到下一个“高原”的测量值约为 45,因为这就是事物移动的距离。那将是〜22.5的比率。但是计算的结果是 196。

也许我想错了?我想最终使用实验数据得出从扭矩输入到位置输出的传递函数。也许有人可以展示如何做到这一点?

我一直在想我能做的是记录幅度比和相位,然后制作一个波特图,从中轻松提取传递函数。到目前为止,我还无法从具有不同输入频率的运行测试中获得波特图。

4

1 回答 1

2

因为 FFT 假设您对完全周期性的信号(恰好是信号的一个周期)进行频率分析,所以您的 fft(out) 将包含非常大的功率干扰(请参阅周期性移位定理)。

我相信,您可以通过执行一些系统修改来避免 FFT 分析工件。您可以估计系统+滤波器的传递函数,而不是估计系统的传递函数。即您必须通过高通滤波器传递系统的输出信号:

out = filter([1 -1], 1, out);

然后,您可以执行分析。

freqz您可以通过函数(或仅H = fft([1 -1], length(out));在我的情况下)估计滤波器的频率响应。然后,您可以通过应用逆响应来消除频域中的滤波器影响fft_out = fft_out ./ H(:);。此外,不要忘记fft_out(1) = 0;在最大估计之前消除第 0 个频率。

顺便说一句,不同频率的相位差估计看起来很奇怪(在您的代码中phase = angle(fft_out(idx_out)) - angle(fft_in(idx_in)))。看起来您必须使用 idx_in(或 idx_out,取决于哪种估计更可靠)来计算回合角。

注意:这个答案不是完整的指南,可能需要一些现实生活中的增强。

PS 尝试在实际应用中应用加窗来进行频率响应估计(例如汉明窗)。

PPS 尝试在https://dsp.stackexchange.com/上提问

更新: 在某些情况下,您可以对输入信号执行相同的线性输入信号变换,而不是忽略滤波器的影响: in = filter([1 -1], 1, in);

于 2018-01-05T13:18:16.713 回答