Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

resample

새 고정 샘플 레이트로 균일 또는 비균일 데이터 리샘플링

설명

y = resample(x,p,q)는 입력 시퀀스 x를 원래 샘플 레이트의 p/q배로 리샘플링합니다. resample 함수는 FIR 안티에일리어싱 저역통과 필터x에 적용하고 필터로 인해 발생하는 지연을 보정합니다. 함수는 크기가 1보다 큰 첫 번째 배열 차원을 따라 연산을 수행합니다.

예제

y = resample(x,p,q,n)은 차수가 2 × n × max(p,q)인 안티에일리어싱 필터를 사용합니다.

y = resample(x,p,q,n,beta)는 저역통과 필터 설계에 카이저 윈도우의 형태 파라미터를 지정합니다.

예제

y = resample(x,p,q,b)b에 지정된 필터 계수를 사용하여 x를 필터링합니다.

yTT = resample(xTT,p,q,___)는 MATLAB® 타임테이블 xTT의 균일하게 샘플링된 데이터를 원래 샘플 레이트의 p/q배로 리샘플링하고 타임테이블 yTT를 반환합니다. 추가 인수 n, beta 또는 b를 지정할 수 있습니다.

예제

y = resample(x,tx)는 벡터 tx에 지정된 시점에서 샘플링된 신호의 값 x를 리샘플링합니다. 이 함수는 xtx와 같은 끝점과 샘플 개수를 가지며 균일한 간격의 시점으로 구성된 벡터로 선형 보간합니다. NaN은 누락된 데이터로 처리되며 무시됩니다.

y = resample(x,tx,fs)는 다상 안티에일리어싱 필터(Polyphase Antialiasing Filter)를 사용하여 fs에 지정된 균일한 샘플 레이트로 신호를 리샘플링합니다.

y = resample(x,tx,fs,p,q)는 입력 신호를 (p/q)/fs의 샘플 간격을 갖는 균일한 중간 그리드로 보간합니다. 그런 다음 그 결과를 필터링하여 인자 p로 업샘플링하고 인자 q로 다운샘플링함으로써 최종 샘플 레이트 fs를 얻습니다. 최상의 결과를 얻기 위해서는 fs × q/px의 최고 주파수 성분보다 최소 2배 큰 크기여야 합니다.

y = resample(x,tx,___,method)는 위에 열거된 구문에 보간 방법을 지정합니다. 보간 방법은 "linear", "pchip" 또는 "spline"입니다.

예제

[y,ty] = resample(x,tx,___)는 리샘플링된 신호에 해당하는 시점을 ty로 반환합니다.

yTT = resample(xTT,___)xTT의 불균일하게 샘플링된 데이터를 리샘플링하고 균일하게 샘플링된 데이터를 반환합니다. yTT의 끝점 및 샘플 수는 xTT와 동일합니다. 입력값 x,tx에 사용할 수 있는 것과 동일한 인수 옵션을 지정할 수 있습니다.

예제

[y,b] = resample(x,p,q,___)는 리샘플링하면서 x에 적용한 필터의 계수도 반환합니다.

예제

[y,ty,b] = resample(x,tx,___)는 안티에일리어싱 필터의 계수를 b로 반환합니다.

[yTT,b] = resample(xTT,___)xTT의 타임테이블 데이터를 리샘플링하고 b에 안티에일리어싱 필터의 계수를 반환합니다.

[___] = resample(___,Dimension=dim)은 차원 dim을 따라 입력값을 리샘플링합니다. (R2020b 이후)

예제

예제

모두 축소

간단한 선형 시퀀스를 원래 속도 10Hz의 3/2으로 리샘플링합니다. 동일한 Figure에 원래 신호와 리샘플링된 신호를 플로팅합니다.

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')

필터링 시, resample은 입력값으로 받은 샘플의 이전 및 이후 부분에서 입력 시퀀스 x를 0으로 가정합니다. x의 끝점 값이 0에서 크게 벗어나게 되면 y에 예기치 않은 값이 생성될 수 있습니다.

삼각형 시퀀스와, 이를 세로로 변형해 0이 아닌 끝점을 갖게 만든 시퀀스를 리샘플링하여 이러한 편차를 표시합니다.

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')

정현파 신호를 생성합니다. 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

resample을 사용하여 인자 4로 신호를 업샘플링합니다. 디폴트 설정을 사용합니다. 원래 신호와 함께 결과를 플로팅합니다.

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")

계산을 반복합니다. 안티에일리어싱 필터의 차수가 2×1×4=8이 되도록 n = 1을 지정합니다. 카이저 윈도우에 대한 형태 파라미터 β=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')

새로운 저역통과 필터의 임펄스 응답을 플로팅합니다.

impz(bz)

임의로 생성된 10개의 숫자로 구성된 벡터 두 개를 만듭니다. 각 벡터에 대해 총 10일 동안 매일 숫자 하나를 기록했다고 가정하겠습니다. MATLAB 타임테이블에 그 데이터를 저장합니다.

