পাঠ ২৫ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Digital Signal Processing / ফ্রিকোয়েন্সি-ডোমেইন অ্যানালাইসিস

জিরো-প্যাডিং ও ফ্রিকোয়েন্সি রেজোলিউশন

Zero-padding & frequency resolution
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • জিরো-প্যাডিং কী এবং এটি স্পেকট্রামে কী প্রভাব ফেলে (বিনের ঘনত্ব বনাম রেজোলিউশন)
  • কেন প্রকৃত রেজোলিউশন নির্ভর করে ডেটার সময়কাল ($N/f_s$)-এর উপর, প্যাডিংয়ের উপর নয়
  • একটি সংখ্যাগত ডেমোতে জিরো-প্যাডিং কীভাবে দুটো কাছাকাছি ফ্রিকোয়েন্সি আলাদা করতে ব্যর্থ হয়
  • একই উদাহরণে বেশি প্রকৃত স্যাম্পল ব্যবহার করে প্রকৃত রেজোলিউশন বাড়ানোর তুলনা

১ · জিরো-প্যাডিং কী

জিরো-প্যাডিংZero-PaddingDFT নেওয়ার আগে একটি সিগন্যালের শেষে কৃত্রিম শূন্য মান যোগ করে তার দৈর্ঘ্য বাড়ানো — স্পেকট্রামে বেশি বিন দেয়, কিন্তু নতুন তথ্য যোগ করে না। মানে সহজ — একটি $N$-স্যাম্পলের সিগন্যালের শেষে কিছু শূন্য যোগ করে এটিকে $N_\text{pad}$ দৈর্ঘ্যে (যেমন $N_\text{pad} = 2N$ বা $4N$) বাড়ানো, তারপর সেই দীর্ঘ সিগন্যালের উপর DFT নেওয়া। যেহেতু বিন রেজোলিউশন $f_s/N_\text{pad}$, বড় $N_\text{pad}$ মানে ছোট বিন-ব্যবধান — অর্থাৎ স্পেকট্রামে বেশি, ঘনতর পয়েন্ট।

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

প্রকৃত রেজোলিউশন
দুটো ফ্রিকোয়েন্সিকে আলাদা করার ক্ষমতা মোটামুটিভাবে $1/T$ (যেখানে $T=N/f_s$, প্রকৃত ডেটার সময়কাল) — শুধুমাত্র বেশি প্রকৃত স্যাম্পল নিলেই ($T$ বাড়িয়ে) এটি উন্নত হয়।
বিনের ঘনত্ব
জিরো-প্যাডিং শুধু বিন-থেকে-বিনের ব্যবধান কমায় ($f_s/N_\text{pad}$) — একটি ইন্টারপোলেশনের মতো, বিদ্যমান তথ্যকে আরও মসৃণভাবে দেখানো, নতুন তথ্য নয়।
কখন প্যাডিং কাজে লাগে
একটি একক পিকের অবস্থান আরও নির্ভুলভাবে interpolate করতে (মসৃণ দেখতে), অথবা FFT-এর জন্য দৈর্ঘ্য $2$-এর ঘাত করতে (M৬-এ দরকার) — কিন্তু দুটো কাছাকাছি ফ্রিকোয়েন্সি আলাদা করতে নয়।

২ · একটি সত্যিকারের ব্যর্থতা — জিরো-প্যাডিং দিয়ে রেজোলিউশন বাড়ে না

নিচের কোডে দুটো কাছাকাছি ফ্রিকোয়েন্সি — $6$ Hz ও $7$ Hz (মাত্র $1$ Hz ব্যবধান) — মিশিয়ে একটি সিগন্যাল তৈরি করা হয়েছে, $f_s=32$ Hz-এ মাত্র $N=16$টি প্রকৃত স্যাম্পল নিয়ে (সময়কাল $T=16/32=0.5$ সেকেন্ড, তাই মোটামুটি রেজোলিউশন $1/T=2$ Hz — যা $1$ Hz ব্যবধানের চেয়ে বেশি, তাই তাত্ত্বিকভাবেই আলাদা করা কঠিন)।

Python
import cmath, math

