目录
取信号的导数
要在不增加噪声功率的情况下对信号求导。MATLAB® 提供的函数diff会放大噪声,对于高阶导数会恶化不精确性。要解决此问题,请改用微分滤波器。
分析地震时建筑物楼层的位移。找到速度和加速度作为时间的函数。
加载文件 earthquake。该文件包含以下变量:
-
drift:楼层位移,以厘米为单位进行测量
-
t:时间,以秒为单位进行测量
-
Fs:采样率,等于 1 kHz
load('earthquake.mat')
使用 pwelch 显示信号功率谱的估计值。请注意大部分信号能量包含在低于 100 Hz 的频率中。
pwelch(drift,[],[],[],Fs)
如图所示:
使用 designfilt 设计一个阶数为 50 的 FIR 微分器。要包含大部分信号能量,请指定 100 Hz 的通带频率和 120 Hz 的阻带频率。使用 fvtool 检查滤波器。
Nf = 50;
Fpass = 100;
Fstop = 120;
d = designfilt('differentiatorfir','FilterOrder',Nf, ...
'PassbandFrequency',Fpass,'StopbandFrequency',Fstop, ...
'SampleRate',Fs);
fvtool(d,'MagnitudeDisplay','zero-phase','Fs',Fs)
如图所示:
对漂移求导以求出速度。将导数除以dt(即连续样本之间的时间间隔),以设置正确的单位。
dt = t(2)-t(1);
vdrift = filter(d,drift)/dt;
滤波后的信号存在延迟。使用 grpdelay 确定延迟是滤波器阶数的一半。通过丢弃样本对此进行补偿。
delay = mean(grpdelay(d))
delay = 25
%%
tt = t(1:end-delay);
vd = vdrift;
vd(1:delay) = [];
输出还包括瞬变,其长度等于滤波器阶数,或者是群延迟的两倍。在上面已丢弃 delay 个样本。再次丢弃 delay 个样本以消除瞬变。
tt(1:delay) = [];
vd(1:delay) = [];
对漂移和漂移速度绘图。使用 findpeaks 验证漂移的最大值和最小值对应于其导数的过零点。
[pkp,lcp] = findpeaks(drift);
zcp = zeros(size(lcp));
[pkm,lcm] = findpeaks(-drift);
zcm = zeros(size(lcm));
subplot(2,1,1)
plot(t,drift,t([lcp lcm]),[pkp -pkm],'or')
xlabel('Time (s)')
ylabel('Displacement (cm)')
grid
subplot(2,1,2)
plot(tt,vd,t([lcp lcm]),[zcp zcm],'or')
xlabel('Time (s)')
ylabel('Speed (cm/s)')
grid
如图所示:
对漂移速度求微分以求出加速度。时滞长度是原来的两倍。丢弃两倍数量的样本来补偿延迟,丢弃相同数量的样本来消除瞬变。对速度和加速度绘图。
adrift = filter(d,vdrift)/dt;
at = t(1:end-2*delay);
ad = adrift;
ad(1:2*delay) = [];
at(1:2*delay) = [];
ad(1:2*delay) = [];
subplot(2,1,1)
plot(tt,vd)
xlabel('Time (s)')
ylabel('Speed (cm/s)')
grid
subplot(2,1,2)
plot(at,ad)
ax = gca;
ax.YLim = 2000*[-1 1];
xlabel('Time (s)')
ylabel('Acceleration (cm/s^2)')
grid
如图所示:
使用 diff 计算加速度。添加零来补偿数组大小的变化。将结果与使用滤波器获得的结果进行比较。请注意高频噪声的数量。
vdiff = diff([drift;0])/dt;
adiff = diff([vdiff;0])/dt;
subplot(2,1,1)
plot(at,ad)
ax = gca;
ax.YLim = 2000*[-1 1];
xlabel('Time (s)')
ylabel('Acceleration (cm/s^2)')
grid
legend('Filter')
title('Acceleration with Differentiation Filter')
subplot(2,1,2)
plot(t,adiff)
ax = gca;
ax.YLim = 2000*[-1 1];
xlabel('Time (s)')
ylabel('Acceleration (cm/s^2)')
grid
legend('diff')
如图所示:
求相关信号之间的延迟
三个不同位置的传感器测量汽车过桥时产生的振动。它们产生的信号在不同时间到达分析站。采样率为 11025 Hz。使用信号分析器确定信号之间的延迟。
将这些信号加载到 MATLAB® 工作区中并启动该 App。每个信号的名称包括接收该信号的传感器的编号。创建三个显示画面。将每个信号从工作区浏览器拖到它自己的显示画面上。来自传感器 2 的信号的到达时间早于来自传感器 1 的信号。来自传感器 1 的信号的到达时间早于来自传感器 3 的信号。
添加时间信息。选择 Signal 表中的三个信号,然后点击“分析器”选项卡上的时间值按钮。选择 Sample Rate and Start Time 选项,并输入 11025 Hz 的采样率。
这些信号共用一个时间轴。通过选择每个显示画面并在显示画面选项卡上选择链接时间来链接其时间跨度。
要估计信号之间的延迟,请水平平移它们,并对齐时间轴末端附近的一个显著特征。从时间选项卡中,读取时间轴的下限时间。选择一个高信噪比区域,例如每个信号末端附近的信号最大值。在来自传感器 2 的信号中,该特征在时钟开始后大约 0.197 秒时出现。
同样,来自传感器 1 的信号在启动后大约 0.229 秒时出现该特征,而来自传感器 3 的信号在启动后大约 0.243 秒时具有该特征。因此,延迟的长度大约为 0.032 秒和 0.014 秒。
也可以使用数据游标来求得延迟时间。按空格键重置视图。在显示画面选项卡上,点击数据游标 ▼ 下的箭头,然后选择Two。在前两个信号的最大值处分别放置一个游标。可以直接从 App 读取大约 0.032 秒的延迟。
同样,顶部和底部信号之间的延迟为 0.014 秒。可以使用 finddelay 和 xcorr 函数获得相似的结果。