a = randn(10,1);
b = randn(10,1);

t = days(1:10);

xTT = timetable(t',[a b]);

resample 함수를 사용하여 샘플 레이트를 매일 한 번에서 매시간 한 번으로 늘립니다. 두 데이터 세트를 플로팅합니다.

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년에 기록한 데이터를 사용하여 목성의 가장 큰 4개 위성 중 가장 바깥쪽 위성인 칼리스토의 궤도 주기를 파악합니다.

갈릴레오는 1월 15일부터 6주 동안 이 위성의 움직임을 관측했습니다. 구름이 낀 밤에는 목성이 보이지 않았기 때문에 관측값에 여러 개의 공백이 있습니다. 관측 시간값으로 구성된 datetime형 배열을 생성합니다.

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);

1일 1회 관측이라는 샘플 레이트를 사용하여 데이터를 정규 그리드로 리샘플링합니다. 적당한 업샘플링 인자 3을 사용하여 과적합을 방지합니다.

fs = 1;

[y,ty] = resample(yg,t,fs,3,1);

데이터와 리샘플링된 신호를 플로팅합니다.

plot(t,yg,'o',ty,y,'.-')
xlabel('Day')

스플라인 보간을 사용하고 관측 날짜를 표시하여 다시 한번 실행합니다. 1일 초수의 역수로 샘플 레이트를 표현합니다.

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년에 거의 매일 파운드 단위로 자신의 체중을 기록했습니다. 누락된 샘플은 NaN으로 입력했습니다. 데이터를 불러오고 측정값을 MATLAB 타임테이블에 저장합니다. datetime형 벡터를 사용하여 행 시간값을 지정하고 누락된 샘플을 제거합니다.

load weight2012.dat

rowTimes = datetime(2012,1,1:366)';
wt = weight2012(:,2);
xTT = timetable(rowTimes,wt);
xTT(isnan(wt),:) = [];

데이터를 리샘플링합니다. 그 결과 wt와 동일한 끝점과 샘플 수를 사용하여 균일하게 샘플링된 데이터를 포함하는 타임테이블이 생성됩니다.

yTT = resample(xTT);

비교를 위해 원본 데이터와 리샘플링된 데이터를 모두 플로팅합니다. 8월의 측정값만 표시되도록 x축 제한을 조정합니다.

plot(xTT.rowTimes,xTT.wt,":o",yTT.Time,yTT.wt,"-*")
aug = datetime([2012 08 01;2012 08 31]); 
xlim(aug)
legend(["Original" "Resampled"])

3차 보간을 사용하여 데이터를 다시 리샘플링합니다.

yTTs = resample(xTT,"pchip");

plot(xTT.rowTimes,xTT.wt,":o",yTTs.Time,yTTs.wt,"-*")
xlim(aug)
legend(["Original" "Resampled"])

이제 샘플 레이트를 하루 두 번 측정으로 늘리고 스플라인 보간을 사용합니다. 결과를 플로팅합니다.

fs = 1/86400;
yTTf = resample(xTT,2*fs,"spline");

plot(xTT.rowTimes,xTT.wt,":o",yTTf.Time,yTTf.wt,'-*')
xlim(aug)
legend(["Original" "Resampled"])

100개 샘플로 구성된 5채널 정현파 신호를 생성합니다. 시간은 열 방향으로 증가하고, 주파수는 행 방향으로 증가합니다. 신호를 플로팅합니다.

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')

입력 인수

모두 축소

입력 신호로, 벡터, 행렬 또는 N차원 배열로 지정됩니다. 시간 정보가 제공된 경우 xNaN을 포함할 수 있습니다. NaN은 누락된 데이터로 취급되며 리샘플링에서 제외됩니다.

예: cos(pi/4*(0:159))+randn(1,160)은 단일채널 행 벡터 신호입니다.

예: cos(pi./[4;2]*(0:159))'+randn(160,2)는 2채널 신호입니다.

데이터형: single | double

리샘플링 인자로, 양의 정수로 지정됩니다.

데이터형: single | double

이웃 항 번호로, 양의 정수로 지정됩니다. n = 0이면 resample 함수가 최근접이웃 보간을 수행합니다. 안티에일리어싱 FIR 필터의 길이는 n에 비례합니다. n의 값이 클수록 더 많은 계산 시간이 필요하지만 정확도는 향상됩니다.

데이터형: single | double

카이저 윈도우의 형태 파라미터로, 양의 실수형 스칼라로 지정됩니다. beta를 늘리면 안티에일리어싱 필터를 설계하는 데 사용되는 윈도우의 메인로브가 넓어지고 윈도우 사이드로브의 진폭은 줄어듭니다.

데이터형: single | double

FIR 필터 계수로, 벡터로 지정됩니다. 기본적으로, resample은 카이저 윈도우와 함께 firls를 사용하여 필터를 설계합니다. 지연을 보정할 때 resampleb가 홀수 길이와 선형 위상을 가진다고 가정합니다. 자세한 내용은 안티에일리어싱 저역통과 필터 항목을 참조하십시오.

