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

ম্যাচড ফিল্টারিং ও ডিটেকশনের ভিত্তি

Matched filtering & detection basics
১২ মিনিট পড়া উচ্চ · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ডিটেকশন সমস্যার প্রণয়ন — একটি জানা টেমপ্লেট নয়েজি সিগন্যালে কোথায় (যদি থাকে) লুকানো
  • ম্যাচড ফিল্টার কীভাবে ক্রস-কোরিলেশন ব্যবহার করে সেই অবস্থান খুঁজে বের করে
  • একটি সত্যিকারের ডেমো — কোরিলেশন-পিক-এর অবস্থান বনাম প্রকৃত ইনজেক্ট করা শিফট
  • ম্যাচড ফিল্টার কেন AWGN-এর অধীনে সর্বোত্তম ডিটেক্টর, এবং এর বাস্তব প্রয়োগ

১ · ডিটেকশন সমস্যা

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

২ · ম্যাচড ফিল্টার — কোরিলেশন-ভিত্তিক সমাধান

M3/L11-এ আমরা ক্রস-কোরিলেশন শিখেছিলাম — দুটি সিগন্যালের মধ্যে সাদৃশ্য পরিমাপ করার একটি উপায়, বিভিন্ন আপেক্ষিক শিফটে। ম্যাচড ফিল্টারMatched filter — একটি জানা টেমপ্লেট সিগন্যালের সাথে ক্রস-কোরিলেশনের মাধ্যমে সেই টেমপ্লেটটি নয়েজি ডেটার মধ্যে কোথায় (সর্বোচ্চ সম্ভাবনায়) উপস্থিত তা শনাক্ত করার কৌশল। ঠিক এই ধারণাটি ব্যবহার করে — টেমপ্লেট $h[n]$ (দৈর্ঘ্য $M$) কে দীর্ঘ সিগন্যাল $y[n]$ (দৈর্ঘ্য $N$) -এর প্রতিটি সম্ভাব্য অবস্থানের (ল্যাগ) সাথে কোরিলেট করা হয়:

$$c[\text{lag}] = \sum_{k=0}^{M-1} h[k]\, y[\text{lag}+k]$$

যেখানে টেমপ্লেটের আকৃতি সিগন্যালের সাথে সবচেয়ে ভালোভাবে "মেলে" (align হয়), সেখানে $c[\text{lag}]$-এর মান সবচেয়ে বড় হবে — কারণ সেই বিন্দুতে টেমপ্লেটের প্রতিটি মান সিগন্যালের সংশ্লিষ্ট মানের সাথে একই চিহ্নে (sign) গুণ হচ্ছে, ফলে যোগফল গঠনমূলকভাবে (constructively) জমা হচ্ছে। অন্য কোনো ল্যাগে, টেমপ্লেট আর পটভূমি-নয়েজ পরস্পর সম্পর্কহীন হওয়ায় যোগফল গড়ে শূন্যের কাছাকাছি ওঠানামা করে। এই সর্বোচ্চ মানের ল্যাগটিই "ডিটেক্টেড" অবস্থান।

৩ · একটি সত্যিকারের ডেমো

নিচের কোড সেলে একটি ছোট, জানা টেমপ্লেট (৮ স্যাম্পলের একটি triangle-আকৃতির প্যাটার্ন) তৈরি করা হয়েছে। এরপর একটি ৪০-স্যাম্পলের দীর্ঘ সিগন্যাল তৈরি করা হয়েছে — পুরোটাই প্রথমে পটভূমি গসিয়ান নয়েজ (sigma=0.3) দিয়ে ভরা, তারপর ঠিক true_shift = 15 অবস্থানে টেমপ্লেটের একটি নয়েজি কপি (আরও ছোট sigma=0.2 নয়েজসহ) যোগ করে ইনজেক্ট করা হয়েছে। ম্যাচড ফিল্টার প্রতিটি সম্ভাব্য ল্যাগে কোরিলেশন গণনা করে — আমরা দেখব সর্বোচ্চ কোরিলেশন ঠিক ল্যাগ ১৫-এই আসে কি না।

