পাঠ ০৩ · ৫৭-এর মধ্যে · মডিউল ১
Home / Courses / Digital Signal Processing / ফাউন্ডেশন

সিগন্যাল শ্রেণীবিভাগ — পর্যায়বৃত্ত, এনার্জি/পাওয়ার, জোড়/বিজোড়

Signal classification — periodic, energy/power, even/odd
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • পর্যায়বৃত্ত (periodic) ও অ-পর্যায়বৃত্ত (aperiodic) সিগন্যালের সংজ্ঞা এবং কোডে তা পরীক্ষা করার পদ্ধতি
  • এনার্জি ও পাওয়ার সিগন্যালের পার্থক্য এবং তাদের গাণিতিক সংজ্ঞা
  • জোড় (even) ও বিজোড় (odd) সিগন্যালের সিমেট্রি শর্ত এবং সরাসরি ইনডেক্স-তুলনা দিয়ে তা যাচাই
  • চারটি ভিন্ন সিন্থেটিক উদাহরণ সিগন্যালে এই বৈশিষ্ট্যগুলো সত্যিকারের কোড দিয়ে গণনা করে দেখা

১ · পর্যায়বৃত্ত বনাম অ-পর্যায়বৃত্ত সিগন্যাল

একটি ডিসক্রিট সিগন্যাল $x[n]$ কে পর্যায়বৃত্ত (periodic)Periodic signalএমন একটি সিগন্যাল যার জন্য একটি ধনাত্মক পূর্ণসংখ্যা $N$ আছে যেন সব $n$-এর জন্য $x[n] = x[n+N]$ — সবচেয়ে ছোট এমন $N$-কে ফান্ডামেন্টাল পিরিয়ড বলে। বলা হয় যদি এমন একটি ধনাত্মক পূর্ণসংখ্যা $N$ থাকে যেন

$$x[n] = x[n+N] \quad \text{সব } n \text{-এর জন্য}$$

সবচেয়ে ছোট এমন $N$-কে ফান্ডামেন্টাল পিরিয়ড বলা হয়। গুরুত্বপূর্ণ ব্যাপার হলো — এটি "মনে হয় পর্যায়বৃত্ত" বলে ধরে নেওয়ার বিষয় নয়; কোডে এটি সরাসরি পরীক্ষা করা সম্ভব, প্রতিটি $n$-এর জন্য $x[n]$ আর $x[n+N]$ তুলনা করে (ফ্লোটিং-পয়েন্ট গণনায় সামান্য টলারেন্স — যেমন $10^{-9}$ — রাখতে হয়, কারণ math.sin-এর মতো ফাংশন হুবহু শূন্য পার্থক্য না-ও দিতে পারে)।

২ · এনার্জি বনাম পাওয়ার সিগন্যাল

একটি সিগন্যালের মোট এনার্জি সংজ্ঞায়িত হয় $E = \sum_{n=-\infty}^{\infty} |x[n]|^2$ হিসেবে, আর গড় পাওয়ার সংজ্ঞায়িত হয় সসীম দৈর্ঘ্যের একটি জানালার উপর এই যোগফলের গড় হিসেবে। দুটো গুরুত্বপূর্ণ শ্রেণী:

এনার্জি সিগন্যাল
মোট এনার্জি $E$ সসীম (এবং তাই গড় পাওয়ার শূন্য)। যেমন একটি ক্ষয়িষ্ণু এক্সপোনেনশিয়াল যা $n \to \infty$-এ শূন্যের দিকে যায়।
পাওয়ার সিগন্যাল
মোট এনার্জি অসীম, কিন্তু গড় পাওয়ার সসীম ও নন-জিরো। যেমন একটি চিরস্থায়ী (কখনো শেষ না-হওয়া) সাইন-তরঙ্গ — প্রতি পিরিয়ডে একই এনার্জি যোগ হতেই থাকে।

