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

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

Noise & signal-to-noise ratio
১০ মিনিট পড়া মধ্যম-উচ্চ · Intermediate-Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • নয়েজের সাধারণ additive মডেল — $y[n] = x[n] + w[n]$
  • সিগন্যাল পাওয়ার ও নয়েজ পাওয়ার কীভাবে মান-বর্গের গড় হিসেবে গণনা করা হয়
  • SNR-এর dB সূত্র এবং কেন dB স্কেল ব্যবহারিকভাবে সুবিধাজনক
  • একটি সত্যিকারের ডেমো — বিভিন্ন নয়েজ পাওয়ারে গণনা করা SNR-এর প্রকৃত প্রবণতা

১ · নয়েজ ও Additive মডেল

ব্যবহারিক DSP-তে প্রায় প্রতিটি পরিমাপ করা সিগন্যালই কিছুটা নয়েজ নিয়ে আসে — সেন্সরের থার্মাল ওঠানামা, ADC-এর কোয়ান্টাইজেশন এরর (M2/L07-এ বিস্তারিত), বা যোগাযোগ চ্যানেলের হস্তক্ষেপ। সবচেয়ে সাধারণ ও ব্যবহারিক মডেল হলো additive noise:

$$y[n] = x[n] + w[n]$$

যেখানে $x[n]$ হলো প্রকৃত (ক্লিন) সিগন্যাল আর $w[n]$ হলো নয়েজ — সাধারণত একটি জিরো-মিন র‍্যান্ডম প্রসেস হিসেবে মডেল করা হয় (L48-এর ভাষায়, একটি স্টেশনারি র‍্যান্ডম প্রসেস)। DSP-তে সবচেয়ে বহুল ব্যবহৃত নয়েজ মডেল হলো AWGNAdditive White Gaussian Noise — প্রতিটি স্যাম্পলে স্বাধীনভাবে যোগ হওয়া গসিয়ান-বিতরণকৃত, জিরো-মিন র‍্যান্ডম নয়েজ, যার পাওয়ার স্পেকট্রাম সব ফ্রিকোয়েন্সিতে সমান ("সাদা")। — Python-এ যা random.gauss(0.0, sigma) দিয়ে সিমুলেট করা হয়, ঠিক যেমনটা L48-এ ব্যবহার করা হয়েছিল।

২ · সিগন্যাল পাওয়ার ও নয়েজ পাওয়ার

DSP-তে "পাওয়ার" মানে মান-বর্গের গড় (mean square) — একটি $N$-দৈর্ঘ্যের সিকোয়েন্স $x[n]$-এর পাওয়ার:

$$P_x = \frac{1}{N}\sum_{n=0}^{N-1} x[n]^2$$

একই সূত্র নয়েজের জন্যও প্রযোজ্য: $P_w = \frac{1}{N}\sum w[n]^2$। জিরো-মিন গসিয়ান নয়েজের জন্য, বড় $N$-এর সাথে এই নমুনা-পাওয়ার তাত্ত্বিক ভ্যারিয়েন্স $\sigma^2$-এর কাছাকাছি চলে আসে (L48-এর এরগোডিসিটি ধারণা অনুযায়ী) — কিন্তু ছোট, সসীম নমুনায় দুটো মান একেবারে সমান হবে না, এটাই আমাদের ডেমোতে দেখা যাবে।

৩ · SNR — ডেসিবেলে গণনা

$$\text{SNR}_{dB} = 10\log_{10}\!\left(\frac{P_{signal}}{P_{noise}}\right)$$

dB স্কেল ব্যবহারিকভাবে সুবিধাজনক কারণ এটি খুব বড় ও খুব ছোট রেশিওকে একটি কম্প্যাক্ট সংখ্যায় প্রকাশ করে — SNR ১০ গুণ বাড়লে dB মান ঠিক ১০ বাড়ে, ১০০ গুণ বাড়লে ২০ বাড়ে। নিচের কোড সেলে একটি স্থির ৫ Hz সাইন সিগন্যালে পাঁচটি ভিন্ন sigma-এর গসিয়ান নয়েজ (ফিক্সড সিড দিয়ে, প্রতিটি নয়েজ-লেভেলের জন্য একই সিড রিসেট করে যাতে তুলনা ন্যায্য হয়) যোগ করে প্রতিটির জন্য সত্যিকারের SNR গণনা করা হয়েছে।

Python
import math, random

