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

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

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

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

이제, 손상되지 않은 원래 신호의 푸리에 변환을 사용하여 정확한 진폭 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)|')

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

신호 파라미터와 가우스 펄스 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)')

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

n = 2^nextpow2(L);

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

Y = fft(X,n);

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

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

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

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

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

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

각 행이 스케일링된 주파수의 코사인파를 나타내는 행렬을 만듭니다. 결과값 X는 3x1000 행렬이 됩니다. 첫 번째 행의 파동 주파수는 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

알고리즘 성능을 위해 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

입력 인수

모두 축소

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

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

데이터형: 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 [1],[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.

확장 기능

참고 항목

| | | |

R2006a 이전에 개발됨