জিরো-প্যাডিং ও ফ্রিকোয়েন্সি রেজোলিউশন
এই পাঠে যা শিখবেন
- জিরো-প্যাডিং কী এবং এটি স্পেকট্রামে কী প্রভাব ফেলে (বিনের ঘনত্ব বনাম রেজোলিউশন)
- কেন প্রকৃত রেজোলিউশন নির্ভর করে ডেটার সময়কাল ($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 ব্যবধানের চেয়ে বেশি, তাই তাত্ত্বিকভাবেই আলাদা করা কঠিন)।
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}")
৩ · প্রকৃত সমাধান — বেশি প্রকৃত স্যাম্পল
এবার একই দুটো ফ্রিকোয়েন্সি ($6$ Hz, $7$ Hz) নিয়ে, কিন্তু জিরো যোগ না করে সত্যিই $N=64$টি প্রকৃত স্যাম্পল নেওয়া যাক (সময়কাল $64/32=2.0$ সেকেন্ড, রেজোলিউশন $1/T=0.5$ Hz — যা $1$ Hz ব্যবধানের চেয়ে ভালো/সূক্ষ্ম)।
# উপরের কোষের 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}")
জিরো-প্যাডিং আর প্রকৃত স্যাম্পল বাড়ানো — দুটোই স্পেকট্রামে "বেশি বিন" দেয়, কিন্তু গুণগতভাবে সম্পূর্ণ আলাদা: প্যাডিং শুধু বিদ্যমান তথ্যকে ঘনভাবে ইন্টারপোলেট করে (কোনো নতুন রেজলভিং ক্ষমতা নেই), আর প্রকৃত স্যাম্পল নতুন পর্যবেক্ষণ সময় যোগ করে (প্রকৃত রেজলভিং ক্ষমতা বাড়ে)। 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 স্যাম্পল।
অনুশীলন
-
চিন্তা করুন: যদি $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 দিয়েই দুটো পরিষ্কার আলাদা পিক দেখা যেত।
-
পরীক্ষা করুন: উপরের প্রথম কোড সেলে
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-এ আপনার পরবর্তী পদক্ষেপ
- কেন FFT — DFT-এর কম্পিউটেশনাল কমপ্লেক্সিটি পরবর্তী পাঠ · M৬ M৫-এর সমাপ্তি, M৬-এর শুরু — এই পাঠের $O(N^2)$ সরাসরি DFT-কে $O(N\log N)$-এ কমানোর অ্যালগরিদম FFT-এর প্রয়োজনীয়তা।
- উইন্ডোয়িং ও স্পেকট্রাল লিকেজ M৫ লিকেজ কমানোর কৌশল — এই পাঠের রেজোলিউশন প্রশ্ন থেকে ভিন্ন কিন্তু সম্পর্কিত একটি সমস্যা।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M৬-এ FFT, M৭-M৮-এ ফিল্টার ডিজাইন, M১০-এ স্পেকট্রাল এস্টিমেশন — সবকিছুতে M৫-এর এই ধারণাগুলো ফিরে আসবে।