이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

FFT를 사용한 전력 스펙트럼 밀도 추정값

이 예제에서는 fft를 사용하여 주기도와 일치하는 비모수적 전력 스펙트럼 밀도(PSD) 추정값을 구하는 방법을 보여줍니다. 이 예제에서는 짝수 길이 입력값에 대해, 정규화 주파수 및 헤르츠에 대해, 단방향 및 양방향 PSD 추정값에 대해 fft의 출력값을 적절하게 스케일링하는 방법을 보여줍니다.

샘플 레이트를 사용하는 짝수 길이 입력값

fftperiodogram을 모두 사용하여 1kHz로 샘플링된 짝수 길이 신호의 주기도를 구합니다. 결과를 비교합니다.

N(0,1) 가산성 잡음이 있는 100Hz 사인파로 구성된 신호를 생성합니다. 샘플링 주파수는 1kHz입니다. 신호 길이는 1000개 샘플입니다. 재현 가능한 결과를 얻기 위해 난수 생성기의 디폴트 설정을 사용합니다.

rng default
Fs = 1000;
t = 0:1/Fs:1-1/Fs;
x = cos(2*pi*100*t) + randn(size(t));

fft를 사용하여 주기도를 구합니다. 신호는 실수 값이며 짝수 길이를 가집니다. 신호가 실수 값이므로 양수 주파수나 음수 주파수에 대한 전력 추정값만 구하면 됩니다. 총 전력을 유지하려면 양의 주파수 세트와 음의 주파수 세트에 나타나는 모든 주파수에 인수 2를 곱하십시오. 영주파수(DC)와 나이퀴스트 주파수는 두 번 나타나지 않습니다. 결과를 플로팅합니다.

N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(Fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(x):Fs/2;

plot(freq,10*log10(psdx))
grid on
title('Periodogram Using FFT')
xlabel('Frequency (Hz)')
ylabel('Power/Frequency (dB/Hz)')

periodogram을 사용하여 주기도를 계산하고 플로팅합니다. 두 결과가 동일한지 표시합니다.

periodogram(x,rectwin(length(x)),length(x),Fs)

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x),Fs))
mxerr = 3.4694e-18

정규화 주파수를 가지는 입력값

fft를 사용하여 정규화 주파수를 가지는 입력값에 대한 주기도를 생성합니다. N(0,1) 가산성 잡음이 있는 사인파로 구성된 신호를 생성합니다. 사인파는 π/4 rad/sample의 각주파수를 가집니다. 재현 가능한 결과를 얻기 위해 난수 생성기의 디폴트 설정을 사용합니다.

rng default
n = 0:999;
x = cos(pi/4*n) + randn(size(n));

fft를 사용하여 주기도를 구합니다. 신호는 실수 값이며 짝수 길이를 가집니다. 신호가 실수 값이므로 양수 주파수나 음수 주파수에 대한 전력 추정값만 구하면 됩니다. 총 전력을 유지하려면 양의 주파수 세트와 음의 주파수 세트에 나타나는 모든 주파수에 인수 2를 곱하십시오. 영주파수(DC)와 나이퀴스트 주파수는 두 번 나타나지 않습니다. 결과를 플로팅합니다.

N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(2*pi*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:(2*pi)/N:pi;

plot(freq/pi,10*log10(psdx))
grid on
title('Periodogram Using FFT')
xlabel('Normalized Frequency (\times\pi rad/sample)') 
ylabel('Power/Frequency (dB/rad/sample)')

periodogram을 사용하여 주기도를 계산하고 플로팅합니다. 두 결과가 동일한지 표시합니다.

periodogram(x,rectwin(length(x)),length(x))

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x)))
mxerr = 1.4211e-14

정규화 주파수를 가지는 복소수 값 입력 신호

fft를 사용하여 정규화 주파수를 가지는 복소수 값 입력 신호에 대한 주기도를 생성합니다. 이 신호는 복소수 값 N(0,1) 잡음을 가지며 π/4 rad/sample의 각주파수를 가지는 복소수 지수입니다. 재현 가능한 결과를 얻기 위해 난수 생성기를 디폴트 설정으로 구성합니다.

rng default
n = 0:999;
x = exp(1j*pi/4*n) + [1 1j]*randn(2,length(n))/sqrt(2);

fft를 사용하여 주기도를 구합니다. 입력 신호가 복소수 값이므로 (-π,π] rad/sample에서 주기도를 구합니다. 결과를 플로팅합니다.

N = length(x);
xdft = fft(x);
psdx = (1/(2*pi*N)) * abs(xdft).^2;
freq = 0:(2*pi)/N:2*pi-(2*pi)/N;

plot(freq/pi,10*log10(psdx))
grid on
title('Periodogram Using FFT')
xlabel('Normalized Frequency (\times\pi rad/sample)') 
ylabel('Power/Frequency (dB/rad/sample)')

periodogram을 사용하여 주기도를 구하고 플로팅합니다. PSD 추정값을 비교합니다.

periodogram(x,rectwin(length(x)),length(x),'twosided')

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x),'twosided'))
mxerr = 2.8422e-14

참고 항목

함수