Python
import math, random

# জানা ছোট টেমপ্লেট
template = [0.0, 0.5, 1.0, 0.5, 0.0, -0.5, -1.0, -0.5]
M = len(template)

# দীর্ঘ সিগন্যাল: সর্বত্র পটভূমি নয়েজ, এবং একটি জানা ল্যাগে
# টেমপ্লেটের একটি নয়েজি, সময়-শিফটেড কপি ইনজেক্ট করা
N = 40
true_shift = 15
random.seed(7)
bg_noise_sigma = 0.3
long_signal = [random.gauss(0.0, bg_noise_sigma) for _ in range(N)]

# true_shift অবস্থানে টেমপ্লেটের নয়েজি কপি ইনজেক্ট করা
inject_noise_sigma = 0.2
for i, t in enumerate(template):
    idx = true_shift + i
    long_signal[idx] += t + random.gauss(0.0, inject_noise_sigma)

# ম্যাচড ফিল্টার: প্রতিটি ল্যাগে টেমপ্লেটকে long_signal-এর সাথে ক্রস-কোরিলেট করা
max_lag = N - M
correlations = []
for lag in range(0, max_lag + 1):
    s = 0.0
    for k in range(M):
        s += template[k] * long_signal[lag + k]
    correlations.append(s)

peak_lag = max(range(len(correlations)), key=lambda i: correlations[i])
peak_val = correlations[peak_lag]

print(f"টেমপ্লেট দৈর্ঘ্য M={M}, সিগন্যাল দৈর্ঘ্য N={N}, প্রকৃত ইনজেক্ট করা শিফট={true_shift}")
print()
print(f"{'lag':>4} | {'correlation':>12}")
for lag, c in enumerate(correlations):
    marker = "  <-- peak" if lag == peak_lag else ""
    print(f"{lag:>4} | {c:>12.4f}{marker}")

print()
print(f"ডিটেক্টেড পিক ল্যাগ = {peak_lag}, কোরিলেশন মান = {peak_val:.4f}")
print(f"প্রকৃত শিফট = {true_shift}")
print(f"মিলেছে কি না: {peak_lag == true_shift}")

    
কোরিলেশন সারণির সর্বোচ্চ মান ২.২৪৪৭ ঠিক ল্যাগ ১৫-এ দেখা যাচ্ছে — যা হুবহু সেই ল্যাগ যেখানে টেমপ্লেটটি ইনজেক্ট করা হয়েছিল। আশেপাশের ল্যাগগুলোতে (১৪ ও ১৬) কোরিলেশন যথাক্রমে ১.২৩৭৫ ও ১.৩৬৩৫ — বড়, কিন্তু পিকের চেয়ে স্পষ্টভাবে কম, কারণ টেমপ্লেট তখন সিগন্যালের সাথে আংশিকভাবে মেলে। বাকি সব ল্যাগে (যেখানে শুধু পটভূমি নয়েজ আছে) কোরিলেশন অনেক ছোট বা ঋণাত্মক (−১.৭৫৯৬ থেকে ১.৩৬৩৫ পর্যন্ত ওঠানামা করে, কিন্তু কোনোটিই ২.২৪৪৭-এর কাছাকাছি নয়) — অর্থাৎ ম্যাচড ফিল্টার সত্যিই একটি স্পষ্ট, দ্ব্যর্থহীন চূড়া তৈরি করেছে, যা সঠিকভাবে প্রকৃত ইনজেকশন-বিন্দু শনাক্ত করেছে।

৪ · কেন ম্যাচড ফিল্টার সর্বোত্তম, এবং বাস্তব প্রয়োগ

এটি একটি প্রমাণিত (এবং সুপরিচিত টেক্সটবুক) ফলাফল যে, additive white Gaussian নয়েজের (AWGN, L49) অধীনে, ম্যাচড ফিল্টার হলো আউটপুট SNR সর্বোচ্চ করার জন্য প্রমাণিতভাবে সর্বোত্তম লিনিয়ার ফিল্টার — অন্য কোনো লিনিয়ার অপারেশন এর চেয়ে ভালো ডিটেকশন পারফরম্যান্স দিতে পারে না, যখন নয়েজ সত্যিই সাদা ও গসিয়ান। এই কারণেই ম্যাচড ফিল্টারিং এত ব্যাপকভাবে ব্যবহৃত হয়:

রাডার ও সোনার
পাঠানো পালসের প্রতিধ্বনি সময়মতো ফিরে এসেছে কি না তা শনাক্ত করে দূরত্ব হিসাব করা।
GPS
প্রতিটি স্যাটেলাইটের অনন্য কোড-প্যাটার্ন (টেমপ্লেট) নয়েজি রিসিভড সিগন্যালে খুঁজে বের করে সময়-বিলম্ব নির্ণয় করা, যা থেকে অবস্থান হিসাব হয়।
ডিজিটাল যোগাযোগ
একটি প্যাকেট/ফ্রেমের শুরুতে একটি জানা "প্রিয়াম্বল" প্যাটার্ন থাকে, যা ম্যাচড ফিল্টার দিয়ে খুঁজে সিঙ্ক্রোনাইজেশন করা হয়।
মূল কথা · Key takeaway

ম্যাচড ফিল্টারিং হলো M3/L11-এর ক্রস-কোরিলেশন এবং M11-এর র‍্যান্ডম-সিগন্যাল/SNR ধারণার (L48-L49) একটি সরাসরি, ব্যবহারিক মিলন — এটি প্রমাণ করে কেন কোরিলেশন শুধু একটি গাণিতিক কৌতূহল নয়, বরং একটি সত্যিকারের সিগন্যাল-ডিটেকশন টুল যা নিম্ন SNR-এও (এমনকি L49-এর ঋণাত্মক dB-এর ক্ষেত্রেও) নির্ভরযোগ্যভাবে কাজ করতে পারে — টেমপ্লেট যত দীর্ঘ হয়, কোরিলেশন-পিক তত বেশি নয়েজ-প্রতিরোধী হয়ে ওঠে।

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

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

প্র ০১ উপরের ডেমোতে bg_noise_sigma = 0.3 অনেক বাড়িয়ে দিলে (যেমন ৩.০) কী হবে বলে আপনার ধারণা — ডিটেকশন এখনো নির্ভুল থাকবে কি?

নয়েজ পাওয়ার অনেক বেড়ে গেলে, পটভূমি নয়েজের সাথে টেমপ্লেটের এলোমেলো কোরিলেশনের মান আরও বড় ও অনিয়মিত হয়ে যাবে — কখনো কখনো এটি প্রকৃত পিকের কাছাকাছি বা তার চেয়েও বড় হয়ে যেতে পারে, ফলে ভুল ল্যাগে মিথ্যা পিক ধরা পড়তে পারে। এটাই ম্যাচড ফিল্টারের সীমাবদ্ধতা — খুব নিম্ন SNR-এ (L49-এর ভাষায়) ডিটেকশন অনির্ভরযোগ্য হয়ে যায়, যদিও টেমপ্লেট যত দীর্ঘ হয় (M যত বড়), ফিল্টার তত বেশি নয়েজ সহ্য করতে পারে, কারণ কোরিলেশন-যোগফল টেমপ্লেটের প্রতিটি নমুনা জুড়ে "গঠনমূলকভাবে" জমা হয় অথচ এলোমেলো নয়েজ গড়ে বাতিল হয়ে যায়।

প্র ০২ ম্যাচড ফিল্টার আর M3/L11-এর অটোকোরিলেশনের (autocorrelation) মধ্যে সম্পর্ক কী?

