Main Content

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

fft

고속 푸리에 변환(Fast Fourier Transform)

설명

예제

Y = fft(X)는 고속 푸리에 변환(FFT) 알고리즘을 사용하여 X이산 푸리에 변환(DFT)을 계산합니다.

  • X가 벡터인 경우 fft(X)는 벡터의 푸리에 변환을 반환합니다.

  • X가 행렬인 경우 fft(X)X의 열을 벡터로 취급하고 각 열의 푸리에 변환을 반환합니다.

  • X가 다차원 배열인 경우 fft(X)는 크기가 1이 아닌 첫 번째 배열 차원의 값을 벡터로 취급하고 각 벡터의 푸리에 변환을 반환합니다.

예제

Y = fft(X,n)n포인트 DFT를 반환합니다. 값이 지정되지 않은 경우 YX와 크기가 같습니다.

  • X가 벡터이고 X의 길이가 n보다 작은 경우 Xn 길이까지 후행 0으로 채워집니다.

  • X가 벡터이고 X의 길이가 n보다 큰 경우 Xn 길이로 잘립니다.

  • X가 행렬인 경우 각 열은 벡터에서 취급되는 것처럼 취급됩니다.

  • X가 다차원 배열인 경우 크기가 1이 아닌 첫 번째 배열 차원은 벡터에서 취급되는 것처럼 취급됩니다.

예제

Y = fft(X,n,dim)은 차원 dim을 따라 푸리에 변환을 반환합니다. 예를 들어, X가 행렬인 경우 fft(X,n,2)는 각 행의 n포인트 푸리에 변환을 반환합니다.

예제

모두 축소

푸리에 변환을 사용하면 잡음에 묻힌 신호의 주파수 성분을 찾을 수 있습니다.

샘플링 주파수 1kHz와 신호 지속 시간 1.5초로 신호의 파라미터를 지정합니다.

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

진폭 0.7의 50Hz 정현파와 진폭 1의 120Hz 정현파를 포함하는 신호를 생성합니다.

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

분산 4, 평균 0의 백색 잡음(White Noise)으로 손상시킵니다.

X = S + 2*randn(size(t));

잡음이 있는 신호를 시간 영역에 플로팅합니다. 신호 X(t)를 살펴보고 주파수 성분을 식별하기란 어렵습니다.

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

Figure contains an axes. The axes with title Signal Corrupted with Zero-Mean Random Noise contains an object of type line.

신호의 푸리에 변환을 계산합니다.

Y = fft(X);

양방향 스펙트럼 P2를 계산합니다. 그런 다음, P2와 짝수 값 신호 길이 L을 기반으로 하여 단방향 스펙트럼 P1을 계산합니다.

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

주파수 영역 f를 정의하고 단방향 진폭 스펙트럼 P1을 플로팅합니다. 잡음이 추가되었기 때문에 진폭이 정확히 0.7과 1이 되지는 않습니다. 평균적으로 신호가 길수록 더 나은 주파수 근삿값을 얻을 수 있습니다.

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Figure contains an axes. The axes with title Single-Sided Amplitude Spectrum of X(t) contains an object of type line.

이제, 손상되지 않은 원래 신호의 푸리에 변환을 사용하여 정확한 진폭 0.7과 1.0을 가져옵니다.

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Figure contains an axes. The axes with title Single-Sided Amplitude Spectrum of S(t) contains an object of type line.

가우스 펄스를 시간 영역에서 주파수 영역으로 변환합니다.

신호 파라미터와 가우스 펄스 X를 정의합니다.

Fs = 100;           % Sampling frequency
t = -0.5:1/Fs:0.5;  % Time vector 
L = length(t);      % Signal length

X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

펄스를 시간 영역에 플로팅합니다.

plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')

Figure contains an axes. The axes with title Gaussian Pulse in Time Domain contains an object of type line.

fft 함수를 사용하여 신호를 주파수 영역으로 변환하려면 먼저 원래 신호 길이 다음의 2의 거듭제곱이 되는 새 입력 길이를 식별하십시오. 그러면 fft의 성능 향상을 위해 신호 X에 후행 0이 채워집니다.

n = 2^nextpow2(L);

가우스 펄스를 주파수 영역으로 변환합니다.

Y = fft(X,n);

주파수 영역을 정의하고 고유한 주파수를 플로팅합니다.

f = Fs*(0:(n/2))/n;
P = abs(Y/n).^2;

plot(f,P(1:n/2+1)) 
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|^2')

Figure contains an axes. The axes with title Gaussian Pulse in Frequency Domain contains an object of type line.

시간 영역과 주파수 영역의 코사인파를 비교합니다.

샘플링 주파수 1kHz와 신호 지속 시간 1초로 신호의 파라미터를 지정합니다.

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

각 행이 스케일링된 주파수의 코사인파를 나타내는 행렬을 만듭니다. 결과값 X는 3×1000 행렬이 됩니다. 첫 번째 행의 파동 주파수는 50이고, 두 번째 행의 파동 주파수는 150이고, 세 번째 행의 파동 주파수는 300입니다.

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave

X = [x1; x2; x3];

단일 Figure에 있는 X의 각 행에서 처음 100개 요소를 순서대로 플로팅하고 주파수를 비교합니다.

for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title(['Row ',num2str(i),' in the Time Domain'])
end

Figure contains 3 axes. Axes 1 with title Row 1 in the Time Domain contains an object of type line. Axes 2 with title Row 2 in the Time Domain contains an object of type line. Axes 3 with title Row 3 in the Time Domain contains an object of type line.

