পাঠ ০৬ · ৫৭-এর মধ্যে · মডিউল ২
Home / Courses / Digital Signal Processing / অ্যালিয়াসিং

অ্যালিয়াসিং — কারণ ও প্রতিরোধ

Aliasing — causes & prevention
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ফোল্ডিং ফ্রিকোয়েন্সি ঠিক কীভাবে গণনা হয়, এবং কেন এটি নাইকুইস্ট ফ্রিকোয়েন্সির চারপাশে "আয়নার মতো" আচরণ করে
  • সত্যিকারের কোড দিয়ে ফোল্ডিং প্যাটার্নের একটি সম্পূর্ণ টেবিল তৈরি ও ব্যাখ্যা করা
  • বাস্তব জীবনের অ্যালিয়াসিং উদাহরণ চেনা (অডিও, ভিডিও, সেন্সর ডেটা)
  • anti-aliasing ফিল্টার কেন এবং কোথায় বসাতে হয়

১ · ফোল্ডিং কীভাবে কাজ করে

L05-এ আমরা দেখেছি একটি সিগন্যাল $f_{true}$-কে $f_s$ রেটে স্যাম্পল করলে, স্যাম্পলগুলো একটি "অ্যালিয়াসড" ফ্রিকোয়েন্সি $f_{alias}$-এর সমান হয়ে যায়, যেখানে:

$$f_{alias} = f_{true} - k \cdot f_s, \qquad k = \text{round}(f_{true}/f_s)$$

এই সূত্রটি আসলে $f_{true}$-কে $f_s$-এর নিকটতম গুণিতকের সাপেক্ষে "মুড়িয়ে" (fold) দেয়। যখন $|f_{alias}|$-কে আপাত ফ্রিকোয়েন্সি (apparent frequency) হিসেবে ধরা হয় — অর্থাৎ স্যাম্পলগুলো দেখে যে ফ্রিকোয়েন্সিটাকে "মনে হবে" আসল — তখন একটি নির্দিষ্ট প্যাটার্ন দেখা যায়, যা নিচের কোড সেলে সরাসরি গণনা করে দেখানো হচ্ছে।

২ · সত্যিকারের ডেমো — ফোল্ডিং প্যাটার্ন

স্যাম্পল রেট $f_s=100$ Hz ফিক্সড রেখে, $f_{true}$-কে ০ থেকে ২০০ Hz পর্যন্ত ২০ Hz করে বাড়িয়ে প্রতিটির জন্য আপাত ফ্রিকোয়েন্সি গণনা করা হচ্ছে (এটি L01 ও L05-এর একক-উদাহরণ ডেমো থেকে সম্পূর্ণ ভিন্ন — এখানে একটি সিরিজ ফ্রিকোয়েন্সি নিয়ে প্যাটার্ন দেখানো হচ্ছে)।

Python
import math

fs = 100.0          # ফিক্সড স্যাম্পল রেট (Hz)
nyq = fs / 2         # নাইকুইস্ট ফ্রিকোয়েন্সি

freqs = list(range(0, 210, 20))   # ক্রমবর্ধমান প্রকৃত ফ্রিকোয়েন্সি, 0 থেকে 200 Hz

print(f"fs = {fs} Hz,  নাইকুইস্ট ফ্রিকোয়েন্সি = {nyq} Hz")
print(f"{'f_true':>7} | {'k':>3} | {'f_alias':>9} | {'apparent':>9}")
for f in freqs:
    k = round(f / fs)
    f_alias = f - k * fs
    apparent = abs(f_alias)
    print(f"{f:>7} | {k:>3} | {f_alias:>9.1f} | {apparent:>9.1f}")

    