অটোকোরিলেশন হলো একটি সিগন্যালকে তার নিজেরই সাথে বিভিন্ন ল্যাগে কোরিলেট করা — L11-এ দেখা গিয়েছিল এটি সবসময় ল্যাগ শূন্যে একটি সর্বোচ্চ পিক দেয় (একটি সিগন্যাল নিজের সাথে সবচেয়ে বেশি "মেলে")। ম্যাচড ফিল্টার একই নীতি প্রয়োগ করে, কিন্তু দুটি ভিন্ন সিগন্যালের মধ্যে (টেমপ্লেট বনাম দীর্ঘ সিগন্যাল) — যদি দীর্ঘ সিগন্যালের মধ্যে টেমপ্লেটের একটি হুবহু কপি লুকানো থাকে, তাহলে সেই বিশেষ ল্যাগে ক্রস-কোরিলেশন কার্যকরভাবে একটি "স্থানীয় অটোকোরিলেশন-সদৃশ" পিক তৈরি করে।

প্র ০৩ যদি টেমপ্লেট নিজেই উল্টো (reverse) করে দেওয়া হয় এবং সিগন্যালে সেভাবেই ইনজেক্ট করা হয়, তাহলে মূল (non-reversed) টেমপ্লেট দিয়ে ম্যাচড ফিল্টার চালালে কি এখনও একটি পিক পাওয়া যাবে?

এটি নির্ভর করে টেমপ্লেটের আকৃতির উপর। যদি টেমপ্লেটটি প্রতিসম (symmetric) না হয় (যেমন উপরের triangle প্যাটার্নটি আসলে antisymmetric — template[i] == -template[M-1-i]), তাহলে উল্টো করা কপির সাথে মূল টেমপ্লেটের কোরিলেশন সাধারণত অনেক দুর্বল বা এমনকি ঋণাত্মক হবে, কারণ আকৃতিগুলো আর "মেলে" না। এটাই দেখায় কেন ম্যাচড ফিল্টার শুধু "কোনো সিগন্যাল আছে কি না" নয়, বরং "ঠিক এই নির্দিষ্ট আকৃতির সিগন্যাল আছে কি না" তা যাচাই করে — টেমপ্লেটের সঠিক আকৃতি ও দিক (orientation) গুরুত্বপূর্ণ।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে true_shift = 15-কে true_shift = 25 -এ বদলালে (বাকি সব অপরিবর্তিত রেখে), max_lag = N - M = 40 - 8 = 32 এখনও এই নতুন শিফট ধারণ করার জন্য যথেষ্ট কি না যাচাই করুন, এবং ডিটেক্টেড পিক ল্যাগ কত হবে বলে আপনার ধারণা?

    হ্যাঁ, যথেষ্ট — কারণ true_shift=25-এ টেমপ্লেট ইনজেক্ট হলে এটি ইনডেক্স ২৫ থেকে ৩২ পর্যন্ত দখল করবে (দৈর্ঘ্য ৮), যা সিগন্যালের দৈর্ঘ্য ৪০-এর মধ্যেই আছে এবং max_lag=32 -এর সীমার মধ্যেই পড়ে। ম্যাচড ফিল্টার সঠিকভাবে কাজ করলে ডিটেক্টেড পিক ল্যাগ ২৫ হওয়া উচিত।

  2. পরীক্ষা করুন: কোড সেলে true_shift-কে ২৫-এ বদলে Run চেপে আপনার হিসেব যাচাই করুন।

    রান করলে সত্যিই peak_lag = 25 দেখাবে (নয়েজের র‍্যান্ডম সিডের উপর নির্ভর করে কোরিলেশনের সংখ্যাসূচক মান কিছুটা ভিন্ন হতে পারে, কিন্তু পিকের অবস্থান — ল্যাগ ২৫ — সঠিকভাবে প্রকৃত শিফটের সাথে মিলবে)।

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

আগের পাঠ
নয়েজ ও সিগন্যাল-টু-নয়েজ রেশিও