데이터형: single | double

2개 이상의 행이 있는 입력 타임테이블로, timetable로 지정됩니다. xTT의 각 변수는 독립 신호로 처리됩니다. 타임테이블의 변수가 N차원 배열이면 resample 함수는 첫 번째 차원을 따라 연산을 수행합니다.

참고

  • RowTimes는 duration형 벡터이거나 고유한 유한 값을 가지는 datetime 객체여야 합니다. Nonfinite 시간 값은 누락된 데이터로 처리되고 무시됩니다.

  • RowTimes가 정렬되지 않은 경우 resample 함수는 이를 오름차순으로 정렬합니다.

자세한 내용은 timetable 항목을 참조하십시오.

시점으로, 음이 아닌 실수형 벡터나 datetime형 배열로 지정됩니다. tx는 단조 증가(Monotonically Increasing)해야 하지만 간격이 균일할 필요는 없습니다. txNaN 또는 NaT를 포함할 수 있습니다. 이러한 값은 누락된 데이터로 처리되므로 리샘플링에서 제외됩니다. tx는 입력값 x에만 유효합니다.

데이터형: single | double | datetime

샘플 레이트로, 양의 스칼라로 지정됩니다. 샘플 레이트는 단위 시간당 샘플 개수입니다. 시간 단위가 초이면 샘플 레이트의 단위는 Hz입니다.

데이터형: single | double

보간 방법으로, "linear", "pchip" 또는 "spline" 중 하나로 지정됩니다.

  • "linear" — 선형 보간입니다.

  • "pchip" — 형태 보존 조각별 3차 보간입니다.

  • "spline" — not-a-knot 끝 조건을 사용한 스플라인 보간입니다.

자세한 내용은 interp1 함수 도움말 페이지를 참조하십시오.

참고

x가 천천히 변화하지 않는 경우 interp1"pchip" 보간 방법과 함께 사용해 보십시오.

연산을 수행할 차원으로, 양의 정수 스칼라로 지정됩니다. dim이 지정되지 않은 경우 resample 함수는 크기가 1보다 큰 첫 번째 배열 차원을 따라 연산을 수행합니다. 입력값이 타임테이블인 경우 dim은 1이어야 합니다.

데이터형: single | double

출력 인수

모두 축소

리샘플링된 신호로, 벡터, 행렬 또는 N차원 배열로 반환됩니다. x가 차원 dim을 따라서 길이가 N이고 사용자가 pq를 지정한 경우 ydim을 따라서 길이가 ⌈N × p/q입니다.

FIR 필터 계수로, 벡터로 반환됩니다.

출력 시점으로, 음이 아닌 실수형 벡터로 반환됩니다. ty는 입력값 x에만 적용됩니다.

리샘플링된 타임테이블로, timetable로 반환됩니다.

세부 정보

모두 축소

안티에일리어싱 저역통과 필터

resample은 유리수 인자 p/q를 사용하여 신호를 리샘플링하기 위해 upfirdn을 호출합니다. upfirdn은 개념적으로 다음과 같은 단계를 수행합니다.

  1. 0을 삽입하여 인자 p로 신호를 업샘플링합니다.

  2. 업샘플링된 신호에 FIR 안티에일리어싱 필터를 적용합니다.

  3. 샘플을 삭제하여, 필터링된 신호를 인자 q로 다운샘플링합니다.

이상적인 안티에일리어싱 필터는 정규화된 차단 주파수 fc = π/max(p,q) rad/sample과 이득 p를 갖습니다. resample은 카이저 윈도우 방법을 사용하여 안티에일리어싱 필터를 근사합니다.

  • 필터 차수는 2 × n × max(p,q)입니다. n의 디폴트 값은 10입니다.

  • 카이저 윈도우에는 천이 폭과 저지대역 감쇠량 사이의 절충을 제어하는 형태 파라미터 beta가 있습니다. beta의 디폴트 값은 5입니다.

  • 윈도우의 처리 이득을 고려하도록 필터 계수가 정규화됩니다.

이에 대한 예로, 신호를 원래 샘플 레이트의 3/2배로 리샘플링하는 안티에일리어싱 필터를 설계하겠습니다.

p = 3;
q = 2;
maxpq = max(p,q);

fc = 1/maxpq;
n = 10;
order = 2*n*maxpq;
beta = 5;

b = fir1(order,fc,kaiser(order+1,beta));
b = p*b/sum(b);
자세한 내용은 균일하게 샘플링된 신호 리샘플링하기 항목을 참조하십시오.

  • isregular 함수를 사용하여 타임테이블이 균일하게 샘플링되는지 확인합니다.

알고리즘

resamplefirls를 사용하여 FIR 설계를 수행하고, 윈도우의 처리 이득을 고려하도록 결과를 정규화한 후 upfirdn을 사용하여 레이트 변경을 구현합니다.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장