বাস্তবে কোনো সিগন্যাল সত্যিকার অর্থে "অসীম দৈর্ঘ্যের" হতে পারে না — তাই কোডে আমরা একটি সসীম উইন্ডোর উপর এনার্জি ($\sum |x[n]|^2$) বা এক পিরিয়ডের গড় পাওয়ার গণনা করে এই শ্রেণীর ধারণাটি অনুকরণ করি।

৩ · জোড় ও বিজোড় সিগন্যাল

সময়-অক্ষে ঋণাত্মক ইনডেক্সও ধরলে (যেমন $n = -3, -2, -1, 0, 1, 2, 3$), একটি সিগন্যাল জোড় (even) হয় যদি $x[n] = x[-n]$ (মূল বিন্দুর সাপেক্ষে প্রতিসম), আর বিজোড় (odd) হয় যদি $x[n] = -x[-n]$ (মূল বিন্দুর সাপেক্ষে প্রতি-প্রতিসম, এবং তাই $x[0] = 0$ বাধ্যতামূলক)। কোডে এটি পরীক্ষা করার সবচেয়ে সহজ উপায় হলো একটি তালিকার মাঝখানে $n=0$ বসিয়ে প্রতিটি $n>0$-এর জন্য $x[n]$ আর $x[-n]$ (বা $-x[-n]$) সরাসরি তুলনা করা।

৪ · একটি সত্যিকারের ডেমো — চারটি সিগন্যাল শ্রেণীবদ্ধ করা

নিচের কোড সেল চারটি ভিন্ন সিন্থেটিক সিগন্যাল নিয়ে প্রতিটি বৈশিষ্ট্য সরাসরি গণনা করে পরীক্ষা করে — কোনো অনুমান নেই, শুধু ইনডেক্স-বাই-ইনডেক্স তুলনা ও যোগফল।

Python
import math

N = 8

# ১. পর্যায়বৃত্ত পরীক্ষা -- x[n] = sin(2*pi*n/8), সন্দেহভাজন পিরিয়ড N=8
x_periodic = [math.sin(2 * math.pi * n / 8) for n in range(20)]
period_candidate = 8
is_periodic = all(abs(x_periodic[n] - x_periodic[n + period_candidate]) < 1e-9
                   for n in range(len(x_periodic) - period_candidate))
print("=== পর্যায়বৃত্ত (periodic) পরীক্ষা ===")
print(f"x[n] = sin(2*pi*n/8), সন্দেহভাজন N = {period_candidate}")
for n in range(4):
    diff = abs(x_periodic[n] - x_periodic[n + period_candidate])
    print(f"  x[{n}]={x_periodic[n]:.6f}  x[{n}+{period_candidate}]={x_periodic[n+period_candidate]:.6f}  diff={diff:.2e}")
print(f"is_periodic (N={period_candidate}): {is_periodic}")

period_bad = 5  # ভুল পিরিয়ড দিয়েও পরীক্ষা করা যাক
is_periodic_bad = all(abs(x_periodic[n] - x_periodic[n + period_bad]) < 1e-9
                       for n in range(len(x_periodic) - period_bad))
print(f"is_periodic (N={period_bad}, ভুল সন্দেহ): {is_periodic_bad}")
print()

# ২. এনার্জি বনাম পাওয়ার সিগন্যাল
print("=== এনার্জি বনাম পাওয়ার সিগন্যাল ===")
x_decay = [0.7**n for n in range(N)]
energy_decay = sum(v**2 for v in x_decay)
print(f"x[n] = 0.7^n, n=0..{N-1}: {[round(v,4) for v in x_decay]}")
print(f"Energy E = sum(x[n]^2) = {energy_decay:.6f}  (সসীম -> এনার্জি সিগন্যাল)")

power_periodic = sum(v**2 for v in x_periodic[:8]) / 8
print(f"periodic সাইন-এর গড় পাওয়ার (এক পিরিয়ড, N=8) = {power_periodic:.6f}  (নন-জিরো, সসীম -> পাওয়ার সিগন্যাল)")
print()