টেবিলের apparent কলামটি লক্ষ্য করুন — $0 \to 20 \to 40$ (বাড়ছে), তারপর $60$-এ পৌঁছে উল্টে যায় ($40 \to 20 \to 0$ আবার $100$ Hz-এ), তারপর আবার বাড়া শুরু করে ($20 \to 40$), আবার উল্টায় $160$ Hz-এ। এটাই "ফোল্ডিং" — আপাত ফ্রিকোয়েন্সি নাইকুইস্ট ফ্রিকোয়েন্সি (৫০ Hz) ও $f_s$-এর পূর্ণসংখ্যা গুণিতক (০, ১০০, ২০০ Hz)-এর মধ্যে একটি ত্রিভুজাকার তরঙ্গের মতো দোদুল্যমান হয় — ঠিক যেমন একটি আয়নায় প্রতিফলন ৫০ Hz এবং $k×100$ Hz বিন্দুগুলোতে ঘটছে।

৩ · বাস্তব জীবনে অ্যালিয়াসিং

চাকা উল্টো ঘোরা
ভিডিওতে দ্রুত ঘোরা চাকা — ফ্রেম-রেট হলো $f_s$, চাকার ঘূর্ণন-হার হলো $f_{true}$; L01-এ বিস্তারিত।
অডিও রেকর্ডিং
মানুষের কান ~২০ kHz পর্যন্ত শোনে, তাই CD-মানের অডিও ৪৪.১ kHz-এ স্যাম্পল হয় ($>2×20$ kHz) — anti-aliasing ফিল্টার ছাড়া উচ্চ ফ্রিকোয়েন্সি নয়েজ শ্রুতিগোচর নিম্ন ফ্রিকোয়েন্সিতে ফোল্ড হয়ে যেত।
সেন্সর ডেটা
একটি তাপমাত্রা বা কম্পন সেন্সর যদি ধীরে স্যাম্পল করা হয় কিন্তু পরিবেশে দ্রুত পরিবর্তনশীল নয়েজ থাকে, সেই নয়েজ ফোল্ড হয়ে আসল ডেটার সাথে মিশে যেতে পারে।

৪ · প্রতিরোধ — Anti-Aliasing ফিল্টার

যেহেতু অ্যালিয়াসিং স্যাম্পলিং মুহূর্তেই তথ্য ধ্বংস করে (L05), ডিজিটাল ডোমেইনে এসে সংশোধনের কোনো উপায় নেই। একমাত্র সমাধান — স্যাম্পলিং-এর আগেই, কন্টিনিউয়াস (অ্যানালগ) সিগন্যালে একটি anti-aliasing ফিল্টার (একটি লো-পাস অ্যানালগ ফিল্টার, cutoff প্রায় $f_s/2$-এ) বসিয়ে নাইকুইস্ট ফ্রিকোয়েন্সির বাইরের সব উপাদান আগেই দুর্বল করে দেওয়া। এই ফিল্টার ডিজাইনের বিস্তারিত গণিত M7-M8-এ (FIR/IIR ফিল্টার ডিজাইন) কভার হবে; এখানে মূল কথা হলো — ফিল্টারটি অবশ্যই ADC-এর আগে, অ্যানালগ ডোমেইনে বসাতে হবে, ডিজিটাইজেশনের পরে নয়।

মূল কথা · Key takeaway

অ্যালিয়াসিং একটি "ফোল্ডিং" ঘটনা — নাইকুইস্ট ফ্রিকোয়েন্সির চারপাশে একটি পূর্বানুমানযোগ্য, ত্রিভুজাকার প্যাটার্নে ফ্রিকোয়েন্সি প্রতিফলিত হয়, যা উপরের কোড সেল সরাসরি গণনা করে দেখিয়েছে। প্রতিরোধ শুধুমাত্র স্যাম্পলিং-এর আগেই সম্ভব — এই নীতিটি L08-এ ADC/DAC পাইপলাইনের একটি আবশ্যিক ধাপ হিসেবে ফিরে আসবে।

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

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

প্র ০১ উপরের টেবিলে $f_{true}=100$ Hz-এ আপাত ফ্রিকোয়েন্সি ঠিক ০ Hz দেখাচ্ছে। এর ব্যাখ্যা কী?

