MATLAB Language
फूरियर रूपांतरण और व्युत्क्रम फूरियर रूपांतरण
खोज…
वाक्य - विन्यास
Y = fft (X)% 256 के डिफ़ॉल्ट ट्रांसफ़ॉर्म लंबाई (वर्जन ऑर्डर करने के लिए) का उपयोग करके वेक्टर या मैट्रिक्स X के FFT की गणना करता है
Y = fft (X, n)% X की FFT की गणना रूपांतरण लंबाई के रूप में n का उपयोग करते हुए करता है, n को 2-शक्ति आधारित संख्या होना चाहिए। यदि X की लंबाई n से कम है, तो Matlab स्वतः X को शून्य के साथ पैड कर देगा जैसे कि लंबाई (X) / n
Y = fft (X, n, मंद)% X के FFT की गणना करता है n के रूप में n का उपयोग आयाम डिम के साथ ट्रांसफॉर्मर लंबाई (क्रमशः क्षैतिज या ऊर्ध्वाधर के लिए 1 या 2 हो सकता है)
Y = fft2 (X)% X के 2D FFT की गणना करें
Y = fftn (X, dim)% X की मंद-आयामी FFT की गणना, आयाम मंद के वेक्टर के संबंध में।
y = ifft (X)% डिफ़ॉल्ट 256 ट्रांसफ़ॉर्म लंबाई का उपयोग करके X (जो कि संख्याओं का एक मैट्रिक्स / वेक्टर है) के व्युत्क्रम की गणना करता है
y = ifft (X, n)% X की IFFT की गणना एन को ट्रांसफॉर्म लेंथ के रूप में करती है
y = ifft (X, n, dim)% X की IFFT की गणना n का उपयोग करता है, जो आयाम मंद से अधिक लंबाई के रूप में होता है (क्रमशः क्षैतिज या ऊर्ध्वाधर के लिए 1 या 2 हो सकता है)
y = ifft (X, n, मंद, 'सममित')% सममित विकल्प Ift को सक्रिय आयाम के साथ संयुग्म सममित के रूप में इलाज करने का कारण बनता है। यह विकल्प तब उपयोगी होता है जब X सममित सममितीय नहीं होता है, केवल गोल-गोल त्रुटि के कारण।
y = ifft2 (X)% X के व्युत्क्रम 2D फुट की गणना करें
y = ifftn (X, dim)% X की व्युत्क्रम मंद-आयामी संगति की गणना करें।
पैरामीटर
पैरामीटर | विवरण |
---|---|
एक्स | यह आपका इनपुट टाइम-डोमेन सिग्नल है, यह न्यूमेरिक्स का वेक्टर होना चाहिए। |
n | यह NFFT पैरामीटर है जिसे ट्रांसफॉर्म लेंथ के रूप में जाना जाता है, इसे अपने FFT रिजल्ट के रिज़ॉल्यूशन के रूप में सोचें, यह एक नंबर होना चाहिए जो 2 की शक्ति है (यानी 64,128,256 ... 2 ^ N) |
धुंधला | यह वह आयाम है जिस पर आप एफएफटी की गणना करना चाहते हैं, 1 का उपयोग करें यदि आप क्षैतिज दिशा में अपने एफएफटी की गणना करना चाहते हैं और 2 यदि आप अपने एफएफटी को ऊर्ध्वाधर दिशा में गणना करना चाहते हैं - ध्यान दें कि यह पैरामीटर आमतौर पर रिक्त रहता है, जैसा कि फ़ंक्शन। अपने वेक्टर की दिशा का पता लगाने में सक्षम। |
टिप्पणियों
मतलाब एफएफटी एक बहुत ही समानांतर प्रक्रिया है जो बड़ी मात्रा में डेटा को संभालने में सक्षम है। यह भी लाभ के लिए GPU का उपयोग कर सकते हैं।
ifft(fft(X)) = X
यदि राउंडिंग एरर छोड़ी जाती है तो उपरोक्त कथन सत्य है।
मतलाब में एक साधारण फूरियर रूपांतरण लागू करें
फूरियर ट्रांसफॉर्म डिजिटल सिग्नल प्रोसेसिंग में संभवत: पहला पाठ है, यह हर जगह एप्लिकेशन है और यह डेटा (सभी क्षेत्रों में) या संकेतों का विश्लेषण करने के लिए एक शक्तिशाली उपकरण है। मतलाब में फूरियर ट्रांसफॉर्म के लिए शक्तिशाली टूलबॉक्स का एक सेट है। इस उदाहरण में, हम एक बुनियादी साइन-वेव सिग्नल का विश्लेषण करने के लिए फूरियर ट्रांसफॉर्म का उपयोग करेंगे और उत्पन्न करेंगे जिसे कभी-कभी पीएफटीएफ का उपयोग करके एक पीरियोडोग्राम के रूप में जाना जाता है:
%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
ध्यान दें कि मैटलैब में फास्ट फूरियर ट्रांसफॉर्म (fft) द्वारा डिसक्रीट फूरियर ट्रांसफॉर्म को लागू किया जाता है, दोनों एक ही परिणाम प्राप्त करेंगे, लेकिन एफएफटी डीएफटी का तेजी से कार्यान्वयन है।
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
यदि हम मटलब में F
खोलते हैं, तो हम पाएंगे कि यह जटिल संख्याओं का एक मैट्रिक्स है, एक वास्तविक भाग और एक काल्पनिक भाग। परिभाषा के अनुसार, मूल समय डोमेन सिग्नल को पुनर्प्राप्त करने के लिए, हमें वास्तविक (जो परिमाण भिन्नता का प्रतिनिधित्व करता है) और काल्पनिक (जो चरण भिन्नता का प्रतिनिधित्व करता है) दोनों की आवश्यकता है, इसलिए समय डोमेन पर लौटने के लिए, किसी को बस यह करना हो सकता है:
TD = ifft(F,NFFT); %Returns the Inverse of F in Time Domain
यहाँ ध्यान दें कि TD लौटा है जिसकी लंबाई 256 होगी क्योंकि हम NFFT को 256 पर सेट करते हैं, हालाँकि, x की लंबाई केवल 64 है, इसलिए Matlab TD के अंत में शून्य को पैड में बदल देगा। उदाहरण के लिए, यदि NFFT 1024 और लंबाई 64 थी, तो TD लौटा 64 + 960 शून्य होगा। यह भी ध्यान दें कि फ्लोटिंग पॉइंट राउंडिंग के कारण, आपको 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
और या तो दोनों या वास्तविक हिस्सा करने के लिए अपने कार्यों लागू होते हैं।
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')
छवियाँ और बहुआयामी एफटी
मेडिकल इमेजिंग, स्पेक्ट्रोस्कोपी, इमेज प्रोसेसिंग, क्रिप्टोग्राफी और विज्ञान और इंजीनियरिंग के अन्य क्षेत्रों में अक्सर ऐसा होता है कि कोई व्यक्ति छवियों के बहुआयामी फूरियर रूपांतरण की गणना करना चाहता है। मतलाब में यह बिल्कुल सीधा है: (बहुआयामी) चित्र केवल n- आयामी मेट्रिसेस हैं, आखिरकार, और फूरियर ट्रांसफॉर्म रैखिक ऑपरेटर हैं: एक बस पुनरावृत्त फूरियर अन्य आयामों के साथ रूपांतरित करता है। Matlab 2-d में ऐसा करने के लिए fft2
और ifft2
प्रदान करता है, या n-आयामों में fftn
।
एक संभावित नुकसान यह है कि छवियों के फूरियर रूपांतरण को आमतौर पर "केंद्रित क्रम" दिखाया जाता है, अर्थात चित्र के मध्य में k- स्थान की उत्पत्ति के साथ। fftshift
फूरियर रूपांतरण के डीसी घटकों के स्थान को उचित रूप से स्वैप करने के लिए fftshift
कमांड प्रदान करता है। यह आदेश संकेतन सामान्य छवि प्रसंस्करण तकनीकों को निष्पादित करने के लिए काफी आसान बनाता है, जिनमें से एक नीचे चित्रित किया गया है।
जीरो फिलिंग
एक छोटी छवि को एक बड़े आकार में प्रक्षेपित करने का एक "त्वरित और गंदा" तरीका है फूरियर को इसे बदलना, पैड फ्यूरर को शून्य के साथ बदलना, और फिर उलटा रूपांतर करना। यह प्रभावी रूप से प्रत्येक पिक्सेल के बीच एक सिनिस आकार के आधार फ़ंक्शन के साथ इंटरपोल करता है, और आमतौर पर कम रिज़ॉल्यूशन वाले मेडिकल इमेजिंग डेटा के लिए उपयोग किया जाता है। आइए एक अंतर्निहित छवि उदाहरण को लोड करके शुरू करें
%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
लिए कि 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 एफटी प्राप्त किया है। इसे शून्य-भरने के लिए, हम प्रत्येक k- स्पेस लेना चाहते हैं, किनारों को शून्य से पैड करते हैं, और फिर बैक ट्रांसफ़ॉर्म लेते हैं:
%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).
इस बिंदु पर, परिणाम काफी निंदनीय है:
एक बार जब हम बैक-ट्रांसफ़ॉर्म लेते हैं, तो हम देख सकते हैं कि (सही ढंग से!) शून्य-भरने वाला डेटा इंटरपोल के लिए एक समझदार तरीका प्रदान करता है:
% 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');
ध्यान दें कि शून्य भरा छवि आकार मूल के दोगुना है। प्रत्येक आयाम में दो के एक कारक से अधिक शून्य को भरा जा सकता है, हालांकि स्पष्ट रूप से ऐसा करने से मनमाने ढंग से एक छवि के आकार में वृद्धि नहीं होती है।
संकेत, टिप्स, 3 डी और उससे आगे
उपरोक्त उदाहरण 3D छवियों के लिए है (जैसा कि अक्सर मेडिकल इमेजिंग तकनीक या उदाहरण के लिए confocal माइक्रोस्कोपी द्वारा उत्पन्न होता है), लेकिन fft2
को fftn(I, 3)
द्वारा प्रतिस्थापित करने की आवश्यकता होती है, उदाहरण के लिए। fftshift(fft(fftshift(...
कई बार) लिखने की कुछ बोझिल प्रकृति के कारण, स्थानीय रूप से आसान सिंटैक्स प्रदान करने के लिए स्थानीय रूप से fft2c
जैसे कार्यों को परिभाषित करना काफी आम है - जैसे:
function y = fft2c(x)
y = fftshift(fft2(fftshift(x)));
ध्यान दें कि एफएफटी तेज है, लेकिन बड़े, बहुआयामी फूरियर रूपांतरण अभी भी एक आधुनिक कंप्यूटर पर समय लगेगा। यह अतिरिक्त रूप से जटिल है: k- अंतरिक्ष की भयावहता ऊपर दिखाई गई थी, लेकिन चरण बिल्कुल महत्वपूर्ण है; छवि डोमेन में अनुवाद फूरियर डोमेन में एक चरण रैंप के बराबर हैं। कई और अधिक जटिल ऑपरेशन हैं जो फूरियर डोमेन में करने की इच्छा कर सकते हैं, जैसे कि उच्च या निम्न स्थानिक आवृत्तियों को फ़िल्टर करना (इसे एक फ़िल्टर के साथ गुणा करके), या शोर के अनुरूप असतत बिंदुओं को मास्क करना। मैटलैब के मुख्य सामुदायिक रिपॉजिटरी साइट, फाइल एक्सचेंज में उपलब्ध सामान्य फूरियर संचालन से निपटने के लिए समुदाय की एक बड़ी मात्रा है।