取信号导数
相关信号之间的延迟
取信号导数
信号求导不增加噪声功率。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 的信号。
&bsp; 添加时间信息。选择 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 函数获得相似的结果。