目录
resample函数的功能是将均匀或非均匀数据用新的固定频率重新采样。
语法
y = resample(x,p,q)
y = resample(x,p,q,n)
y = resample(x,p,q,n,beta)
y = resample(x,p,q,b)
[y,b] = resample(x,p,q,___)
[yTT,b] = resample(xTT,p,q,___)
y = resample(x,tx)
y = resample(x,tx,fs)
y = resample(x,tx,fs,p,q)
y = resample(x,tx,___,method)
[y,ty] = resample(x,tx,___)
[y,ty,b] = resample(x,tx,___)
yTT = resample(xTT)
[yTT,b] = resample(xTT,___)
[___] = resample(___,'Dimension',dim)
说明
y = resample(x,p,q)对输入序列x在p/q乘以原始采样速率下进行重新采样。对序列x重新取样应用FIR抗混叠低通滤波器并补偿由滤波器引入的延迟。该函数沿着大小大于1的第一个数组维度进行操作。
y = resample(x,p,q,n)使用2xn×最大值(p,q)j阶抗混叠滤波器。
y = resample(x,p,q,n,beta)指定用于设计低通滤波器的Kaiser窗口的形状参数。
y = resample(x,p,q,b)使用指定的滤波器系数b对x进行滤波。
[y,b] = resample(x,p,q,___)还返回应用于的过滤器的系数x在重新采样期间。
[yTT,b] = resample(xTT,p,q,___)以p/q倍于原始采样速率对MATLAB时间表xTT中的均匀采样数据进行重新采样,并返回时间表yTT。您可以指定其他参数n、beta或b。
y = resample(x,tx)对在矢量tx中指定的时刻采样的信号值x进行重新采样。该函数将x线性插值到具有与tx相同端点和样本数的均匀间隔瞬间的向量上。nan被视为缺失数据并被忽略。
y =resample(x,tx,fs)使用多相抗混叠滤波器,以fs中规定的统一采样速率对信号进行重采样。
y = resample(x,tx,fs,p,q)将输入信号插值到一个中间均匀网格,采样间隔为(p/q)/fs。然后,该函数对结果进行滤波,通过p对其进行上采样,通过q对其进行下采样,最终采样速率为fs。为获得最佳结果,应确保fs × q/p至少是x的最高频率成分的两倍。
y = resample(x,tx,___,method)指定插值方法以及该组中以前语法的任何参数。插值方法可以是“线性”、“pchip”或“spline”。
[y,ty] = resample(x,tx,___)返回y中与重采样信号相对应的时刻。
[y,ty,b] = resample(x,tx,___)以b返回抗混叠滤波器的系数。
yTT = resample(xTT)对xTT中非均匀采样的数据进行重新采样,并返回均匀采样的数据。yTT与xTT具有相同的终点和样本数。
[yTT,b] = resample(xTT,___)对xTT中的非均匀采样数据进行重采样,并返回b中的抗混叠滤波器系数,可以为输入x,t x指定相同的参数选项。
[___] =resample(___,' Dimension ',dim)沿维度dim对输入进行重采样。
示例
重采样线性序列
以10 Hz原始速率的3/2对简单的线性序列进行重新采样。在同一图上绘制原始信号和重新采样信号。
fs = 10;
t1 = 0:1/fs:1;
x = t1;
y = resample(x,3,2);
t2 = (0:(length(y)-1))*2/(3*fs);
plot(t1,x,'*',t2,y,'o')
xlabel('Time (s)')
ylabel('Signal')
legend('Original','Resampled', ...
'Location','NorthWest')
如图所示:
滤波时,重采样假设输入序列x在给定的样本前后都为零。x端点与零的较大偏差会导致y出现意外值。 通过对三角形序列和具有非零端点的垂直移位序列进行重采样来显示这些偏差。
x = [1:10 9:-1:1;
10:-1:1 2:10]';
y = resample(x,3,2);
subplot(2,1,1)
plot(1:19,x(:,1),'*',(0:28)*2/3 + 1,y(:,1),'o')
title('Edge Effects Not Noticeable')
legend('Original','Resampled', ...
'Location','South')
subplot(2,1,2)
plot(1:19,x(:,2),'*',(0:28)*2/3 + 1,y(:,2),'o')
title('Edge Effects Noticeable')
legend('Original','Resampled', ...
'Location','North')
如图所示:
使用Kaiser窗口重新采样
构造一个正弦信号。指定采样速率,使16个样本正好对应一个信号周期。画出信号的柱状图。叠加阶梯图,实现采样保持可视化。
fs = 16;
t = 0:1/fs:1-1/fs;
x = 0.75*sin(2*pi*t);
stem(t,x)
hold on
stairs(t,x)
hold off
如图所示:
使用重采样将信号向上采样四倍。使用默认设置。将结果绘制在原始信号旁边。
ups = 4;
dns = 1;
fu = fs*ups;
tu = 0:1/fu:1-1/fu;
y = resample(x,ups,dns);
stem(tu,y)
hold on
stairs(t,x)
hold off
legend('Resampled','Original')
如图所示:
重复计算。指定n = 1,使抗混叠滤波器的阶数为2×1×4=8。为Kaiser窗口指定一个形状参数β=0。输出滤波器和重采样信号。
n = 1;
beta = 0;
[y,b] = resample(x,ups,dns,n,beta);
fo = filtord(b)
fo = 8
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 0')
如图所示:
重采样信号显示出由窗口的相对宽的主瓣和低的旁瓣衰减导致的混叠效应。 将n增加到5,使β=0。验证滤波器的阶数为40。绘制重采样信号。
n = 5;
[y,b] = resample(x,ups,dns,n,beta);
fo = filtord(b)
fo = 40
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 0')
如图所示:
较长的窗口具有较窄的主瓣,并且更好地衰减混叠效应。它还会衰减信号。 将滤波器阶数保留为2×5×4=40,并将形状参数增加到β=20。
beta = 20;
y = resample(x,ups,dns,n,beta);
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 20')
如图所示:
高旁瓣衰减导致良好的重采样。 将滤波器阶数降回2×1×4=8,保持β=20。
n = 1;
[y,b] = resample(x,ups,dns,n,beta);
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 20')
如图所示:
较宽的主瓣在重采样时会产生相当多的伪像。
对正弦波进行重新采样
生成60个正弦样本,并以3/2的原始速率对其进行重新采样。显示原始和重新采样的信号。
tx = 0:6:360-3;
x = sin(2*pi*tx/120);
ty = 0:4:360-2;
[y,by] = resample(x,3,2);
plot(tx,x,'+-',ty,y,'o:')
legend('original','resampled')
如图所示:
绘制抗混叠滤波器的频率响应。
freqz(by)
如图所示:
以2/3的原始速率对信号进行重新采样。显示原始信号及其重采样。
tz = 0:9:360-9;
[z,bz] = resample(x,2,3);
plot(tx,x,'+-',tz,z,'o:')
legend('original','resampled')
如图所示:
绘制新低通滤波器的脉冲响应。
如图所示:
对时间表中的数据进行重新采样
用十个随机产生的数字创建两个向量。假设每天记录每个病媒的一个数字,总共10天。将数据存储在MATLAB时间表中。
a = randn(10,1);
b = randn(10,1);
t = days(1:10);
xTT = timetable(t',[a b]);
使用重采样功能将采样率从每天一次增加到每小时一次。绘制两个数据集。
yTT = resample(xTT,24,1);
subplot(2,1,1)
plot(xTT.Time,xTT.Var1,'-o')
subplot(2,1,2)
plot(yTT.Time,yTT.Var1,'-o')
如图所示:
对不均匀采样的数据集进行重新采样
使用伽利略·伽利雷在1610年记录的数据来确定木卫四的轨道周期,木卫四是木星四颗最大卫星中最外面的一颗。 从1月15日开始,伽利略观察了卫星运动六周。因为在多云的夜晚看不到木星,所以观测结果有几个缺口。生成观测时间的日期时间数组。
t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
41 42 43 44 45]'+1;
yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
-10.5 -10.5 -10.0 -8.0]';
obsv = datetime(1610,1,15+t);
使用每天一次观测的采样率将数据重新采样到规则网格上。使用3的适度上采样因子以避免过度拟合。
fs = 1;
[y,ty] = resample(yg,t,fs,3,1);
绘制数据和重采样信号。
plot(t,yg,'o',ty,y,'.-')
xlabel('Day')
如图所示:
使用样条插值重复该过程,并显示观察日期。用天数倒数表示取样率。
fs = 1/86400;
[ys,tys] = resample(yg,obsv,fs,3,1,'spline');
plot(t,yg,'o')
hold on
plot(ys,'.-')
hold off
ax = gca;
ax.XTick = t(1:9:end);
ax.XTickLabel = char(obsv(1:9:end));
如图所示:
计算均匀间隔的线性插值数据的周期图功率谱估计值。选择DFT长度为1024。信号峰值出现在轨道周期的倒数。
[pxx,f] = periodogram(ys,[],1024,1,'power');
[pk,i0] = max(pxx);
f0 = f(i0);
T0 = 1/f0
T0 = 16.7869
plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')
如图所示:
对时间表中非均匀采样数据进行重采样
一个人在2012年闰年以磅为单位记录了他们的体重。这个人没有每天记录他们的体重,所以数据是不一致的。加载数据并将测量结果存储在MATLAB时间表中。使用datetime向量来指定行时间。
load weight2012.dat
rowTimes = datetime(2012,1,1:366)';
wt = weight2012(:,2);
xTT = timetable(rowTimes,wt);
对数据进行重新采样。结果是一个包含均匀采样数据的时间表,具有与wt相同的端点和样本数。
yTT = resample(xTT);
绘制原始数据和重采样数据进行比较。调整x轴限值,仅显示八月份的测量值。
plot(xTT.rowTimes,xTT.wt,'-o',yTT.Time,yTT.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))
legend('Original','Resampled')
如图所示:
使用三次插值再次对数据进行重新采样。
yTTs = resample(xTT,'pchip');
plot(xTT.rowTimes,xTT.wt,'o',yTTs.Time,yTTs.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))
如图所示:
现在增加采样率到每天两次测量,并使用样条插值。标绘结果。
fs = 1/86400;
yTTf = resample(xTT,2*fs,'spline');
plot(yTTf.Time,yTTf.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))
如图所示:
重采样多通道信号
产生一个五通道、100样本的正弦信号。时间在列中增加,频率在行中增加。标绘信号。
p = 3;
q = 2;
tx = 0:p:300-p;
x = cos(2*pi*tx./(1:5)'/100);
plot(tx,x,'.:')
title('Original')
ylim([-1.5 1.5])
如图所示:
沿正弦曲线的第二维向上采样3/2。将重新采样的信号叠加在图上。
ty = 0:q:300-q;
y = resample(x,p,q,'Dimension',2);
plot(ty,y,'.:')
title('Upsampled')
如图所示:
对重新采样的信号进行整形,使时间沿着第三维度运行。
y = permute(y,[1 3 2]);
size(y)
ans = 1×3
5 1 150
将信号下采样回其原始速率,并绘制它。
z = resample(y,q,p,'Dimension',3);
plot(tx,squeeze(z),'.:')
title('Downsampled')
如图所示: