Main Content

upfirdn

업샘플링, FIR 필터 적용 및 다운샘플링

설명

yout = upfirdn(xin,h)는 임펄스 응답이 h인 FIR 필터를 사용하여 입력 신호 xin을 필터링합니다. 이 구문에서는 업샘플링이나 다운샘플링이 구현되지 않습니다.

yout = upfirdn(xin,h,p)는 정수 업샘플링 인자 p를 지정합니다.

yout = upfirdn(xin,h,p,q)는 정수 다운샘플링 인자 q를 지정합니다.

예제

예제

모두 축소

유리수 변환 인자를 사용하여 신호의 샘플 레이트를 DAT 레이트 48kHz에서 CD 샘플 레이트 44.1kHz로 변환합니다. rat 함수를 사용하여 유리수 인자의 분자 L과 분모 M을 구합니다.

Fdat = 48e3;
Fcd = 44.1e3;
[L,M] = rat(Fcd/Fdat)
L = 
147
M = 
160

0.25초 동안 fDAT로 샘플링된 1.5kHz 정현파 샘플을 생성합니다. 신호를 1밀리초 동안 플로팅합니다.

t = 0:1/Fdat:0.25-1/Fdat;
x = sin(2*pi*1.5e3*t);
stem(t,x)
xlim([0 0.001])
hold on

Figure contains an axes object. The axes object contains an object of type stem.

카이저 윈도우를 사용하여 안티에일리어싱 저역통과 필터를 설계합니다. 필터 대역 경계를 차단 주파수 (fDAT/2)×min(1/L,1/M)의 90%와 110%로 설정합니다. 통과대역 리플을 5dB로 지정하고 저지대역 감쇠량을 40dB로 지정합니다. 통과대역 이득을 L로 설정합니다.

f = (Fdat/2)*min(1/L,1/M);
d = designfilt('lowpassfir', ...
    'PassbandFrequency',0.9*f,'StopbandFrequency',1.1*f, ...
    'PassbandRipple',5,'StopbandAttenuation',40, ...
    'DesignMethod','kaiserwin','SampleRate',48e3);
h = L*tf(d);

upfirdn을 필터 h와 함께 사용하여 정현파를 리샘플링합니다. 필터로 인해 발생하는 지연을 계산하고 보정합니다. 이에 대응하는 리샘플링된 시간 벡터를 생성합니다.

y = upfirdn(x,h,L,M);

delay = floor(((filtord(d)-1)/2-(L-1))/L);
y = y(delay+1:end);
t_res = (0:(length(y)-1))/Fcd;

플롯에 리샘플링된 신호를 겹쳐 놓습니다.

stem(t_res,y,'*')
legend('Original','Resampled','Location','southeast')
hold off

Figure contains an axes object. The axes object contains 2 objects of type stem. These objects represent Original, Resampled.

입력 인수

모두 축소

입력 신호로, 벡터나 행렬로 지정됩니다. xin이 벡터이면 단일 신호를 나타냅니다. xin이 행렬이면 각 열이 개별적으로 필터링됩니다. 자세한 내용은 항목을 참조하십시오.

데이터형: single | double

필터 임펄스 응답으로, 벡터 또는 행렬로 지정됩니다. h가 벡터이면 단일 FIR 필터를 나타냅니다. h가 행렬이면 각 열은 별도의 FIR 임펄스 응답 시퀀스입니다. 자세한 내용은 항목을 참조하십시오.

데이터형: single | double

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

데이터형: single | double

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

데이터형: single | double

출력 인수

모두 축소

출력 신호로, 벡터 또는 행렬로 반환됩니다. yout의 각 열은 길이가 ceil(((length(xin)-1)*p+length(h))/q)입니다.

upfirdn 함수에 대한 입력값이 단정밀도이면 이 함수는 단정밀도로 yout을 반환합니다.

참고

upfirdn이 컨벌루션과 레이트 변경을 수행하기 때문에 출력 신호 yout의 길이는 입력 신호 xin의 길이와 다릅니다. yout의 행 개수는 xin의 행 개수의 약 p/q배입니다.

xinh의 크기의 유효한 조합은 다음과 같습니다.

  1. xin이 벡터이고 h도 벡터임.

    입력값이 한 개의 필터와 한 개의 신호이기 때문에, 함수는 xinh와 컨벌루션합니다. xin이 행 벡터이면 출력 신호 yout은 행 벡터입니다. 그렇지 않은 경우 yout은 열 벡터입니다.

  2. xin이 행렬이고 h가 벡터임.

    입력값이 한 개의 필터와 여러 개의 신호이기 때문에, 함수는 hxin의 각 열과 컨벌루션합니다. 결과로 생성된 youtxin과 열 개수가 같은 행렬입니다.

  3. xin이 벡터이고 h가 행렬임.

    입력값이 여러 개의 필터와 한 개의 신호이기 때문에, 함수는 h의 각 열을 xin과 컨벌루션합니다. 결과로 생성된 youth와 열 개수가 같은 행렬입니다.

  4. xinh가 열 개수가 같은 행렬임.

    입력값이 여러 개의 필터와 여러 개의 신호이기 때문에, 함수는 xinh의 대응 열을 컨벌루션합니다. 결과로 생성된 youtxinh와 열 개수가 같은 행렬입니다.

알고리즘

upfirdn은 다상 보간 구조를 사용합니다. 다상 구조에서 다중 가산 연산의 개수는 (LhLxpLx)/q이며, 여기서 LhLx의 길이는 각각 h(n)과 x(n)입니다. 이 공식은 긴 신호에 대해 대체로 정확합니다.

upfirdn은 다음 세 가지 작업을 잇따라 수행합니다.

  1. 정수 인자 p로 행렬 xin의 입력 데이터를 업샘플링(0 삽입)

  2. 업샘플링된 신호 데이터를 벡터 또는 행렬 h에 지정된 임펄스 응답 시퀀스로 FIR 필터링

  3. 그 결과를 정수 인자 q로 다운샘플링(샘플 버리기)

FIR 필터는 대개 저역통과 필터로, firpm 또는 fir1 같은 다른 함수를 사용하여 설계해야 합니다.

참고

함수 resamplefirls를 사용하여 FIR 설계를 수행하고, 그런 다음 upfirdn을 사용하여 레이트 변경을 수행합니다.

참고 문헌

[1] Crochiere, R. E. "A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios." Programs for Digital Signal Processing (Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds.). New York: IEEE Press, 1979, Programs 8.2-1–8.2-7.

[2] Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2006a 이전에 개발됨

모두 확장