fs = 32.0
f1, f2 = 6.0, 7.0  # মাত্র ১ Hz ব্যবধানে দুটো কাছাকাছি ফ্রিকোয়েন্সি

def dft(x):
    N = len(x)
    return [sum(x[n] * cmath.exp(-2j * math.pi * k * n / N) for n in range(N)) for k in range(N)]

def signal(N):
    return [math.sin(2*math.pi*f1*n/fs) + math.sin(2*math.pi*f2*n/fs) for n in range(N)]

def zero_pad(x, N_pad):
    return x + [0.0] * (N_pad - len(x))

N_short = 16
x_short = signal(N_short)
print(f"শুধু {N_short}টি প্রকৃত স্যাম্পল, সময়কাল={N_short/fs}s")

for N_pad in [16, 32, 64, 128]:
    xp = zero_pad(x_short, N_pad)
    Xp = dft(xp)
    magp = [abs(v) for v in Xp]
    print(f"\nজিরো-প্যাড N={N_pad} (বিন ব্যবধান {fs/N_pad:.3f} Hz), এখনও {N_short}টি প্রকৃত স্যাম্পল:")
    lo, hi = int(4*N_pad/fs), int(10*N_pad/fs)
    for k in range(lo, hi+1, max(1, (hi-lo)//8)):
        print(f"  freq={k*fs/N_pad:6.2f} Hz  |X[k]|={magp[k]:7.3f}")

    
$N_\text{pad}=16$ (কোনো প্যাডিং নেই)-এ ম্যাগনিটিউড $k=3$ ($6.00$ Hz)-এ $9.557$ আর $k=4$ ($8.00$ Hz)-এ $5.027$ — কোনো পরিষ্কার আলাদা দুটো পিক নেই, শুধু একটি অসম চূড়া। $N_\text{pad}$ বাড়িয়ে $32$, $64$, এমনকি $128$ করলেও — স্পেকট্রামে বেশি পয়েন্ট দেখা যায় ঠিকই ($128$-এ প্রতি $0.25$ Hz-এ একটি পয়েন্ট), কিন্তু সবসময় একটি একক মসৃণ চূড়া দেখা যায়, সর্বোচ্চ মান $\approx 6.5$ Hz-এর কাছে ($10.152$)। জিরো-প্যাডিং যতই বাড়ানো হোক না কেন, $6$ Hz আর $7$ Hz কখনও দুটো আলাদা পিক হিসেবে দেখা যায় না — কারণ প্যাডিং শুধু একই অন্তর্নিহিত (অ-রেজলভড) DTFT বক্ররেখাকে আরও ঘনভাবে স্যাম্পল করছে, নতুন তথ্য যোগ করছে না।

৩ · প্রকৃত সমাধান — বেশি প্রকৃত স্যাম্পল

এবার একই দুটো ফ্রিকোয়েন্সি ($6$ Hz, $7$ Hz) নিয়ে, কিন্তু জিরো যোগ না করে সত্যিই $N=64$টি প্রকৃত স্যাম্পল নেওয়া যাক (সময়কাল $64/32=2.0$ সেকেন্ড, রেজোলিউশন $1/T=0.5$ Hz — যা $1$ Hz ব্যবধানের চেয়ে ভালো/সূক্ষ্ম)।

Python
# উপরের কোষের fs, dft(), signal() ব্যবহার করে --
N_long = 64
x_long = signal(N_long)
print(f"এবার {N_long}টি প্রকৃত স্যাম্পল, সময়কাল={N_long/fs}s, বিন ব্যবধান {fs/N_long} Hz")

X_long = dft(x_long)
mag_long = [abs(v) for v in X_long]

lo, hi = int(4*N_long/fs), int(10*N_long/fs)
print(f"{'freq (Hz)':>9} | {'|X[k]|':>8}")
for k in range(lo, hi+1):
    print(f"{k*fs/N_long:9.2f} | {mag_long[k]:8.3f}")

    
এবার ফলাফল সম্পূর্ণ ভিন্ন: বিন ব্যবধান $0.5$ Hz, আর স্পেকট্রামে $6.00$ Hz-এ $|X[k]|=32.000$ (পূর্ণ পিক), $6.50$ Hz-এ ঠিক $0.000$ (সম্পূর্ণ শূন্য!), এবং $7.00$ Hz-এ আবার $|X[k]|=32.000$ — দুটো ফ্রিকোয়েন্সি এখন একটি সম্পূর্ণ-শূন্য বিন দিয়ে পরিষ্কারভাবে বিভক্ত, নিখুঁতভাবে রেজলভড। এটাই প্রমাণ করে: প্যাডিং নয়, বেশি প্রকৃত স্যাম্পল (দীর্ঘতর পর্যবেক্ষণ সময়)-ই একমাত্র উপায় যা প্রকৃতপক্ষে দুটো কাছাকাছি ফ্রিকোয়েন্সিকে আলাদা করতে পারে।
মূল কথা · Key takeaway

জিরো-প্যাডিং আর প্রকৃত স্যাম্পল বাড়ানো — দুটোই স্পেকট্রামে "বেশি বিন" দেয়, কিন্তু গুণগতভাবে সম্পূর্ণ আলাদা: প্যাডিং শুধু বিদ্যমান তথ্যকে ঘনভাবে ইন্টারপোলেট করে (কোনো নতুন রেজলভিং ক্ষমতা নেই), আর প্রকৃত স্যাম্পল নতুন পর্যবেক্ষণ সময় যোগ করে (প্রকৃত রেজলভিং ক্ষমতা বাড়ে)। M৫ (L২০-L২৫)-এর পুরো যাত্রা এখানে সম্পূর্ণ হলো — DTFT থেকে DFT, সিমেট্রি ও পিরিয়ডিসিটি, লিকেজ ও উইন্ডোয়িং, আর এখন রেজোলিউশনের প্রকৃত অর্থ। M৬-এ আমরা এই একই DFT ধারণাগুলোকে অনেক দ্রুততর একটি অ্যালগরিদম — FFT — দিয়ে বাস্তবায়ন করব।

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

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

প্র ০১ উপরের ডেমোতে $N=64$-এ $6.5$ Hz বিনে ম্যাগনিটিউড ঠিক $0.000$ কেন — এটা কি কাকতালীয়?

না, কাকতালীয় নয়। $6$ Hz আর $7$ Hz উভয়ই $N=64$, $f_s=32$-এর বিন-গ্রিডে ($f_s/N=0.5$ Hz) ঠিক পড়ে ($k=12$ ও $k=14$)। L২৩-এর মতোই, DFT একটি অর্থোগোনাল বেসিস — আলাদা বিন-ফ্রিকোয়েন্সির সাইন-তরঙ্গগুলো একে অপরের সাথে "অর্থোগোনাল" (কোনো ওভারল্যাপ নেই), তাই $6.5$ Hz বিনে (যেখানে কোনো প্রকৃত সিগন্যাল-কম্পোনেন্ট নেই এবং এটিও বিন-গ্রিডে পড়ে) ম্যাগনিটিউড ঠিক শূন্য হয় — L২২-এর ডেমোর মতোই একই কারণে।

প্র ০২ জিরো-প্যাডিং যদি রেজোলিউশন না বাড়ায়, তাহলে এটি আদৌ কখন উপকারী?

জিরো-প্যাডিং উপকারী যখন আপনার আগে থেকেই জানা আছে সিগন্যালে একটি একক ফ্রিকোয়েন্সি আছে (বা রেজলভযোগ্য দূরত্বে আলাদা ফ্রিকোয়েন্সি) এবং আপনি সেই পিকের অবস্থান আরও নির্ভুলভাবে (ইন্টারপোলেশনের মাধ্যমে) পড়তে চান — যেমন উপরের L২৫ কোডেই, প্যাডিং করলে চূড়ার আকৃতি আরও মসৃণভাবে দেখা যায় ($6.5$ Hz-এর কাছে সর্বোচ্চ)। এছাড়া M৬-এ FFT অ্যালগরিদমের জন্য সিগন্যাল দৈর্ঘ্য $2$-এর ঘাত করতেও জিরো-প্যাডিং ব্যবহার করা হয় — কিন্তু কোনো ক্ষেত্রেই এটি দুটো কাছাকাছি প্রকৃত ফ্রিকোয়েন্সিকে "আলাদা করে দেখাতে" পারে না।

প্র ০৩ L২৪-এর উইন্ডোয়িং আর এই পাঠের জিরো-প্যাডিং — দুটোই DFT নেওয়ার আগে সিগন্যাল "প্রক্রিয়া" করে। এই দুটো কৌশল কি একই সমস্যা সমাধান করে?

না, দুটো সম্পূর্ণ ভিন্ন সমস্যার সমাধান করে। উইন্ডোয়িং (L২৪) লিকেজ কমায় — একটি একক ফ্রিকোয়েন্সির শক্তি কতটা "ছড়িয়ে" পড়ছে তা নিয়ন্ত্রণ করে। জিরো-প্যাডিং (এই পাঠ) রেজোলিউশন বাড়ায় না — এটি শুধু বিদ্যমান স্পেকট্রামকে ঘনভাবে দেখায়। একটি সিস্টেমে উভয় কৌশল একসাথে ব্যবহার করা যায় (উইন্ডো প্রয়োগ করে তারপর জিরো-প্যাড করে DFT নেওয়া), কিন্তু তারা একে অপরের বিকল্প নয় — রেজোলিউশনের একমাত্র প্রকৃত সমাধান বেশি real স্যাম্পল।

অনুশীলন

  1. চিন্তা করুন: যদি $f_1=6$ Hz, $f_2=7$ Hz-এর বদলে $f_1=6$ Hz, $f_2=10$ Hz (৪ Hz ব্যবধান) ব্যবহার করা হতো, তাহলে $N=16$ প্রকৃত স্যাম্পল (রেজোলিউশন $2$ Hz)-এই কি এই দুটো ফ্রিকোয়েন্সি আলাদা হয়ে যেত বলে আপনার ধারণা?

    হ্যাঁ, সম্ভবত হতো — কারণ $4$ Hz ব্যবধান, $N=16$-এর রেজোলিউশন ($2$ Hz)-এর চেয়ে বেশি, এবং $6$ Hz ও $10$ Hz উভয়ই এই রেজোলিউশনের বিন-গ্রিডে ঠিক পড়ে ($k=3$ ও $k=5$)। L২২-এর ৮ Hz/২০ Hz ডেমোর মতোই এটি একটি "সহজ" ক্ষেত্র হতো — কোনো জিরো-প্যাডিং ছাড়াই $N=16$ স্যাম্পলে সরাসরি DFT দিয়েই দুটো পরিষ্কার আলাদা পিক দেখা যেত।

  2. পরীক্ষা করুন: উপরের প্রথম কোড সেলে f2 = 7.0-কে f2 = 10.0-এ বদলে (এবং f1 = 6.0 অপরিবর্তিত রেখে) রান করুন — $N_\text{pad}=16$ (কোনো প্যাডিং নেই)-এই কি দুটো আলাদা পিক দেখা যায়?

    রান করলে $N_\text{pad}=16$-এই $k=3$ ($6.00$ Hz) আর $k=5$ ($10.00$ Hz)-এ দুটো স্পষ্ট আলাদা পিক দেখাবে (মাঝে $k=4$, $8.00$ Hz-এ তুলনামূলক কম ম্যাগনিটিউড) — অর্থাৎ যখন ফ্রিকোয়েন্সি-ব্যবধান রেজোলিউশনের চেয়ে বেশি এবং বিন-গ্রিডে পড়ে, তখন সামান্য স্যাম্পল ($N=16$)-দিয়েই রেজলভ করা সম্ভব — এই পাঠের মূল শিক্ষা নিশ্চিত করে: সমস্যাটা "কম বিন" নয়, বরং "কম প্রকৃত রেজোলিউশন" ($1$ Hz ব্যবধান বনাম $2$ Hz রেজোলিউশন সীমা)।

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

আগের পাঠ
উইন্ডোয়িং ও স্পেকট্রাল লিকেজ