DSP কী এবং কেন এটি গুরুত্বপূর্ণ
এই পাঠে যা শিখবেন
- Digital Signal Processing-এর সংজ্ঞা এবং কেন প্রতিটি ডিজিটাল ডিভাইস আসলে সংখ্যার সিরিজ নিয়ে কাজ করে
- কেন সঠিক স্যাম্পল রেট বেছে নেওয়া একটি জটিল, অপরিবর্তনীয় সিদ্ধান্ত
- এই কোর্স ঠিক কী কভার করে ও কীভাবে সাজানো হয়েছে
- একটি সত্যিকারের, চলমান ডেমো — অ্যালিয়াসিং কীভাবে দুটো সম্পূর্ণ ভিন্ন ফ্রিকোয়েন্সিকে সংখ্যাগতভাবে অভিন্ন করে তোলে
১ · Digital Signal Processing কী
Digital Signal ProcessingDigital Signal Processingবাস্তব-বিশ্বের সিগন্যালকে সংখ্যার একটি ডিসক্রিট সিরিজ হিসেবে ধরে সেই সংখ্যাগুলোর উপর গাণিতিক অপারেশন চালিয়ে তথ্য বের করা, নয়েজ সরানো, বা রূপান্তর করার বিজ্ঞান। হলো এমন একটি ক্ষেত্র যেখানে শব্দ, আলো, তাপমাত্রা বা যেকোনো ক্রমাগত-পরিবর্তনশীল (continuous) ভৌত রাশিকে নির্দিষ্ট সময়ের ব্যবধানে স্যাম্পল করে সংখ্যার একটি তালিকায় রূপান্তর করা হয় — আর তারপর সেই তালিকার উপর অ্যালগরিদম চালিয়ে ফিল্টার, বিশ্লেষণ, কমপ্রেস বা রূপান্তর করা হয়। আপনার ফোনের কল, মিউজিক প্লেয়ার, WiFi, এমনকি হার্ট-রেট সেন্সর — সবকিছুর ভেতরেই DSP কাজ করছে।
২ · কেন এটি বিশেষভাবে গুরুত্বপূর্ণ
একটি ডিজিটাল ডিভাইসের কাছে "শব্দ" মানে বাতাসের কম্পন নয় — এটি একটি Python
list-এর মতো সংখ্যার একটি সিরিজ। DSP মূলত সেই তালিকার উপর গণিত।একবার ভুল স্যাম্পল রেটে একটি সিগন্যাল রেকর্ড হয়ে গেলে, সেই ভুল তথ্য ডেটা থেকে আর ফিরিয়ে আনা যায় না — এটাই অ্যালিয়াসিং, নিচের ডেমোতে সত্যিকারের গণনা দিয়ে দেখানো হয়েছে।
DSP-এর বেশিরভাগ শক্তি আসে সিগন্যালকে ফ্রিকোয়েন্সি-ডোমেইনে দেখা থেকে (M5-M6-এ DFT/FFT) — কোন ফ্রিকোয়েন্সি রাখবেন, কোনটি সরাবেন, তা বোঝাই ফিল্টার ডিজাইনের (M7-M8) মূল কাজ।
Numerical Methods কোর্স সাধারণ সংখ্যাগত অ্যালগরিদম (রুট-ফাইন্ডিং, ইন্টিগ্রেশন, ODE সলভিং) নিয়ে কাজ করে — এই কোর্স সেই একই "হাতে-লেখা, কোনো লাইব্রেরি ছাড়া" দর্শন নিয়ে, কিন্তু নির্দিষ্টভাবে সিগন্যাল ও সিস্টেমের প্রশ্নে ফোকাস করে (FFT, যা M6-এ কভার হবে, আসলে একটি নিউমেরিক্যাল অ্যালগরিদম)। Math for AI & ML কমপ্লেক্স সংখ্যা ও ট্রিগোনোমেট্রির ভিত্তি দেয় — এই কোর্স সেই ভিত্তির উপর সিগন্যাল-প্রসেসিং-নির্দিষ্ট প্রয়োগ যোগ করে।
৩ · একটি সত্যিকারের ডেমো — অ্যালিয়াসিং
ধরা যাক একটি সিগন্যাল আসলে ৪৫ Hz-এ কম্পিত হচ্ছে, কিন্তু আমরা এটিকে মাত্র ৫০ Hz রেটে স্যাম্পল করছি (যা M2-এ শেখা নাইকুইস্ট থিওরেম অনুযায়ী অনেক কম — নিরাপদ হতে হলে অন্তত ৯০ Hz দরকার)। নিচের কোড সেলে দেখা যাক ৪৫ Hz সিগন্যালের স্যাম্পলগুলো আসলে কেমন দেখতে হয়ে যায়।
import math
fs = 50.0 # স্যাম্পল রেট (Hz)
f_true = 45.0 # প্রকৃত সিগন্যাল ফ্রিকোয়েন্সি (Hz)
N = 10 # কতগুলো স্যাম্পল নেওয়া হবে
# প্রকৃত সিগন্যাল থেকে সরাসরি স্যাম্পল নেওয়া
samples_true = [math.sin(2 * math.pi * f_true * n / fs) for n in range(N)]
# "ফোল্ডেড" (aliased) ফ্রিকোয়েন্সি -- সাইন-তরঙ্গ পর্যায়ক্রমিক বলে
# f_true-কে fs-এর নিকটতম গুণিতক থেকে বিয়োগ করলে যে ফ্রিকোয়েন্সি পাওয়া যায়
# সেটাতে স্যাম্পল নিলেও ঠিক একই সংখ্যা পাওয়া যায়
k = round(f_true / fs)
f_alias = f_true - k * fs
samples_alias = [math.sin(2 * math.pi * f_alias * n / fs) for n in range(N)]
print(f"প্রকৃত ফ্রিকোয়েন্সি: {f_true} Hz, স্যাম্পল রেট: {fs} Hz (নাইকুইস্ট সীমা {fs/2} Hz-এর অনেক উপরে!)")
print(f"অ্যালিয়াসড ফ্রিকোয়েন্সি: {f_alias} Hz (মান হিসেবে |{f_alias}| = {abs(f_alias)} Hz)")
print()
print(f"{'n':>3} | {'true (45Hz)':>12} | {'alias signal':>13} | {'পার্থক্য':>10}")
max_diff = 0.0
for n in range(N):
diff = abs(samples_true[n] - samples_alias[n])
max_diff = max(max_diff, diff)
print(f"{n:>3} | {samples_true[n]:>12.6f} | {samples_alias[n]:>13.6f} | {diff:>10.2e}")
print()
print(f"সর্বোচ্চ পার্থক্য (সবগুলো স্যাম্পল মিলিয়ে): {max_diff:.2e}")
−5 Hz-এ জেনারেট করা সাইন-তরঙ্গের স্যাম্পলগুলো ৪৫ Hz সিগন্যালের স্যাম্পলের সাথে সর্বোচ্চ মাত্র
১.৫৫ × ১০⁻¹⁵ পার্থক্যে (অর্থাৎ ফ্লোটিং-পয়েন্ট নির্ভুলতার সীমায়, বাস্তবে শূন্য) মিলে যায়!
অর্থাৎ ৫০ Hz-এ স্যাম্পল করার পর, একটি ৪৫ Hz সিগন্যাল আর একটি (ফেজ-উল্টানো) ৫ Hz সিগন্যাল —
সংখ্যাগতভাবে সম্পূর্ণ অভিন্ন। শুধু স্যাম্পলগুলো দেখে কোনোভাবেই বলা সম্ভব নয় আসল সিগন্যাল
কোনটি ছিল — এই তথ্যের ক্ষতি স্থায়ী, এবং এটাই অ্যালিয়াসিং।
DSP মানে শুধু "সিগন্যালের উপর কোড চালানো" নয় — এর জন্য দরকার সিস্টেমেটিক চিন্তা: স্যাম্পল রেট কী হওয়া উচিত, ফ্রিকোয়েন্সি-ডোমেইনে সিগন্যাল কেমন দেখতে, এবং কোন তথ্য একবার হারিয়ে গেলে আর ফিরিয়ে আনা যায় না। এই কোর্স ধাপে ধাপে — স্যাম্পলিং থিওরেম থেকে কনভোলিউশন, Z-ট্রান্সফর্ম, DFT/FFT, এবং ফিল্টার ডিজাইন পর্যন্ত — এই সিস্টেমেটিক টুলকিট শেখাবে, প্রতিটি ধাপ সত্যিকারের গণনা দিয়ে যাচাই করে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ উপরের ডেমোতে ৪৫ Hz আর ৫ Hz সিগন্যালের স্যাম্পল সংখ্যাগতভাবে অভিন্ন। এর মানে কি এই দুটো সিগন্যাল আসলে "একই"? সমস্যাটা ঠিক কোথায়?
না, দুটো সিগন্যাল সম্পূর্ণ ভিন্ন — একটি দ্রুত কম্পিত হচ্ছে, একটি ধীরে। সমস্যা হলো স্যাম্পলিং প্রক্রিয়াটি এই পার্থক্যটি ধ্বংস করে দিয়েছে — একবার শুধু ডিসক্রিট স্যাম্পলগুলো হাতে থাকলে, কোনো অ্যালগরিদম দিয়েই বলা সম্ভব নয় আসল সিগন্যাল ৪৫ Hz ছিল নাকি ৫ Hz। এই তথ্যের ক্ষতি ঘটে স্যাম্পলিং মুহূর্তেই, প্রসেসিং-এর সময় নয় — তাই সমাধানও স্যাম্পলিং-এর আগেই করতে হয় (M2-এ বিস্তারিত)।
প্র ০২ যদি স্যাম্পল রেট বাড়িয়ে ৫০ Hz থেকে ২০০ Hz করা হতো, তাহলে কি ৪৫ Hz সিগন্যালটি এখনও কোনো নিম্ন ফ্রিকোয়েন্সির মতো দেখতে হতো?
না। কোডের সূত্র অনুযায়ী k = round(f_true / fs) — fs = 200 Hz হলে
k = round(45/200) = round(0.225) = 0, তাই f_alias = 45 - 0×200 = 45 Hz —
অর্থাৎ কোনো ফোল্ডিং হয় না, সিগন্যাল তার নিজের প্রকৃত ফ্রিকোয়েন্সিতেই থাকে। এটাই নাইকুইস্ট থিওরেমের
মূল কথা: fs যথেষ্ট বড় হলে (M2-এ প্রমাণসহ, সাধারণত fs > 2×f_max) অ্যালিয়াসিং ঘটে না।
প্র ০৩ বাস্তব জীবনে অ্যালিয়াসিং-এর একটি পরিচিত উদাহরণ হলো ভিডিওতে দ্রুত ঘোরা চাকা উল্টো দিকে ঘুরছে মনে হওয়া। এটি কীভাবে এই একই ঘটনার একটি রূপ?
একটি ক্যামেরা প্রতি সেকেন্ডে নির্দিষ্টসংখ্যক ফ্রেম "স্যাম্পল" নেয় (যেমন ৩০ fps)। চাকার ঘূর্ণন-হার যদি এই ফ্রেম-রেটের তুলনায় যথেষ্ট বেশি হয়, তাহলে ফ্রেমগুলোর মধ্যে চাকা প্রায় এক পূর্ণ ঘূর্ণনের কাছাকাছি ঘুরে যায়, আর মস্তিষ্ক সেটিকে একটি অনেক ধীর (এমনকি উল্টো দিকের) ঘূর্ণন হিসেবে ব্যাখ্যা করে — ঠিক যেমন উপরের ডেমোতে ৪৫ Hz-কে ৫ Hz মনে হচ্ছিল। "সময়" এখানে চাকার কোণ, আর "ফ্রেম রেট" এখানে fs।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
f_true = 45.0-কেf_true = 65.0-এ বদলালে (fs = 50 Hz অপরিবর্তিত রেখে) অ্যালিয়াসড ফ্রিকোয়েন্সি কত হবে বলে আপনার ধারণা? সূত্রটি (k = round(f_true/fs),f_alias = f_true - k×fs) ব্যবহার করে নিজে হিসেব করার চেষ্টা করুন।k = round(65/50) = round(1.3) = 1, তাইf_alias = 65 - 1×50 = 15Hz। অর্থাৎ ৬৫ Hz সিগন্যালটি ১৫ Hz সিগন্যালের মতো দেখতে হয়ে যাবে। -
পরীক্ষা করুন: উপরের কোড সেলে
f_true = 45.0-কেf_true = 65.0-এ পরিবর্তন করে Run চেপে আপনার হিসেব যাচাই করুন।রান করলে সত্যিই
f_alias = 15.0Hz দেখাবে, এবং সর্বোচ্চ পার্থক্য আবার ফ্লোটিং-পয়েন্ট নির্ভুলতার সীমায় (প্রায় ৮.৫৫ × ১০⁻¹⁵) থাকবে — অর্থাৎ ৬৫ Hz আর ১৫ Hz সিগন্যালও এই স্যাম্পল রেটে সংখ্যাগতভাবে অভিন্ন। লক্ষ্য করুন এবার কোনো ফেজ-উল্টানো (ঋণাত্মক চিহ্ন) দরকার হয়নি, কারণf_aliasএখানে সরাসরি ধনাত্মক (১৫) — অ্যালিয়াসিং কখন ফেজ উল্টে দেয় আর কখন দেয় না, তা নির্ভর করেk-এর মানের উপর, যা M2-এ বিস্তারিত ব্যাখ্যা করা হবে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- Numerical Methods কোর্স সহোদর কোর্স সাধারণ সংখ্যাগত অ্যালগরিদম, রুট-ফাইন্ডিং, ইন্টিগ্রেশন ও ODE সলভিং-এর গভীর কভারেজ — এই কোর্স সেই একই "হাতে-লেখা" দর্শনের উপর সিগন্যাল-প্রসেসিং-নির্দিষ্ট দিকটি যোগ করে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।