FFT

FFT

মধ্যম

ভূমিকা

ফুরিয়ে ট্রান্সফর্ম

ফুরিয়ে ট্রান্সফর্ম পদার্থবিজ্ঞান ও গণিতে প্রায়ই দেখা যায়, আর তাই এর দৈনন্দিন ব্যবহারও অনেক।

সংক্ষেপে, ফুরিয়ে ট্রান্সফর্ম একটি ইনপুট সিগন্যাল নেয়, যা প্রায়ই টাইম বা স্পেস ডোমেইনে থাকে, এবং সেটিকে ফ্রিকোয়েন্সি ডোমেইনে রূপান্তর করে। আরও স্পষ্ট করে বললে, ইনপুট সিগন্যালটি যদি বিভিন্ন ফ্রিকোয়েন্সির মিশ্রণ (অর্থাৎ সুপারপজিশন) দিয়ে তৈরি হয়, তবে এই রূপান্তরটি আলাদা আলাদা ফ্রিকোয়েন্সি ছেঁকে বের করে তাদের আপেক্ষিক শক্তি দেখায়।

এ কারণেই এই রূপান্তরটি সিগন্যাল প্রসেসিং (যেমন ফিল্টারিং, কম্প্রেশন ইত্যাদি) এবং ডেটা সায়েন্সের অনেক প্রয়োগে একটি প্রধান হাতিয়ার। তাই এটি প্রথমে যতটা ভাবা যায় তার চেয়ে অনেক বেশি ব্যবহৃত হয়, আর এ কারণেই কাল্পনিক সংখ্যা কোথায় অপরিহার্য হয়ে ওঠে তার একটি উৎকৃষ্ট উদাহরণ এটি, কারণ ফুরিয়ে ট্রান্সফর্মের আউটপুট সাধারণত একটি জটিল সংখ্যা।

ফুরিয়ে ট্রান্সফর্মের একটি ইন্টিগ্রাল রূপ থাকলেও আমরা ডিজিটাল, তাই আমাদের আগ্রহ ডিসক্রিট সংস্করণে। এই রূপান্তরের ডেরিভেশন এই অনুশীলনীর পরিধির বাইরে, তবে ফরওয়ার্ড ডিসক্রিট ট্রান্সফর্ম (ফ্রিকোয়েন্সি ডোমেইনে) দেখতে এমন হয়: Xₖ = Σ xₙ * ℯ^(-2iπk * n/N) এখানে যোগফলটি n-এর ওপর চলে, আর N হলো স্যাম্পলের সংখ্যা, k হলো ফ্রিকোয়েন্সি, i হলো কাল্পনিক একক এবং xₙ হলো একটি আলাদা স্যাম্পল।

ফাস্ট ফুরিয়ে ট্রান্সফর্ম

ফুরিয়ে ট্রান্সফর্ম অত্যন্ত উপযোগী হলেও, সরলভাবে প্রয়োগ করা হলে এটি কিছুটা ধীর (O(n²))। ফাস্ট ফুরিয়ে ট্রান্সফর্ম (FFT) এমন একটি অ্যালগরিদম যা এটিকে নাটকীয়ভাবে দ্রুত করে তোলে। এটি সাধারণত ডিভাইড-অ্যান্ড-কনকার কৌশলের মাধ্যমে করা হয়, যা ফর্মুলেশনটির কিছু সিমেট্রি কাজে লাগায় এবং ফলস্বরূপ অ্যাসিম্পটটিকভাবে O(Nlog(N)) কমপ্লেক্সিটি দেয়। এই গতি বৃদ্ধি এই রূপান্তরের ব্যবহারিক উপযোগিতা ও প্রয়োগের পরিধি অনেক বাড়িয়ে দেয়।

নির্দেশনা

আপনার বন্ধু একজন সাউন্ড ইঞ্জিনিয়ার। তিনি যে মালিকানাধীন সফটওয়্যারটি বানাচ্ছেন, তার জন্য একটি ফুরিয়ার ট্রান্সফর্ম কোড করতে আপনাকে সাহায্য চেয়েছেন। যেহেতু আপনি এটি ঠিকভাবে করতে চান, তাই প্রথমে আপনি ডিসক্রিট ফুরিয়ার ট্রান্সফর্ম (DFT) একেবারে সাদামাটা রূপে ইমপ্লিমেন্ট করবেন। এরপর এটি দিয়ে আপনার চূড়ান্ত লক্ষ্য, অর্থাৎ ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT), সঠিক কি না তা যাচাই করা যাবে।

1. DFT

DFT ইমপ্লিমেন্ট করুন।

লক্ষ্য করুন, এটি O(n²) জটিলতার, কারণ সব n-এর মধ্য দিয়ে একবার চালানোর সময় আপনি একটি k পান, আর আপনার একটি Xₖ ভেক্টর দরকার যা সিগন্যাল Xₙ ভেক্টরের সমান দৈর্ঘ্যের (ইনভার্টিবিলিটির জন্য), তাই n পয়েন্টের মধ্য দিয়ে n বার যাওয়া মানে O(n²)।

2. FFT

FFT ইমপ্লিমেন্ট করুন।

Note

এই অ্যালগরিদমের সূক্ষ্ম বিবরণ সম্পর্কে আরও জানার জন্য অনেক রিসোর্স আছে, তাই নির্দ্বিধায় একটু গবেষণা করে দেখুন।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Julia Exercism

FFT শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Julia ট্র্যাকের 35টি কনসেপ্ট128টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।