Main Content

진폭 추정 및 0 채우기

이 예제에서는 0 채우기를 사용하여 정현파 신호의 정확한 진폭 추정값을 구하는 방법을 보여줍니다. 이산 푸리에 변환(DFT)에서 주파수의 간격은 Fs/N입니다. 여기서 Fs는 샘플 레이트이고, N은 입력 시계열의 길이입니다. DFT Bin에 부합하지 않는 주파수를 갖는 정현파 진폭을 추정하려고 하면 추정값이 부정확할 수 있습니다 DFT를 계산하기 전에 데이터에 0 채우기를 수행하면 종종 진폭 추정값의 정확도를 높이는 데 도움이 됩니다.

두 개의 사인파로 구성된 신호를 생성합니다. 두 사인파의 주파수는 각각 100Hz와 202.5Hz입니다. 샘플 레이트는 1000Hz이고, 신호 길이는 1000개 샘플입니다.

Fs = 1e3;
t = 0:0.001:1-0.001;
x = cos(2*pi*100*t)+sin(2*pi*202.5*t);

신호의 DFT를 구합니다. DFT Bin의 간격은 1Hz입니다. 따라서 100Hz 사인파는 DFT Bin에 부합하지만, 202.5Hz 사인파는 부합하지 않습니다.

신호가 실수 값이기 때문에, DFT에서 양수 주파수만 사용하여 진폭을 추정합니다. DFT를 입력 신호의 길이로 스케일링하고 0과 나이퀴스트를 제외한 모든 주파수에 2를 곱합니다.

비교를 위해 이미 알고 있는 진폭에 대해 결과를 플로팅합니다.

xdft = fft(x);
xdft = xdft(1:length(x)/2+1);
xdft = xdft/length(x);
xdft(2:end-1) = 2*xdft(2:end-1);
freq = 0:Fs/length(x):Fs/2;

plot(freq,abs(xdft))
hold on
plot(freq,ones(length(x)/2+1,1),'LineWidth',2)
xlabel('Hz')
ylabel('Amplitude')
hold off

Figure contains an axes object. The axes object with xlabel Hz, ylabel Amplitude contains 2 objects of type line.

100Hz에서의 진폭 추정값은 해당 주파수가 DFT Bin에 부합하기 때문에 정확합니다. 그러나 202.5Hz에서의 진폭 추정값은 해당 주파수가 DFT Bin에 부합하지 않기 때문에 정확하지 않습니다.

0 채우기로 DFT를 보간할 수 있습니다. 0 채우기를 사용하면 분해할 수 있는 신호 성분에 대해 더 정확한 진폭 추정값을 얻을 수 있습니다. 반면에 0 채우기를 통해 DFT의 스펙트럼(주파수) 분해능을 개선할 수는 없습니다. 분해능은 샘플 개수와 샘플 레이트로 결정됩니다.

2000이 되도록, 즉 x의 원래 길이의 두 배가 되도록 DFT를 채웁니다. 이 길이를 사용하면 DFT Bin의 간격이 Fs/2000=0.5Hz가 됩니다. 이 경우 202.5Hz의 사인파에서 나오는 에너지가 정확히 DFT Bin에 속합니다. DFT를 구하고 진폭 추정값을 플로팅합니다. 2000개 샘플까지 0 채우기를 사용합니다.

lpad = 2*length(x);
xdft = fft(x,lpad);
xdft = xdft(1:lpad/2+1);
xdft = xdft/length(x);
xdft(2:end-1) = 2*xdft(2:end-1);
freq = 0:Fs/lpad:Fs/2;

plot(freq,abs(xdft))
hold on
plot(freq,ones(2*length(x)/2+1,1),'LineWidth',2)
xlabel('Hz')
ylabel('Amplitude')
hold off

Figure contains an axes object. The axes object with xlabel Hz, ylabel Amplitude contains 2 objects of type line.

0 채우기를 사용하여 두 주파수의 진폭을 정확하게 추정할 수 있습니다.

참고 항목