# ৩. জোড় (even) সিগন্যাল -- n=-3..3, offset=3 হলো list-এ n=0-এর ইনডেক্স
print("=== জোড় (even) সিগন্যাল পরীক্ষা ===")
x_even = [1.0, 2.0, 3.0, 5.0, 3.0, 2.0, 1.0]
offset = 3
is_even = all(abs(x_even[offset+n] - x_even[offset-n]) < 1e-9 for n in range(0, offset+1))
print(f"x[n], n=-3..3: {x_even}  (n=0 list ইনডেক্স {offset}-এ)")
for n in range(0, offset+1):
    print(f"  x[{n}]={x_even[offset+n]}  x[{-n}]={x_even[offset-n]}  equal={abs(x_even[offset+n]-x_even[offset-n])<1e-9}")
print(f"is_even: {is_even}")
print()

# ৪. বিজোড় (odd) সিগন্যাল
print("=== বিজোড় (odd) সিগন্যাল পরীক্ষা ===")
x_odd = [-3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0]
is_odd = all(abs(x_odd[offset+n] - (-x_odd[offset-n])) < 1e-9 for n in range(0, offset+1))
print(f"x[n], n=-3..3: {x_odd}")
for n in range(0, offset+1):
    print(f"  x[{n}]={x_odd[offset+n]}  -x[{-n}]={-x_odd[offset-n]}  equal={abs(x_odd[offset+n]-(-x_odd[offset-n]))<1e-9}")
print(f"is_odd: {is_odd}")

    
আউটপুট নিশ্চিত করে — $\sin(2\pi n/8)$ সত্যিই $N=8$-এ পর্যায়বৃত্ত (is_periodic=True) কিন্তু $N=5$-এ নয় (False, যেমন কাম্য); ক্ষয়িষ্ণু এক্সপোনেনশিয়ালের এনার্জি $E \approx 1.954268$ (সসীম); পর্যায়বৃত্ত সাইনের গড় পাওয়ার ঠিক $0.500000$ (নন-জিরো, সসীম — যদিও এর অসীম-দৈর্ঘ্যের সংস্করণের মোট এনার্জি অসীম হতো); আর দুটো উদাহরণ সিকোয়েন্সই যথাক্রমে জোড় (is_even=True) ও বিজোড় (is_odd=True) — প্রতিটি ইনডেক্স-জোড়ে $x[n]$ ও $x[-n]$ (বা $-x[-n]$) হুবহু মিলে গেছে।
মূল কথা · Key takeaway

এই তিনটি শ্রেণীবিভাগ একে অপরের থেকে স্বাধীন এবং প্রতিটিই কোডে সরাসরি, স্পষ্ট শর্ত দিয়ে যাচাইযোগ্য — "মনে হয়" বা "সাধারণত" বলে কিছু নেই এখানে। এই অভ্যাসটি — দাবি না করে সরাসরি ইনডেক্স-বাই-ইনডেক্স গণনা করে যাচাই করা — এই পুরো কোর্স জুড়ে ফিরে আসবে: M4-এ ROC পরীক্ষা, M5-এ DFT-এর কনজুগেট সিমেট্রি ($X[N-k] = X[k]^*$) যাচাই একই পদ্ধতিতে হবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ উপরের কোডে is_periodic পরীক্ষায় শুধু $x[n]=x[n+8]$ কয়েকটি $n$-এর জন্য মিললেই কি যথেষ্ট, নাকি সব $n$-এর জন্য মেলাতে হবে? কোডটি ঠিক কী করছে?

কঠোরভাবে বলতে গেলে সংজ্ঞা অনুযায়ী সব $n$-এর জন্য মিলতে হবে (অসীম সিগন্যালের ক্ষেত্রে এটি একটি গাণিতিক দাবি)। উপরের কোড all(...) ব্যবহার করে সসীম নমুনার (২০টি স্যাম্পলের মধ্যে যতগুলো জোড়া বানানো যায়) মধ্যে সবগুলো পরীক্ষা করে — এটি একটি ব্যবহারিক আনুমানিকতা (finite-length পরীক্ষা), কারণ কোডে সত্যিকার অসীম সিগন্যাল রাখা সম্ভব নয়। বাস্তবে যদি একটি সিগন্যাল গাণিতিক সূত্র থেকে তৈরি হয় (যেমন math.sin), তাহলে সসীম নমুনায় সত্য হলে সাধারণত পুরো সিগন্যালেই সত্য হয়, কারণ সূত্রটি নিজেই পর্যায়বৃত্ত।

প্র ০২ একটি সিগন্যাল কি একইসাথে এনার্জি সিগন্যাল এবং জোড় (even) সিগন্যাল হতে পারে? উপরের উদাহরণ থেকে এমন একটি সম্মিলিত উদাহরণ দিতে পারবেন কি?

হ্যাঁ, নিশ্চিতভাবেই — এই দুটো শ্রেণীবিভাগ (এনার্জি/পাওয়ার আর জোড়/বিজোড়) সম্পূর্ণ স্বাধীন মাপকাঠি, একটি অন্যটিকে বাধ্য করে না। উপরের x_even = [1, 2, 3, 5, 3, 2, 1] সিগন্যালটি ইতিমধ্যে জোড়; এর মোট এনার্জি $E = \sum x[n]^2 = 1+4+9+25+9+4+1 = 53$, যা সসীম — তাই এটি একইসাথে জোড় এবং এনার্জি সিগন্যাল।

প্র ০৩ বিজোড় (odd) সিগন্যালের সংজ্ঞা $x[n] = -x[-n]$ থেকে $n=0$-এ কী শর্ত বাধ্যতামূলকভাবে বেরিয়ে আসে, আর উপরের x_odd উদাহরণে সেটি সত্যিই পূরণ হয়েছে কি?

$n=0$ বসালে $x[0] = -x[-0] = -x[0]$, অর্থাৎ $2x[0] = 0 \Rightarrow x[0] = 0$ — প্রতিটি বিজোড় সিগন্যালের কেন্দ্রীয় মান বাধ্যতামূলকভাবে শূন্য হতে হবে। উপরের x_odd তালিকায় কেন্দ্রীয় মান (offset ইনডেক্স ৩-এ) ঠিক 0.0 — শর্তটি সত্যিই পূরণ হয়েছে, এলোমেলোভাবে নয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোডে x_decay = [0.7**n for n in range(N)]-এ 0.7-কে 0.5-এ বদলালে এনার্জি $E$ কি বাড়বে না কমবে বলে আপনার ধারণা? কেন?

    কমবে। $0.5 < 0.7$ হওয়ায় প্রতিটি পরের টার্ম আরও দ্রুত শূন্যের দিকে যায়, তাই বর্গ করে যোগ করা মানগুলোও ছোট হবে — মোট এনার্জি কমবে। (আসল হিসেব: $0.7^n$-এর জন্য $E \approx 1.954$, আর $0.5^n$-এর জন্য প্রথম কয়েকটি টার্ম $1, 0.25, 0.0625, \ldots$ — অনেক দ্রুত ছোট হয়ে যায়।)

  2. পরীক্ষা করুন: উপরের কোডে 0.7-কে 0.5-এ পরিবর্তন করে Run চেপে আপনার হিসেব যাচাই করুন এবং নতুন Energy E-এর মান লক্ষ করুন।

    রান করলে $E = \sum_{n=0}^{7} 0.5^{2n} = 1 + 0.25 + 0.0625 + \ldots \approx 1.333313$ দেখাবে — যা $0.7^n$-এর $1.954268$-এর চেয়ে সত্যিই কম, আপনার হিসেবের সাথে মিলে যাচ্ছে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র‍্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
  • Numerical Methods কোর্স সহোদর কোর্স সাধারণ সংখ্যাগত অ্যালগরিদম ও ফ্লোটিং-পয়েন্ট নির্ভুলতা বিশ্লেষণ — উপরের কোডের টলারেন্স-ভিত্তিক তুলনা (< 1e-9) কেন দরকার তা সেই কোর্সে আরও বিস্তারিত ব্যাখ্যা করা আছে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।
আগের পাঠ
কন্টিনিউয়াস বনাম ডিসক্রিট সিগন্যাল — স্যাম্পলিং-এর ভিত্তি