fs = 100.0
N = 64
f0 = 5.0
clean = [math.sin(2 * math.pi * f0 * n / fs) for n in range(N)]
signal_power = sum(s * s for s in clean) / N
print(f"signal_power (ক্লিন সিগন্যালের মান-বর্গের গড়) = {signal_power:.6f}")
print()

noise_sigmas = [0.1, 0.3, 0.5, 1.0, 2.0]
print(f"{'noise sigma':>11} | {'তাত্ত্বিক var':>14} | {'নমুনা-পাওয়ার':>13} | {'SNR (dB)':>9}")
for sigma in noise_sigmas:
    random.seed(42)
    noise = [random.gauss(0.0, sigma) for _ in range(N)]
    noisy = [c + n for c, n in zip(clean, noise)]
    noise_power = sum(n * n for n in noise) / N
    snr_db = 10 * math.log10(signal_power / noise_power)
    print(f"{sigma:>11.2f} | {sigma**2:>14.4f} | {noise_power:>13.6f} | {snr_db:>9.3f}")

    
ক্লিন ৫ Hz সিগন্যালের নমুনা-পাওয়ার $P_{signal} = 0.485867$। sigma বাড়ার সাথে সাথে (০.১ → ০.৩ → ০.৫ → ১.০ → ২.০) নমুনা নয়েজ-পাওয়ারও বাড়ে (০.০০৭৪ → ০.০৬৭০ → ০.১৮৬১ → ০.৭৪৪৪ → ২.৯৭৭৫ — লক্ষ্য করুন প্রতিটি প্রায় sigma²-এর কাছাকাছি, যদিও N=৬৪ ছোট নমুনায় ছোট বিচ্যুতিসহ), এবং সেই সাথে গণনাকৃত SNR সত্যিই একঘেয়েভাবে (monotonically) কমে যায়: ১৮.১৪৭ dB → ৮.৬০৫ dB → ৪.১৬৮ dB → −১.৮৫৩ dB → −৭.৮৭৩ dB। ঋণাত্মক SNR মানে নয়েজ পাওয়ার সিগন্যাল পাওয়ারকে ছাড়িয়ে গেছে — অর্থাৎ সিগন্যালটি নয়েজের নিচে "চাপা পড়ে" গেছে, ঠিক যা L44-এর PSD পিরিয়ডোগ্রামে "নয়েজ ফ্লোরের উপরে চূড়া" হিসেবে দেখা গিয়েছিল তার বিপরীত অবস্থা।
মূল কথা · Key takeaway

SNR শুধু একটি বিমূর্ত সংখ্যা নয় — এটি সরাসরি নির্ধারণ করে একটি ডিটেক্টর বা ফিল্টার কতটা নির্ভরযোগ্যভাবে কাজ করতে পারবে। উচ্চ SNR-এ (যেমন ১৮ dB) সিগন্যাল সহজেই দৃশ্যমান, কিন্তু নিম্ন বা ঋণাত্মক SNR-এ (যেমন −৭.৯ dB) খালি চোখে সিগন্যাল খুঁজে পাওয়া প্রায় অসম্ভব — এখানেই L50-এর ম্যাচড ফিল্টার আর L51-এর ওয়েনার ফিল্টারের মতো টুল দরকার হয়, যেগুলো নয়েজের পরিসংখ্যানিক বৈশিষ্ট্য (L48) ব্যবহার করে সিগন্যালকে নয়েজ থেকে আলাদা করে।

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

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

প্র ০১ উপরের ডেমোতে প্রতিটি নয়েজ-লেভেলের আগে random.seed(42) আবার রিসেট করা হয়েছে। এটি না করলে (একবারই সিড সেট করে সবগুলো নয়েজ ক্রমান্বয়ে জেনারেট করলে) তুলনায় কী সমস্যা হতো?

সিড রিসেট না করলে প্রতিটি sigma-এর নয়েজ ভিন্ন ভিন্ন র‍্যান্ডম নাম্বার স্ট্রিম থেকে আসত — অর্থাৎ sigma=0.1-এর নয়েজ ও sigma=0.3-এর নয়েজ সম্পূর্ণ ভিন্ন এলোমেলো প্যাটার্ন হতো, তুলনাটা তখনও পরিসংখ্যানিকভাবে বৈধ থাকত (কারণ SNR গড় পাওয়ারের উপর ভিত্তি করে হিসাব হয়), কিন্তু প্রতিটি sigma-তে ঠিক একই "শেপ"-এর নয়েজ প্যাটার্ন প্রয়োগ করে তুলনা করা সম্ভব হতো না — সিড রিসেট করাটা নিশ্চিত করে যে শুধু sigma প্যারামিটার বদলাচ্ছে, নয়েজের র‍্যান্ডম প্যাটার্ন নয়, যা একটি পরিষ্কারতর "apples-to-apples" তুলনা দেয়।

