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

ওয়েনার ফিল্টারিং — অপটিমাল লিনিয়ার এস্টিমেশন

Wiener filtering — optimal linear estimation
১১ মিনিট পড়া উচ্চ · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • অপটিমাল লিনিয়ার এস্টিমেশন সমস্যার প্রণয়ন — নয়েজি অবজারভেশন থেকে ক্লিন সিগন্যাল পুনরুদ্ধার
  • ওয়েনার গেইনের ক্লোজড-ফর্ম সূত্র এবং এটি কীভাবে সিগন্যাল/নয়েজ ভ্যারিয়েন্স থেকে বের হয়
  • একটি সত্যিকারের ডেমো — MSE-এর মাধ্যমে ওয়েনার ফিল্টারের প্রকৃত উন্নতি পরিমাপ
  • ওয়েনার ফিল্টার কোথায় ব্যবহৃত হয় এবং এর সীমাবদ্ধতা

১ · অপটিমাল লিনিয়ার এস্টিমেশন সমস্যা

ধরা যাক আমাদের কাছে একটি নয়েজি অবজারভেশন আছে, additive নয়েজ মডেল (L49) অনুযায়ী:

$$y = x + w$$

যেখানে $x$ হলো প্রকৃত (অজানা) সিগন্যাল মান আর $w$ হলো জিরো-মিন নয়েজ। আমরা $y$ থেকে $x$-এর একটি এস্টিমেট $\hat{x}$ বের করতে চাই। সবচেয়ে সহজ পন্থা — লিনিয়ার এস্টিমেশন: $\hat{x} = G \cdot y$, যেখানে $G$ একটি একক গেইন (স্কেলার)। প্রশ্ন হলো — কোন $G$ বেছে নিলে গড়ে সবচেয়ে কম এরর হবে? এটাই ওয়েনার ফিল্টারWiener filter — সিগন্যাল ও নয়েজের পরিসংখ্যানিক বৈশিষ্ট্য (ভ্যারিয়েন্স/অটোকোরিলেশন) জানা থাকলে, মিন-স্কোয়ার্ড এরর (MSE) সর্বনিম্ন করে এমন অপটিমাল লিনিয়ার এস্টিমেটর।-এর মূল প্রশ্ন — এটি নরবার্ট ওয়েনারের নামে নামাঙ্কিত একটি সুপরিচিত, ক্লাসিক ফলাফল।

২ · ওয়েনার গেইন — ক্লোজড-ফর্ম সূত্র

যদি সিগন্যাল $x$ ও নয়েজ $w$ উভয়ই জিরো-মিন এবং পরস্পর সম্পর্কহীন (uncorrelated) হয়, এবং তাদের ভ্যারিয়েন্স যথাক্রমে $\sigma_x^2$ ও $\sigma_w^2$ জানা থাকে, তাহলে MSE $E[(\hat{x}-x)^2] = E[(Gy-x)^2]$ সর্বনিম্ন করে এমন $G$-এর সুপরিচিত ক্লোজড-ফর্ম সমাধান:

$$G = \frac{\sigma_x^2}{\sigma_x^2 + \sigma_w^2}$$

লক্ষ্য করুন এই সূত্রের সহজবোধ্য চরম আচরণ: যদি নয়েজ না থাকে ($\sigma_w^2 \to 0$), $G \to 1$ — অর্থাৎ অবজারভেশনকে যেমন আছে তেমনই বিশ্বাস করা উচিত। যদি নয়েজ অসীম বড় হয় ($\sigma_w^2 \to \infty$), $G \to 0$ — অর্থাৎ অবজারভেশনকে সম্পূর্ণ উপেক্ষা করে শূন্য (জিরো-মিন প্রত্যাশা) এস্টিমেট করাই ভালো। মাঝামাঝি ক্ষেত্রে, $G$ সিগন্যাল ও নয়েজের আপেক্ষিক "শক্তি"-র উপর ভিত্তি করে দুটোর মধ্যে ভারসাম্য বজায় রাখে — এটাই L49-এর SNR ধারণার সাথে সরাসরি সংযুক্ত, কারণ $G = \frac{\text{SNR}}{\text{SNR}+1}$ যেখানে SNR $= \sigma_x^2/\sigma_w^2$ (লিনিয়ার স্কেলে, dB নয়)।

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

নিচের কোড সেলে দুটি ইলাস্ট্রেটিভ (হাইপোথেটিক্যাল) ভ্যারিয়েন্স বেছে নেওয়া হয়েছে — $\sigma_x^2=4.0$ (সিগন্যাল), $\sigma_w^2=1.0$ (নয়েজ) — এবং সেখান থেকে ওয়েনার গেইন $G$ হাতে গণনা করা হয়েছে। এরপর random.gauss দিয়ে (ফিক্সড সিড, $\sigma_x=\sqrt{4.0}=2.0$ ব্যবহার করে) ১২টি "ক্লিন" মান এবং আলাদা একটি ফিক্সড সিড দিয়ে ($\sigma_w=\sqrt{1.0}=1.0$) নয়েজ জেনারেট করে, দুটো যোগ করে নয়েজি অবজারভেশন তৈরি করা হয়েছে। প্রতিটি অবজারভেশনে $G$ প্রয়োগ করে ওয়েনার এস্টিমেট বের করা হয়েছে, এবং তুলনার জন্য $G=1.0$ (অর্থাৎ কোনো ফিল্টারিং না করে সরাসরি নয়েজি মান ব্যবহার) দিয়েও একটি "raw" এস্টিমেট রাখা হয়েছে। শেষে দুটোরই MSE প্রকৃত ক্লিন মানের সাপেক্ষে গণনা করা হয়েছে।

Python
import random, statistics

# জানা (হাইপোথেটিক্যাল/ইলাস্ট্রেটিভ) ভ্যারিয়েন্স
signal_var = 4.0   # প্রকৃত সিগন্যাল ভ্যারিয়েন্স
noise_var = 1.0    # নয়েজ ভ্যারিয়েন্স

G = signal_var / (signal_var + noise_var)
print(f"signal_var = {signal_var}, noise_var = {noise_var}")
print(f"ওয়েনার গেইন G = signal_var / (signal_var + noise_var) = {G:.4f}")
print()

# ছোট একগুচ্ছ ক্লিন মান (জিরো-মিন, ভ্যারিয়েন্স ~ signal_var)
# এবং additive নয়েজ (জিরো-মিন, ভ্যারিয়েন্স ~ noise_var), ফিক্সড সিড
random.seed(11)
n_obs = 12
clean_vals = [random.gauss(0.0, signal_var ** 0.5) for _ in range(n_obs)]
random.seed(99)
noise_vals = [random.gauss(0.0, noise_var ** 0.5) for _ in range(n_obs)]
noisy_vals = [c + n for c, n in zip(clean_vals, noise_vals)]

wiener_est = [G * y for y in noisy_vals]
raw_est = [1.0 * y for y in noisy_vals]  # G=1, অর্থাৎ কোনো ফিল্টারিং নেই

print(f"{'n':>3} | {'clean':>8} | {'noisy':>8} | {'wiener est':>10} | {'raw est':>8}")
for i in range(n_obs):
    print(f"{i:>3} | {clean_vals[i]:>8.4f} | {noisy_vals[i]:>8.4f} | {wiener_est[i]:>10.4f} | {raw_est[i]:>8.4f}")

mse_wiener = statistics.mean([(w - c) ** 2 for w, c in zip(wiener_est, clean_vals)])
mse_raw = statistics.mean([(r - c) ** 2 for r, c in zip(raw_est, clean_vals)])

print()
print(f"MSE (ওয়েনার এস্টিমেট, G={G:.4f}) = {mse_wiener:.4f}")
print(f"MSE (raw নয়েজি, G=1.0, কোনো ফিল্টারিং নেই) = {mse_raw:.4f}")
print(f"উন্নতির অনুপাত = {mse_raw / mse_wiener:.4f}x")

    
$\sigma_x^2=4.0$ ও $\sigma_w^2=1.0$ দিয়ে ওয়েনার গেইন $G=0.8000$। ফলাফল সারণিতে দেখা যায় ওয়েনার এস্টিমেট (কলাম "wiener est") সবসময় "raw est" কলামের চেয়ে ০-এর দিকে কিছুটা টানা (shrunk) — যেমন n=8-এ raw est −৪.৭২৩৪, কিন্তু wiener est −৩.৭৭৮৭, যা প্রকৃত ক্লিন মান −২.৪৩১৭-এর কাছাকাছি। সামগ্রিকভাবে, ওয়েনার এস্টিমেটের MSE ০.৪৭৪১, আর কোনো ফিল্টারিং ছাড়া raw নয়েজি মান ব্যবহার করলে MSE ০.৮৮০৯ — অর্থাৎ ওয়েনার ফিল্টার এররকে প্রায় ১.৮৬ গুণ কমিয়েছে, একটি সত্যিকারের, গণনাকৃত উন্নতি।

