수색…


통사론

  1. Y = fft (X) %는 벡터 또는 행렬 X의 FFT를 기본 변형 길이 256 (버전 확인)을 사용하여 계산합니다.

  2. Y = fft (X, n) %는 Transform Length로 n을 사용하는 X의 FFT를 계산합니다. n은 2 기반의 숫자 여야합니다. X의 길이가 n보다 작은 경우, Matlab은 X에 0을 자동으로 덧붙여서 length (X) = n

  3. Y = fft (X, n, dim) %는 치수 dim을 따라 n을 Transform Length로 사용하는 X의 FFT를 계산합니다 (수평 또는 수직 각각 1 또는 2 일 수 있음)

  4. Y = fft2 (X) % X의 2D FFT를 계산합니다.

  5. Y = fftn (X, dim) % Dim 차원 벡터에 대해 X의 dim 차원 FFT를 계산합니다.

  6. y = ifft (X) %는 X의 FFT of Inverse (숫자의 행렬 / 벡터 임)를 계산합니다. 기본 256 Transform Length

  7. y = ifft (X, n) %는 n을 Transform Length로 사용하여 X의 IFFT를 계산합니다.

  8. y = ifft (X, n, dim) %는 차원 dim에 대해 변환 길이로 n을 사용하는 X의 IFFT를 계산합니다 (각각 수평 또는 수직의 경우 1 또는 2 일 수 있음)

  9. y = ifft (X, n, 희미한, '대칭') % 대칭 옵션을 사용하면 ifft가 X를 활성 치수를 따라 대칭 공액으로 처리합니다. 이 옵션은 반올림 오류만으로 X가 정확하게 공액 대칭이 아닌 경우 유용합니다.

  10. y = ifft2 (X) % X의 역 2D ft를 계산합니다.

  11. 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

5 가지 실현의주기 표

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은 fft2ifft2 를 제공하여 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

Coins.png

우리는 이제 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). 

k 공간

이제 예제 이미지의 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). 

이 시점에서 결과는 상당히 눈에 띄지 않습니다.

제로 - 채워진 k- 스페이스

역변환을 취하면 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 이미지 (예 : 의료 영상 기술 또는 공 촛점 현미경으로 생성되는 경우가 많지만)에 적용되지만 fft2fftn(I, 3) 으로 대체해야합니다. fftshift(fft(fftshift(... 여러 번, 로컬에서 fft2c 와 같은 함수를 로컬에서 쉽게 구문을 제공하도록 정의하는 것은 매우 일반적입니다.

function y = fft2c(x)

y = fftshift(fft2(fftshift(x)));

FFT는 빠르지 만 대규모의 다차원 푸리에 변환은 최신 컴퓨터에서 여전히 시간이 걸립니다. 또한 본질적으로 복잡합니다. k- 공간의 크기는 위에 표시되었지만 위상은 절대적으로 중요합니다. 이미지 도메인의 변환은 푸리에 도메인의 위상 램프와 동일합니다. 푸리에 도메인에서 높은 또는 낮은 공간 주파수를 필터링 (필터를 곱함으로써)하거나 ​​노이즈에 해당하는 이산 포인트를 마스킹하는 것과 같이 훨씬 복잡한 작업이 몇 가지 있습니다. 이에 따라 Matlab의 주요 커뮤니티 저장소 사이트 인 File Exchange 에서 사용할 수있는 공통 푸리에 연산을 처리하기위한 커뮤니티 생성 코드가 대량으로 생성됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow