LTI সিস্টেমের ফ্রিকোয়েন্সি রেসপন্স
এই পাঠে যা শিখবেন
- ফ্রিকোয়েন্সি রেসপন্স $H(e^{j\omega})$-এর সংজ্ঞা এবং ট্রান্সফার ফাংশনের সাথে সম্পর্ক
- numerator/denominator কোয়েফিসিয়েন্ট থেকে $H(e^{j\omega})$ Python-এ গণনা করা
- ম্যাগনিটিউড ও ফেজ রেসপন্স পড়ে একটি সিস্টেম লো-পাস, হাই-পাস নাকি অন্য কিছু তা বোঝা
- DTFT (L২০) ও ট্রান্সফার ফাংশন (M৪) ধারণা দুটো কীভাবে একসাথে কাজ করে
১ · ফ্রিকোয়েন্সি রেসপন্স কী
M১২-M১৩-এ শেখা ইমপালস রেসপন্স $h[n]$ একটি LTI সিস্টেমকে টাইম-ডোমেইনে সম্পূর্ণভাবে বর্ণনা করে। এর ফ্রিকোয়েন্সি রেসপন্সFrequency Responseএকটি LTI সিস্টেমের ইমপালস রেসপন্সের DTFT — সিস্টেমটি প্রতিটি ফ্রিকোয়েন্সিকে কতটা বড়/ছোট করে এবং কতটা ফেজ-শিফট করে তা বর্ণনা করে। হলো $h[n]$-এর DTFT:
$$H(e^{j\omega}) = \sum_{n} h[n]\, e^{-j\omega n}$$কিন্তু M১৮-এ আমরা শিখেছি একটি LTI সিস্টেম প্রায়ই একটি রেশনাল ট্রান্সফার ফাংশন $H(z) = \frac{\sum_k b_k z^{-k}}{\sum_k a_k z^{-k}}$ দিয়ে বর্ণিত হয় (difference equation-এর numerator/denominator কোয়েফিসিয়েন্ট থেকে সরাসরি)। L২০-এ দেখানো সম্পর্ক অনুযায়ী, ইউনিট সার্কেলের উপর মূল্যায়ন করলেই ($z = e^{j\omega}$) ফ্রিকোয়েন্সি রেসপন্স পাওয়া যায়:
$$H(e^{j\omega}) = H(z)\Big|_{z=e^{j\omega}} = \frac{\sum_k b_k e^{-j\omega k}}{\sum_k a_k e^{-j\omega k}}$$$|H(e^{j\omega})|$ — সিস্টেমটি সেই ফ্রিকোয়েন্সিকে কতগুণ বড়/ছোট করে (gain)।
$\angle H(e^{j\omega})$ — সেই ফ্রিকোয়েন্সি-কম্পোনেন্টকে কতটা টাইম-শিফট করা হয়।
একটি "ফিল্টার" আসলে এমন একটি সিস্টেম যার ফ্রিকোয়েন্সি রেসপন্স ইচ্ছাকৃতভাবে কিছু ফ্রিকোয়েন্সি পাস করে, অন্যগুলো কমিয়ে দেয় — M৭-M৮-এর মূল লক্ষ্য।
২ · একটি সত্যিকারের ডেমো — সিস্টেমের রেসপন্স গণনা
ধরা যাক একটি সিস্টেম difference equation $y[n] = 0.6\,y[n-1] + x[n] + 0.5\,x[n-1]$ দিয়ে সংজ্ঞায়িত —
অর্থাৎ $H(z) = \dfrac{1 + 0.5 z^{-1}}{1 - 0.6 z^{-1}}$ (M১৮-এর মতো coefficient list রূপে:
num=[1.0, 0.5], den=[1.0, -0.6])। নিচের কোডে এই সিস্টেমের ফ্রিকোয়েন্সি রেসপন্স
পাঁচটি $\omega$ মানে সরাসরি গণনা করা হয়েছে।
import cmath, math
# y[n] = 0.6*y[n-1] + x[n] + 0.5*x[n-1]
# H(z) = (1 + 0.5*z^-1) / (1 - 0.6*z^-1)
num = [1.0, 0.5] # b0, b1
den = [1.0, -0.6] # a0, a1
def freq_response(num, den, omega):
z_inv = cmath.exp(-1j * omega) # z^-1 = e^(-j*w)
N = sum(c * z_inv**k for k, c in enumerate(num))
D = sum(c * z_inv**k for k, c in enumerate(den))
return N / D
freqs = [0, math.pi/4, math.pi/2, 3*math.pi/4, math.pi]
print(f"{'omega (rad)':>12} | {'|H(e^jw)|':>10} | {'phase(rad)':>11}")
for w in freqs:
H = freq_response(num, den, w)
print(f"{w:12.4f} | {abs(H):10.4f} | {cmath.phase(H):11.4f}")
ফ্রিকোয়েন্সি রেসপন্স হলো ট্রান্সফার ফাংশন (M৪) আর DTFT (L২০)-এর সংযোগস্থল — একই গাণিতিক বস্তু, শুধু
দেখার কোণ ভিন্ন। L২২-এ আমরা DFT দিয়ে একটি সিগন্যালের নিজস্ব ফ্রিকোয়েন্সি-কন্টেন্ট বের করব, আর M৭-M৮-এ
এই একই freq_response-এর ধরনের কোড ব্যবহার করে যাচাই করা হবে একটি ডিজাইন-করা ফিল্টার সত্যিই
চাহিদামতো ফ্রিকোয়েন্সি পাস/কাট করছে কিনা।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ উপরের কোডে $\omega=0$-এ $H(e^{j0})=3.75$ পাওয়া গেল। এটি সরাসরি coefficient-গুলো থেকে হাতে কীভাবে যাচাই করবেন?
$\omega=0$-এ $z^{-1}=e^{-j0}=1$, তাই $H(e^{j0}) = \dfrac{1+0.5\times 1}{1-0.6\times 1} = \dfrac{1.5}{0.4} = 3.75$ — কোডের আউটপুটের সাথে হুবহু মেলে। এটি DC (স্থির/জিরো-ফ্রিকোয়েন্সি) gain, অর্থাৎ একটি ধ্রুবক ইনপুট সিগন্যালকে সিস্টেম কতগুণ বড় করবে তার সরাসরি হিসেব।
প্র ০২ এই সিস্টেমের পোল $z=0.6$ যদি $z=0.95$-এর কাছাকাছি হতো (ইউনিট সার্কেলের আরও কাছে), ম্যাগনিটিউড রেসপন্সের আকৃতি কীভাবে বদলাত?
পোল ইউনিট সার্কেলের যত কাছে যায়, ফ্রিকোয়েন্সি রেসপন্স সেই পোলের কাছের $\omega$-তে তত বেশি "উঁচু" ও তীক্ষ্ণ (sharp peak) হয়ে যায় — কারণ $H(e^{j\omega})$-এর ডিনোমিনেটর $(1-0.6e^{-j\omega})$ পোলের কাছাকাছি $\omega$-তে খুব ছোট হয়ে যায়, ফলে $H$ বড় হয়। $z=0.6$ পজিটিভ-বাস্তব অক্ষের কাছে বলে সর্বোচ্চ gain $\omega=0$-এর কাছে হয় (লো-পাস আচরণ) — পোল $1$-এর যত কাছে যায়, DC gain তত বেশি ও তীক্ষ্ণ হয়ে ওঠে (M৮-এর IIR ফিল্টার ডিজাইনে এই সম্পর্কটিই ব্যবহৃত হয়)।
প্র ০৩
উপরের কোডের freq_response ফাংশন আর L২০-এর dtft ফাংশনের গাণিতিক পার্থক্য
কী, যদিও দুটোই cmath.exp ব্যবহার করে?
L২০-এর dtft সরাসরি একটি সিগন্যাল $x[n]$-এর সামেশন গণনা করে। এখানকার
freq_response আসলে দুটো এমন সামেশন গণনা করছে — একটি numerator
কোয়েফিসিয়েন্টের (এটি একটি DTFT-ই, FIR অংশের), আরেকটি denominator কোয়েফিসিয়েন্টের — এবং তারপর একটির
ফলাফলকে অন্যটি দিয়ে ভাগ করছে। গাণিতিকভাবে এটি সরাসরি ট্রান্সফার ফাংশন $H(z)$-কে $z=e^{j\omega}$-তে
মূল্যায়ন করার সমতুল্য।
অনুশীলন
-
চিন্তা করুন: $\omega=\pi$-তে $z^{-1}=e^{-j\pi}=-1$। এই মান বসিয়ে $H(e^{j\pi})$-এর মান
হাতে হিসেব করার চেষ্টা করুন এবং দেখুন কোডের আউটপুটের সাথে মেলে কিনা।
$H(e^{j\pi}) = \dfrac{1+0.5\times(-1)}{1-0.6\times(-1)} = \dfrac{0.5}{1.6} = 0.3125$ — কোডের আউটপুটে দেখানো $|H(e^{j\pi})| = 0.3125$-এর সাথে হুবহু মেলে (এখানে ফলাফল বাস্তব ও ধনাত্মক বলে ফেজও $0.0000$)।
-
পরীক্ষা করুন: উপরের কোডে
den = [1.0, -0.6]-কেden = [1.0, 0.6](পোল $z=-0.6$, ঋণাত্মক-বাস্তব অক্ষের কাছে)-এ বদলে Run চাপুন। এখন কোন ফ্রিকোয়েন্সিতে (নিম্ন নাকি উচ্চ) ম্যাগনিটিউড সবচেয়ে বেশি হবে বলে ধারণা করেন, তারপর যাচাই করুন।পোল $z=-0.6$ ঋণাত্মক-বাস্তব অক্ষের কাছে, অর্থাৎ $\omega=\pi$ (সর্বোচ্চ ডিসক্রিট ফ্রিকোয়েন্সি)-এর কাছাকাছি — তাই সেখানে ম্যাগনিটিউড সবচেয়ে বেশি হওয়া উচিত। রান করলে $\omega=\pi$-তে $|H(e^{j\pi})| = \dfrac{0.5}{0.4} = 1.25$ (সর্বোচ্চ) আর $\omega=0$-তে $|H(e^{j0})| = \dfrac{1.5}{1.6} = 0.9375$ (তুলনামূলক কম) দেখাবে — অর্থাৎ সিস্টেমটি এখন হাই-পাস-সদৃশ আচরণ করছে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- ডিসক্রিট ফুরিয়ার ট্রান্সফর্ম (DFT) পরবর্তী পাঠ সিগন্যালের নিজস্ব ফ্রিকোয়েন্সি-কন্টেন্ট কম্পিউটারে সম্পূর্ণভাবে বের করার পদ্ধতি — এই পাঠের ধারণারই সম্প্রসারণ।
- ট্রান্সফার ফাংশন ও পোল-জিরো অ্যানালাইসিস M৪ এই পাঠে ব্যবহৃত numerator/denominator কোয়েফিসিয়েন্ট ও পোল-জিরোর ভিত্তি।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M৭-M৮-এ এই ফ্রিকোয়েন্সি-রেসপন্স গণনাই ব্যবহৃত হবে FIR/IIR ফিল্টার যাচাই করতে।