৪ · সীমাবদ্ধতা ও ব্যবহারিক প্রয়োগ

উপরের উদাহরণটি সবচেয়ে সহজ রূপ — একটি একক স্কেলার গেইন, কোনো সময়-সম্পর্ক (temporal correlation) ছাড়াই। পূর্ণাঙ্গ ওয়েনার ফিল্টার তত্ত্ব (সিগন্যাল প্রসেসিং টেক্সটবুকে) সিগন্যাল ও নয়েজের অটোকোরিলেশন ফাংশন (L11) ব্যবহার করে ফ্রিকোয়েন্সি-নির্ভর গেইন বের করে — যেখানে সিগন্যালের পাওয়ার নয়েজের চেয়ে বেশি সেই ফ্রিকোয়েন্সিতে বেশি বিশ্বাস করা হয়, আর যেখানে নয়েজ প্রাধান্য পায় সেখানে দমন করা হয় — ধারণাগতভাবে এটি M7/M8-এর ফিল্টার ডিজাইনের (নির্দিষ্ট কাটঅফ ফ্রিকোয়েন্সি ঠিক করা) সাথে সম্পর্কিত, কিন্তু ওয়েনার ফিল্টার কাটঅফ "হাতে বেছে নেয়" না — এটি সিগন্যাল/নয়েজের পরিসংখ্যান থেকে সরাসরি সর্বোত্তম গেইন ডিরাইভ করে। এই কারণেই একে "অপটিমাল" বলা হয় — প্রদত্ত পরিসংখ্যানিক তথ্যের অধীনে, লিনিয়ার এস্টিমেটরের মধ্যে এর চেয়ে কম MSE কোনো ফিল্টার দিতে পারে না। ব্যবহারিক সীমাবদ্ধতা হলো — সঠিক ফলাফলের জন্য সিগন্যাল ও নয়েজের ভ্যারিয়েন্স (বা পূর্ণ অটোকোরিলেশন) সত্যিই জানা বা যথাযথভাবে এস্টিমেট করা থাকতে হয়; ভুল ভ্যারিয়েন্স অনুমান করলে ফলাফল সর্বোত্তম থাকবে না।

মূল কথা · Key takeaway

ওয়েনার ফিল্টার M11-এর একটি স্বাভাবিক উপসংহার — এটি L48-এর র‍্যান্ডম-সিগন্যাল পরিসংখ্যান, L49-এর নয়েজ/SNR মডেল, এবং L50-এর কোরিলেশন-ভিত্তিক প্রসেসিংকে এক জায়গায় নিয়ে আসে একটি একক লক্ষ্যে — নয়েজ থেকে প্রকৃত সিগন্যালের সেরা সম্ভাব্য এস্টিমেট বের করা, ধরে নেওয়া (assumption) নয়, বরং একটি গণনাযোগ্য সূত্রের মাধ্যমে। M12-এর প্রয়োগ-অধ্যায়ে (L52-L55) আমরা এই সব টুল একসাথে ব্যবহারিক সমস্যায় প্রয়োগ করব।

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

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

প্র ০১ উপরের ডেমোতে যদি noise_var বাড়িয়ে signal_var-এর চেয়ে অনেক বড় করা হয় (যেমন noise_var=100.0), তাহলে $G$ কত হবে, আর এর মানে ব্যবহারিকভাবে কী?

$G = 4.0/(4.0+100.0) = 4.0/104.0 \approx 0.0385$ — অর্থাৎ $G$ প্রায় শূন্যের কাছাকাছি। ব্যবহারিকভাবে এর মানে, যেহেতু নয়েজ সিগন্যালের চেয়ে অনেক বেশি শক্তিশালী, ওয়েনার ফিল্টার নয়েজি অবজারভেশনকে প্রায় সম্পূর্ণ অবিশ্বাস করে এবং এস্টিমেটকে জিরো-মিনের (প্রায়ই শূন্যের) কাছাকাছি রাখে — কারণ এই পরিস্থিতিতে অবজারভেশনের উপর ভরসা করার চেয়ে "গড় মান বলে দেওয়া" পরিসংখ্যানিকভাবে কম MSE দেয়।