알고리즘 성능을 위해 fft를 사용하여 입력값을 후행 0으로 채울 수 있습니다. 이 경우 각 행의 길이를 최소로 늘일 수 있는 2의 거듭제곱만큼 늘여 X의 각 행을 0으로 채우십시오. nextpow2 함수를 사용하여 새 길이를 정의합니다.

n = 2^nextpow2(L);

X의 행을 따라, 즉 각 신호에 대해 fft를 사용하도록 dim 인수를 지정합니다.

dim = 2;

신호의 푸리에 변환을 계산합니다.

Y = fft(X,n,dim);

각 신호의 양방향 스펙트럼과 단방향 스펙트럼을 계산합니다.

P2 = abs(Y/L);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

주파수 영역에서 단일 Figure의 각 행에 대해 단방향 진폭 스펙트럼을 플로팅합니다.

for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
    title(['Row ',num2str(i),' in the Frequency Domain'])
end

Figure contains 3 axes. Axes 1 with title Row 1 in the Frequency Domain contains an object of type line. Axes 2 with title Row 2 in the Frequency Domain contains an object of type line. Axes 3 with title Row 3 in the Frequency Domain contains an object of type line.

입력 인수

모두 축소

입력 배열로, 벡터, 행렬, 다차원 배열 중 하나로 지정됩니다.

X가 빈 0×0 행렬인 경우 fft(X)는 빈 0×0 행렬을 반환합니다.

데이터형: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
복소수 지원 여부:

변환 길이로, [] 또는 음이 아닌 정수 스칼라로 지정됩니다. 양의 정수 스칼라로 변환 길이를 지정하면 fft의 성능을 향상시킬 수 있습니다. 이 길이는 일반적으로 2의 거듭제곱으로 지정되거나 소인수의 곱으로 지정됩니다. n이 신호의 길이보다 작은 경우 fftn 번째 요소 이후의 나머지 신호 값을 무시하고 잘린 결과를 반환합니다. n0인 경우 fft는 빈 행렬을 반환합니다.

예: n = 2^nextpow2(size(X,1))

데이터형: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

함수 동작이 수행될 차원으로, 양의 정수 스칼라로 지정됩니다. 값이 지정되지 않은 경우 디폴트 값은 크기가 1이 아닌 첫 번째 배열 차원이 됩니다.

  • fft(X,[],1)X의 열을 따라 동작하고 각 열의 푸리에 변환을 반환합니다.

  • fft(X,[],2)X의 행을 따라 동작하고 각 행의 푸리에 변환을 반환합니다.

dimndims(X)보다 큰 경우 fft(X,[],dim)X를 반환합니다. n이 지정된 경우 fft(X,n,dim)은 차원 dim을 따라 X를 길이 n까지 채우거나 자릅니다.

데이터형: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

출력 인수

모두 축소

주파수 영역 표현으로, 벡터, 행렬, 다차원 배열 중 하나로 반환됩니다.

Xsingle형인 경우 fft는 기본적으로 단정밀도로 계산되며 Y 또한 single형이 됩니다. 그렇지 않으면, Ydouble형으로 반환됩니다.

Y의 크기는 다음과 같습니다.

  • Y = fft(X) 또는 Y = fft(X,[],dim)의 경우 YX의 크기는 같습니다.

  • Y = fft(X,n,dim)의 경우 size(Y,dim)의 값은 n과 같고 다른 모든 차원의 크기는 X 차원의 크기 그대로 유지됩니다.

X가 실수인 경우 Y는 켤레 대칭이고 Y에 있는 고유한 점 개수는 ceil((n+1)/2)입니다.

데이터형: double | single

세부 정보

모두 축소

벡터의 이산 푸리에 변환

Y = fft(X)는 푸리에 변환을 구현하고 X = ifft(Y)는 푸리에 역변환을 구현합니다. 이 변환은 길이 nXY에 대해 다음과 같이 정의됩니다.

Y(k)=j=1nX(j)Wn(j1)(k1)X(j)=1nk=1nY(k)Wn(j1)(k1),

여기서

Wn=e(2πi)/n

은 n개의 단위근 중 하나입니다.

  • fft의 실행 시간은 변환의 길이에 따라 다릅니다. 작은 소인수만으로 이루어진 변환의 길이는 소수이거나 큰 소인수로 이루어진 변환의 길이보다 훨씬 빠르게 실행됩니다.

  • 대부분의 n 값의 경우 실수 입력 DFT는 복소수 입력 DFT의 계산 시간보다 약 2배 더 빠릅니다. 그러나 n이 큰 소인수인 경우 속도 차이는 약간 있거나 아예 없을 수 있습니다.

  • 유틸리티 함수 fftw를 사용하여 fft의 속도를 높일 수 있습니다. 이 함수는 특정 크기와 차원의 FFT를 계산하는 데 사용되는 알고리즘의 최적화를 제어합니다.

알고리즘

FFT 함수(fft, fft2, fftn, ifft, ifft2, ifftn)는 FFTW ,[2] 라이브러리를 기반으로 합니다.

참고 문헌

[2] Frigo, M., and S. G. Johnson. “FFTW: An Adaptive Software Architecture for the FFT.” Proceedings of the International Conference on Acoustics, Speech, and Signal Processing. Vol. 3, 1998, pp. 1381-1384.

확장 기능

GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.

참고 항목

| | | |

R2006a 이전에 개발됨