প্র ০২ যদি ক্লিন সিগন্যালের ফ্রিকোয়েন্সি $f_0$ বদলে দেওয়া হয় (যেমন ৫ Hz থেকে ২০ Hz), কিন্তু sigma-গুলো একই রাখা হয়, তাহলে SNR মানগুলো বদলাবে কি না?

না, বদলাবে না — কারণ যেকোনো ফ্রিকোয়েন্সির একটি ইউনিট-অ্যামপ্লিটিউড সাইন-তরঙ্গের মান-বর্গের গড় সবসময় প্রায় ০.৫ (এই ছোট N=৬৪-এ ০.৪৮৫৮৬৭, যা $\frac12$-এর কাছাকাছি) — এটি ফ্রিকোয়েন্সির উপর নির্ভর করে না, শুধু অ্যামপ্লিটিউডের উপর নির্ভর করে। তাই $P_{signal}$ প্রায় অপরিবর্তিত থাকবে, আর যেহেতু নয়েজ পাওয়ারও sigma দিয়ে নির্ধারিত (ফ্রিকোয়েন্সি-নিরপেক্ষ), SNR মানগুলোও প্রায় একই থাকবে। ফ্রিকোয়েন্সি বদলালে SNR বদলাত যদি নয়েজ "রঙিন" (colored, নির্দিষ্ট ফ্রিকোয়েন্সিতে বেশি শক্তিশালী) হতো — কিন্তু এখানে ব্যবহৃত সাদা গসিয়ান নয়েজের ক্ষেত্রে তা হয় না।

প্র ০৩ SNR = ০ dB মানে কী?

$10\log_{10}(P_{signal}/P_{noise}) = 0$ মানে $P_{signal}/P_{noise} = 10^0 = 1$ — অর্থাৎ সিগন্যাল পাওয়ার ও নয়েজ পাওয়ার ঠিক সমান। উপরের সারণিতে sigma=1.0 (SNR=−1.853 dB) ও sigma=0.5 (SNR=4.168 dB)-এর মাঝামাঝি কোথাও ০ dB পয়েন্ট রয়েছে — সেই বিন্দুতে সিগন্যাল ও নয়েজ সমান শক্তিশালী, যা একটি ডিটেকশন সিস্টেমের জন্য একটি সাধারণ "কঠিন কিন্তু সম্ভব" বেঞ্চমার্ক পরিস্থিতি হিসেবে গণ্য হয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে noise_sigmas-এ 4.0 যোগ করলে (তাত্ত্বিক var=১৬.০) SNR আনুমানিক কত dB হবে বলে আপনার ধারণা? ইঙ্গিত: sigma দ্বিগুণ হলে var চারগুণ হয়, var চারগুণ হলে SNR প্রায় $10\log_{10}(4) \approx 6.02$ dB কমে।

    sigma=2.0-এর SNR ছিল −৭.৮৭৩ dB। sigma=4.0 হলে var চারগুণ (৪.০ → ১৬.০), তাই SNR আনুমানিক −৭.৮৭৩ − ৬.০২ ≈ −১৩.৯ dB হওয়া উচিত (নমুনা-বিচ্যুতির কারণে সামান্য ভিন্ন হতে পারে)।

  2. পরীক্ষা করুন: কোড সেলে noise_sigmas তালিকায় 4.0 যোগ করে Run চেপে আপনার হিসেব যাচাই করুন।

    রান করলে sigma=4.0-এর জন্য SNR প্রায় −১৩.৮৯ dB দেখাবে — আমাদের আনুমানিক হিসেবের (−১৩.৯ dB) খুব কাছাকাছি, ছোট পার্থক্যটি নমুনা-পাওয়ার তাত্ত্বিক ভ্যারিয়েন্স থেকে সামান্য ভিন্ন হওয়ার কারণে (N=৬৪ সসীম নমুনা)।

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

আগের পাঠ
র‍্যান্ডম সিগন্যাল — স্টেশনারিটি ও এরগোডিসিটি