প্র ০২ উপরের ডেমোতে raw est ($G=1$) সবসময় noisy_vals-এর সমান। তাহলে raw est-এর MSE কি আসলে নয়েজের ভ্যারিয়েন্সের একটি এস্টিমেট?

হ্যাঁ, ঠিক তাই — যেহেতু raw_est[i] - clean_vals[i] = noisy_vals[i] - clean_vals[i] = noise_vals[i], তাই mse_raw আসলে নয়েজ মানগুলোর নমুনা মান-বর্গের গড়, যা L48-এর এরগোডিসিটি অনুযায়ী তাত্ত্বিক noise_var=1.0-এর কাছাকাছি হওয়া উচিত। ডেমোতে mse_raw=0.8809 — সত্যিই ১.০-এর কাছাকাছি, শুধু n=১২টি ছোট নমুনার কারণে সামান্য পার্থক্যসহ।

প্র ০৩ ওয়েনার ফিল্টার আর L50-এর ম্যাচড ফিল্টার — দুটোই সিগন্যাল ও নয়েজের পরিসংখ্যানিক তথ্য ব্যবহার করে, কিন্তু ভিন্ন সমস্যা সমাধান করে। পার্থক্যটি ঠিক কোথায়?

ম্যাচড ফিল্টার একটি ডিটেকশন সমস্যা সমাধান করে — "একটি নির্দিষ্ট, জানা আকৃতির সিগন্যাল কোথায় (বা আদৌ) উপস্থিত?" — আউটপুট একটি অবস্থান/সিদ্ধান্ত। ওয়েনার ফিল্টার একটি এস্টিমেশন সমস্যা সমাধান করে — "নয়েজ সরিয়ে সিগন্যালের প্রকৃত মান কত ছিল?" — আউটপুট একটি সংখ্যাসূচক মান (বা সিকোয়েন্স)। দুটোই একই পরিসংখ্যানিক ভিত্তির (L48-L49) উপর দাঁড়িয়ে, কিন্তু "কোথায়" প্রশ্নের উত্তর ম্যাচড ফিল্টার দেয়, "কত" প্রশ্নের উত্তর ওয়েনার ফিল্টার দেয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে signal_var = 4.0 রেখে noise_var -কে 4.0-এ বদলালে (সিগন্যাল ও নয়েজ সমান শক্তিশালী) $G$ কত হবে বলে আপনার ধারণা?

    $G = 4.0/(4.0+4.0) = 4.0/8.0 = \mathbf{0.5}$ — যখন সিগন্যাল ও নয়েজ সমান শক্তিশালী, ওয়েনার ফিল্টার অবজারভেশনকে ঠিক অর্ধেক বিশ্বাস করে, বাকিটা শূন্যের দিকে টানে। এটি L49-এর SNR=0 dB (সিগন্যাল ও নয়েজ পাওয়ার সমান) পরিস্থিতির সাথে সরাসরি সংযুক্ত।

  2. পরীক্ষা করুন: কোড সেলে noise_var-কে ৪.০-এ বদলে Run চেপে আপনার হিসেব যাচাই করুন এবং নতুন MSE উন্নতির অনুপাত পর্যবেক্ষণ করুন।

    রান করলে $G=0.5$ দেখাবে, এবং যেহেতু নয়েজ এখন আরও বড় (var=4.0, আগে ছিল ১.০), raw est-এর MSE অনেক বেড়ে যাবে (নয়েজের ভ্যারিয়েন্স বৃদ্ধির কারণে), কিন্তু ওয়েনার এস্টিমেট এখনও ধারাবাহিকভাবে raw est-এর চেয়ে কম MSE দেখাবে — উন্নতির অনুপাতও সাধারণত বাড়বে, কারণ নয়েজ যত বেশি প্রাধান্য পায়, অবজারভেশনকে সরাসরি বিশ্বাস না করে শূন্যের দিকে টানার সুবিধা তত বেশি হয়।

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

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