MATLAB Language
푸리에 변환 및 역 푸리에 변환
수색…
통사론
Y = fft (X) %는 벡터 또는 행렬 X의 FFT를 기본 변형 길이 256 (버전 확인)을 사용하여 계산합니다.
Y = fft (X, n) %는 Transform Length로 n을 사용하는 X의 FFT를 계산합니다. n은 2 기반의 숫자 여야합니다. X의 길이가 n보다 작은 경우, Matlab은 X에 0을 자동으로 덧붙여서 length (X) = n
Y = fft (X, n, dim) %는 치수 dim을 따라 n을 Transform Length로 사용하는 X의 FFT를 계산합니다 (수평 또는 수직 각각 1 또는 2 일 수 있음)
Y = fft2 (X) % X의 2D FFT를 계산합니다.
Y = fftn (X, dim) % Dim 차원 벡터에 대해 X의 dim 차원 FFT를 계산합니다.
y = ifft (X) %는 X의 FFT of Inverse (숫자의 행렬 / 벡터 임)를 계산합니다. 기본 256 Transform Length
y = ifft (X, n) %는 n을 Transform Length로 사용하여 X의 IFFT를 계산합니다.
y = ifft (X, n, dim) %는 차원 dim에 대해 변환 길이로 n을 사용하는 X의 IFFT를 계산합니다 (각각 수평 또는 수직의 경우 1 또는 2 일 수 있음)
y = ifft (X, n, 희미한, '대칭') % 대칭 옵션을 사용하면 ifft가 X를 활성 치수를 따라 대칭 공액으로 처리합니다. 이 옵션은 반올림 오류만으로 X가 정확하게 공액 대칭이 아닌 경우 유용합니다.
y = ifft2 (X) % X의 역 2D ft를 계산합니다.
y = ifftn (X, dim) % X의 역 dim-dimensional fft를 계산합니다.
매개 변수
매개 변수 | 기술 |
---|---|
엑스 | 이것은 당신의 입력 시간 - 도메인 신호입니다, 그것은 숫자의 벡터 여야합니다. |
엔 | 이것은 Transform Length로 알려진 NFFT 파라미터입니다. FFT 결과의 해상도라고 생각하면 2의 거듭 제곱 수 (즉, 64,128,256 ... 2 ^ N) 여야합니다. |
어둑한 | 이것은 FFT를 계산할 차원입니다. 수평 방향으로 FFT를 계산하려면 1을 사용하고 수직 방향으로 FFT를 계산하려면 2를 사용하십시오. -이 매개 변수는 대개 공백으로 남겨 둡니다. 함수는 다음과 같습니다. 벡터의 방향을 감지 할 수 있습니다. |
비고
Matlab FFT는 대용량 데이터를 처리 할 수있는 매우 병렬화 된 프로세스입니다. 또한 GPU를 사용하여 큰 이점을 얻을 수 있습니다.
ifft(fft(X)) = X
위의 문장은 반올림 오류가 생략 된 경우 true입니다.
Matlab에서 간단한 푸리에 변환 구현
푸리에 변환 (Fourier Transform)은 아마도 디지털 신호 처리의 첫 번째 교훈 일 것입니다. 응용 프로그램이 어디 에나 있으며 모든 분야의 데이터 또는 신호를 분석 할 때 강력한 도구입니다. Matlab에는 푸리에 변환을위한 강력한 도구 상자 세트가 있습니다. 이 예제에서는 Fourier Transform을 사용하여 기본 사인파 신호를 분석하고 FFT를 사용하여 Periodogram으로 알려진 것을 생성합니다.
%Signal Generation
A1=10; % Amplitude 1
A2=10; % Amplitude 2
w1=2*pi*0.2; % Angular frequency 1
w2=2*pi*0.225; % Angular frequency 2
Ts=1; % Sampling time
N=64; % Number of process samples to be generated
K=5; % Number of independent process realizations
sgm=1; % Standard deviation of the noise
n=repmat([0:N-1].',1,K); % Generate resolution
phi1=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 1
phi2=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 2
x=A1*sin(w1*n*Ts+phi1)+A2*sin(w2*n*Ts+phi2)+sgm*randn(N,K); % Resulting Signal
NFFT=256; % FFT length
F=fft(x,NFFT); % Fast Fourier Transform Result
Z=1/N*abs(F).^2; % Convert FFT result into a Periodogram
Discrete Fourier Transform은 Matlab의 Fast Fourier Transform (fft)에 의해 구현되지만 둘 다 동일한 결과를 산출하지만 FFT는 DFT를 빠르게 구현한다는 점에 유의하십시오.
figure
w=linspace(0,2,NFFT);
plot(w,10*log10(Z)),grid;
xlabel('w [\pi rad/s]')
ylabel('Z(f) [dB]')
title('Frequency Range: [ 0 , \omega_s ]')
역 푸리에 변환
푸리에 변환의 주요 이점 중 하나는 정보를 잃지 않고 시간 영역으로 역전 할 수 있다는 것입니다. 앞의 예제에서 사용한 것과 동일한 신호를 고려해 보겠습니다.
A1=10; % Amplitude 1
A2=10; % Amplitude 2
w1=2*pi*0.2; % Angular frequency 1
w2=2*pi*0.225; % Angular frequency 2
Ts=1; % Sampling time
N=64; % Number of process samples to be generated
K=1; % Number of independent process realizations
sgm=1; % Standard deviation of the noise
n=repmat([0:N-1].',1,K); % Generate resolution
phi1=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 1
phi2=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 2
x=A1*sin(w1*n*Ts+phi1)+A2*sin(w2*n*Ts+phi2)+sgm*randn(N,K); % Resulting Signal
NFFT=256; % FFT length
F=fft(x,NFFT); % FFT result of time domain signal
Matlab에서 F
를 열면 복소수의 행렬, 즉 실수 부와 허수 부인 행렬이라는 것을 알 수 있습니다. 원래 Time Domain 신호를 복구하려면 Real (크기 변화를 나타냄)과 Imaginary (위상 변화를 나타냄)가 모두 필요하므로 시간 도메인으로 돌아가려면 간단하게 다음 작업을 수행 할 수 있습니다.
TD = ifft(F,NFFT); %Returns the Inverse of F in Time Domain
여기서 우리는 NFFT를 256으로 설정했기 때문에 반환 된 TD는 길이가 256이지만, x의 길이는 64이므로 Matlab은 TD 변환의 끝에 0을 덧붙일 것입니다. 예를 들어 NFFT가 1024이고 길이가 64 인 경우 리턴 된 TD는 64 + 960 0이됩니다. 또한 부동 소수점 반올림으로 인해 3.1 * 10e-20과 같은 것을 얻을 수 있지만 일반적으로는 다음과 같은 점에 유의하십시오. 모든 X의 경우 ifft (fft (X))는 반올림 오류 내에서 X와 같습니다.
변형 된 후에 우리는 무언가를했고 FFT의 진짜 부분 만 남겨 두었습니다.
R = real(F); %Give the Real Part of the FFT
TDR = ifft(R,NFFT); %Give the Time Domain of the Real Part of the FFT
이것은 우리가 FFT의 허수 부 분을 잃고 있다는 것을 의미하며, 따라서이 역 과정에서 정보를 잃어 버리게됩니다. 정보를 잃지 않고 원본을 보존하려면 imag
사용하여 FFT의 허수 부 분을 유지하고 함수를 두 부분 또는 실제 부분에 적용해야합니다.
figure
subplot(3,1,1)
plot(x);xlabel('time samples');ylabel('magnitude');title('Original Time Domain Signal')
subplot(3,1,2)
plot(TD(1:64));xlabel('time samples');ylabel('magnitude');title('Inverse Fourier Transformed - Time Domain Signal')
subplot(3,1,3)
plot(TDR(1:64));xlabel('time samples');ylabel('magnitude');title('Real part of IFFT transformed Time Domain Signal')
이미지 및 다차원 FT
의학 이미징, 분광학, 이미지 처리, 암호학 및 과학 및 공학의 다른 분야에서는 이미지의 다차원 푸리에 변환을 계산하려는 경우가 종종 있습니다. 이것은 Matlab에서 매우 직관적입니다. (다차원) 이미지는 결국 n 차원 행렬이며, 푸리에 변환은 선형 연산자입니다. 하나는 반복적으로 다른 치수를 따라 푸리에 변환입니다. Matlab은 fft2
와 ifft2
를 제공하여 2-d에서, 또는 fftn
을 n 차원에서 수행합니다.
하나의 잠재적 인 함정은 이미지의 푸리에 변환이 일반적으로 그림의 가운데에 k- 공간의 원점과 함께 "중심 정렬"으로 표시된다는 것입니다. Matlab은 푸리에 변환의 DC 구성 요소의 위치를 적절히 바꿀 수있는 fftshift
명령을 제공합니다. 이 순서 표기법을 사용하면 일반적인 이미지 처리 기술을 수행하는 것이 훨씬 쉬워지며 그 중 하나가 아래에 나와 있습니다.
제로 충전
작은 이미지를 더 큰 크기로 보간하는 "빠르고 더러운"방법 중 하나는이를 푸리에 변환하고, 푸리에 변환을 0으로 채운 다음 역변환을 취하는 것입니다. 이것은 sinc 모양의 기저 함수로 각 픽셀 사이를 효과적으로 보간하고 저해상도 의료 영상 데이터를 업 스케일하는 데 일반적으로 사용됩니다. 내장 된 이미지 예제를로드하여 시작하겠습니다.
%Load example image
I=imread('coins.png'); %Load example data -- coins.png is builtin to Matlab
I=double(I); %Convert to double precision -- imread returns integers
imageSize = size(I); % I is a 246 x 300 2D image
%Display it
imagesc(I); colormap gray; axis equal;
%imagesc displays images scaled to maximum intensity
우리는 이제 I의 푸리에 변환을 얻을 수 있습니다. fftshift
일을 설명하기 위해 두 가지 방법을 비교해 보겠습니다.
% Fourier transform
%Obtain the centric- and non-centric ordered Fourier transform of I
k=fftshift(fft2(fftshift(I)));
kwrong=fft2(I);
%Just for the sake of comparison, show the magnitude of both transforms:
figure; subplot(2,1,1);
imagesc(abs(k),[0 1e4]); colormap gray; axis equal;
subplot(2,1,2);
imagesc(abs(kwrong),[0 1e4]); colormap gray; axis equal;
%(The second argument to imagesc sets the colour axis to make the difference clear).
이제 예제 이미지의 2D FT를 얻었습니다. 이 값을 0으로 채우려면 각 k 공간을 가져 와서 가장자리를 0으로 채운 다음 역변환을 수행해야합니다.
%Zero fill
kzf = zeros(imageSize .* 2); %Generate a 492x600 empty array to put the result in
kzf(end/4:3*end/4-1,end/4:3*end/4-1) = k; %Put k in the middle
kzfwrong = zeros(imageSize .* 2); %Generate a 492x600 empty array to put the result in
kzfwrong(end/4:3*end/4-1,end/4:3*end/4-1) = kwrong; %Put k in the middle
%Show the differences again
%Just for the sake of comparison, show the magnitude of both transforms:
figure; subplot(2,1,1);
imagesc(abs(kzf),[0 1e4]); colormap gray; axis equal;
subplot(2,1,2);
imagesc(abs(kzfwrong),[0 1e4]); colormap gray; axis equal;
%(The second argument to imagesc sets the colour axis to make the difference clear).
이 시점에서 결과는 상당히 눈에 띄지 않습니다.
역변환을 취하면 zero-filling 데이터가 올바른 방법으로 보간법을 제공한다는 것을 알 수 있습니다.
% Take the back transform and view
Izf = fftshift(ifft2(ifftshift(kzf)));
Izfwrong = ifft2(kzfwrong);
figure; subplot(1,3,1);
imagesc(abs(Izf)); colormap gray; axis equal;
title('Zero-filled image');
subplot(1,3,2);
imagesc(abs(Izfwrong)); colormap gray; axis equal;
title('Incorrectly zero-filled image');
subplot(1,3,3);
imagesc(I); colormap gray; axis equal;
title('Original image');
set(gcf,'color','w');
제로로 채워진 이미지 크기는 원래 크기의 두 배입니다. 분명히 이렇게하는 것이 이미지의 크기를 임의로 늘리지는 않지만, 각 차원에서 2의 인수보다 더 많이 채울 수 있습니다.
힌트, 팁, 3D 및 그 이상
위의 예는 3D 이미지 (예 : 의료 영상 기술 또는 공 촛점 현미경으로 생성되는 경우가 많지만)에 적용되지만 fft2
는 fftn(I, 3)
으로 대체해야합니다. fftshift(fft(fftshift(...
여러 번, 로컬에서 fft2c
와 같은 함수를 로컬에서 쉽게 구문을 제공하도록 정의하는 것은 매우 일반적입니다.
function y = fft2c(x)
y = fftshift(fft2(fftshift(x)));
FFT는 빠르지 만 대규모의 다차원 푸리에 변환은 최신 컴퓨터에서 여전히 시간이 걸립니다. 또한 본질적으로 복잡합니다. k- 공간의 크기는 위에 표시되었지만 위상은 절대적으로 중요합니다. 이미지 도메인의 변환은 푸리에 도메인의 위상 램프와 동일합니다. 푸리에 도메인에서 높은 또는 낮은 공간 주파수를 필터링 (필터를 곱함으로써)하거나 노이즈에 해당하는 이산 포인트를 마스킹하는 것과 같이 훨씬 복잡한 작업이 몇 가지 있습니다. 이에 따라 Matlab의 주요 커뮤니티 저장소 사이트 인 File Exchange 에서 사용할 수있는 공통 푸리에 연산을 처리하기위한 커뮤니티 생성 코드가 대량으로 생성됩니다.