$f_s=100$ Hz-এ ঠিক $f_s$-এর সমান একটি সিগন্যাল প্রতিটি স্যাম্পল একই দশা (phase)-তে ধরা পড়ে — অর্থাৎ স্যাম্পলগুলো একটি স্থির (DC, ০ Hz) সিগন্যালের মতো দেখতে হয়ে যায়। কোডে $k=\text{round}(100/100)=1$, $f_{alias}=100-100=0$ — এটাই একটি চরম কিন্তু গুরুত্বপূর্ণ কেস: স্যাম্পল রেটের ঠিক সমান ফ্রিকোয়েন্সি সম্পূর্ণভাবে "অদৃশ্য" হয়ে একটি ধ্রুবক সংকেতে পরিণত হয়।

প্র ০২ ফোল্ডিং প্যাটার্নটি কেন $50$ Hz (নাইকুইস্ট) ও $100$ Hz ($f_s$) — দুটো ভিন্ন বিন্দুতেই "উল্টায়"?

$50$ Hz-এ (নাইকুইস্ট) আপাত ফ্রিকোয়েন্সি সর্বোচ্চ মান ($50$) স্পর্শ করে, কারণ এর বেশি ফ্রিকোয়েন্সি আর "নতুন" থাকে না — ৬০ Hz আসলে ৪০ Hz-এর মতোই দেখতে ($100-60=40$)। আবার $100$ Hz-এ ($f_s$) আপাত ফ্রিকোয়েন্সি সর্বনিম্ন মান (০) স্পর্শ করে, কারণ এখানে $k$ একধাপ বেড়ে ($0 \to 1$) সাইকেল আবার নতুন করে শুরু হয়। এই দুটো বিন্দু — $f_s/2$ ও $f_s$ (এবং তাদের গুণিতক) — ফোল্ডিং তরঙ্গের যথাক্রমে চূড়া ও তলদেশ।

প্র ০৩ একটি ডিজিটাল লো-পাস ফিল্টার (ADC-এর পরে প্রয়োগ করা) কি অ্যালিয়াসিং ঠিক করে দিতে পারে?

না। একবার ADC ভুল ফ্রিকোয়েন্সিতে স্যাম্পল রেকর্ড করে ফেললে, সেই ভুল ফ্রিকোয়েন্সিই এখন "তথ্য" — ডিজিটাল ফিল্টার কেবল ইতিমধ্যে রেকর্ড হওয়া (ভুল) স্যাম্পলগুলোর উপর কাজ করতে পারে, আসল হারানো তথ্য পুনরুদ্ধার করতে পারে না (L05-এর থিওরেম অনুযায়ী)। তাই anti-aliasing ফিল্টার অবশ্যই অ্যানালগ ডোমেইনে, ADC-এর আগে বসাতে হবে।

অনুশীলন

  1. চিন্তা করুন: $f_s=100$ Hz ফিক্সড রেখে, $f_{true}=230$ Hz-এর জন্য আপাত ফ্রিকোয়েন্সি কত হবে বলে আপনার ধারণা? সূত্র ($k=\text{round}(f/f_s)$, $f_{alias}=f-kf_s$) ব্যবহার করে হিসেব করুন।

    $k=\text{round}(230/100)=\text{round}(2.3)=2$, তাই $f_{alias}=230-2×100=30$ Hz — আপাত ফ্রিকোয়েন্সি $|30|=30$ Hz।

  2. পরীক্ষা করুন: উপরের কোড সেলের freqs লিস্টে 230 যোগ করে (বা range(0, 210, 20)-কে range(0, 240, 20)-এ পরিবর্তন করে) Run চেপে আপনার হিসেব যাচাই করুন।

    রান করলে সত্যিই k=2, f_alias=30.0, apparent=30.0 দেখাবে — অর্থাৎ ২৩০ Hz সিগন্যাল ৩০ Hz সিগন্যালের মতো দেখতে হয়ে যায়, ঠিক যেমন টেবিলের ৩০ Hz-এর (ইন্টারপোলেটেড) প্যাটার্নের সাথে সামঞ্জস্যপূর্ণ — ত্রিভুজাকার ফোল্ডিং চক্র প্রতি ১০০ Hz-এ পুনরাবৃত্তি হয়।

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

আগের পাঠ
স্যাম্পলিং থিওরেম (নাইকুইস্ট-শ্যানন)