উইন্ডোয়িং ও স্পেকট্রাল লিকেজ
এই পাঠে যা শিখবেন
- স্পেকট্রাল লিকেজ কেন ঘটে — একটি বাস্তব, সংখ্যাগত ডেমো দিয়ে
- হ্যামিং উইন্ডোর ক্লোজড-ফর্ম সূত্র এবং তা হাতে Python-এ গণনা করা
- উইন্ডো প্রয়োগ করা সিগন্যালের DFT (L২২-এর
dft()পুনর্ব্যবহার করে) নেওয়া - Rectangular বনাম Hamming উইন্ডোর লিকেজ সংখ্যাগতভাবে তুলনা করা
১ · লিকেজ কেন ঘটে — একটি সত্যিকারের উদাহরণ
L২২-L২৩-এ আমরা ফ্রিকোয়েন্সি দেখেছি যেগুলো ঠিক DFT-এর বিন-গ্রিডে পড়েছিল, তাই ফলাফল "পরিষ্কার" ছিল। বাস্তবে বেশিরভাগ সিগন্যালের ফ্রিকোয়েন্সি এত সৌভাগ্যবান হয় না। নিচের কোডে $f_s=32$ Hz, $N=32$ (বিন রেজোলিউশন $1$ Hz) সিগন্যালে একটি $5.5$ Hz সাইন-তরঙ্গ ব্যবহার করা হয়েছে — একটি ইচ্ছাকৃত অ-পূর্ণসংখ্যা বিন ফ্রিকোয়েন্সি ($k = 5.5/1 = 5.5$, পূর্ণসংখ্যা নয়)।
import cmath, math
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)]
fs = 32.0
N = 32
f0 = 5.5 # ইচ্ছাকৃতভাবে অ-পূর্ণসংখ্যা বিন ফ্রিকোয়েন্সি (বিন রেজোলিউশন fs/N = 1 Hz)
x = [math.sin(2 * math.pi * f0 * n / fs) for n in range(N)]
X_rect = dft(x) # rectangular window, অর্থাৎ কোনো উইন্ডো নেই
mag_rect = [abs(v) for v in X_rect]
print(f"সিগন্যাল: {f0} Hz সাইন-তরঙ্গ, fs={fs} Hz, N={N} (বিন রেজোলিউশন {fs/N} Hz)")
print(f"{'k':>3} | {'freq':>6} | {'rect |X[k]|':>12}")
for k in range(0, 9):
print(f"{k:3d} | {k*fs/N:6.1f} | {mag_rect[k]:12.4f}")
২ · উইন্ডো ফাংশন — সমাধান
লিকেজের কারণ: DFT আসলে ধরে নেয় সিগন্যালটি $N$ স্যাম্পলের বাইরে পর্যায়বৃত্তভাবে পুনরাবৃত্ত হচ্ছে (L২৩-এর পিরিয়ডিসিটি অনুযায়ী)। যদি $f_0$ ঠিক বিন-গ্রিডে না পড়ে, তাহলে সিগন্যালের শুরু ও শেষ প্রান্ত মসৃণভাবে জোড়া লাগে না — এই "ধারালো ভাঙন" (discontinuity) অতিরিক্ত ফ্রিকোয়েন্সি-কম্পোনেন্ট তৈরি করে, যা লিকেজ হিসেবে দেখা যায়। সমাধান: DFT নেওয়ার আগে সিগন্যালকে একটি উইন্ডো ফাংশনWindow Functionএকটি ওজন-ফাংশন যা সিগন্যালের প্রান্তগুলোকে ধীরে ধীরে শূন্যের দিকে নামিয়ে ধারালো ভাঙন এড়ায়, ফলে DFT-তে লিকেজ কমে। দিয়ে গুণ করা — যেমন হ্যামিং উইন্ডো:
$$w[n] = 0.54 - 0.46 \cos\!\left(\frac{2\pi n}{N-1}\right), \qquad n = 0, 1, \ldots, N-1$$এই ফাংশন $n=0$ ও $n=N-1$-এ ছোট (প্রান্তে) এবং মধ্যে বড় — সিগন্যালের প্রান্তগুলো শূন্যের কাছাকাছি নামিয়ে মসৃণভাবে জোড়া লাগায়।
# উপরের কোষের dft(), x, fs, N, mag_rect ব্যবহার করে --
def hamming(N):
return [0.54 - 0.46 * math.cos(2 * math.pi * n / (N - 1)) for n in range(N)]
w = hamming(N)
x_win = [x[n] * w[n] for n in range(N)]
X_win = dft(x_win)
mag_win = [abs(v) for v in X_win]
print(f"{'k':>3} | {'freq':>6} | {'rect |X[k]|':>12} | {'hamming |X[k]|':>15}")
for k in range(0, 9):
print(f"{k:3d} | {k*fs/N:6.1f} | {mag_rect[k]:12.4f} | {mag_win[k]:15.4f}")
# "দূরের" বিনে (মূল লোব থেকে দূরে, k=0-3 ও k=8-16) মোট লিকেজ তুলনা
far_bins = list(range(0, 4)) + list(range(8, 17))
leak_rect = sum(mag_rect[k] for k in far_bins)
leak_win = sum(mag_win[k] for k in far_bins)
print()
print(f"দূরের বিনগুলোতে মোট ম্যাগনিটিউড -- rectangular: {leak_rect:.4f}")
print(f"দূরের বিনগুলোতে মোট ম্যাগনিটিউড -- hamming: {leak_win:.4f}")
print(f"লিকেজ হ্রাসের অনুপাত: {leak_rect/leak_win:.1f}x কম")
উইন্ডোয়িং কোনো "জাদু সমাধান" নয় — এটি একটি ট্রেড-অফ যা লিকেজকে কমায় (দূরের বিনে শক্তির পরিমাণ) কিন্তু মূল লোবকে সামান্য চওড়া করে। বাস্তব DSP-তে (M৭-এ FIR ফিল্টার ডিজাইনে, M১০-এ STFT-তে) এই একই হ্যামিং সূত্র বারবার ব্যবহৃত হবে। L২৫-এ আমরা একটি সম্পর্কিত কিন্তু ভিন্ন প্রশ্নে যাব — জিরো-প্যাডিং কি রেজোলিউশন বাড়ায় (উত্তর: না, শুধু বিনের ঘনত্ব বাড়ায়)।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ হ্যামিং উইন্ডো সূত্রে $n=0$ ও $n=N-1$-এ $w[n]$-এর মান কত হবে বলে আপনার ধারণা, আর তা লিকেজ কমাতে কীভাবে সাহায্য করে?
$n=0$-এ $w[0] = 0.54 - 0.46\cos(0) = 0.54-0.46 = 0.08$। $n=N-1$-এ (এখানে $N=32$, তাই $n=31$) $\cos(2\pi \cdot 31/31) = \cos(2\pi) = 1$, তাই $w[31] = 0.08$-ও। অর্থাৎ উভয় প্রান্তে সিগন্যালের মান তার আসল মানের মাত্র $8\%$-এ নেমে আসে — প্রায় শূন্যের কাছাকাছি। এর ফলে সিগন্যালের "পর্যায়বৃত্ত পুনরাবৃত্তি" ধরে নিলেও প্রান্তগুলো প্রায় শূন্যে মিলিত হয়, তাই কোনো ধারালো ভাঙন থাকে না — এটাই লিকেজ কমার মূল কারণ।
প্র ০২ উপরের ডেমোতে $k=5$ (rectangular) $|X[5]|=10.4774$ ছিল, কিন্তু hamming-এ কমে $6.9513$ হয়েছে। এর মানে কি হ্যামিং উইন্ডো "খারাপ" — এটি সিগন্যালের প্রকৃত শক্তি কমিয়ে দিচ্ছে?
না, এটি সমস্যা নয় — এটি প্রত্যাশিত। উইন্ডো সিগন্যালের প্রান্তের অ্যামপ্লিটিউড কমিয়ে দেয় (গড়ে সিগন্যালের মোট "শক্তি" কমে যায়, কারণ $w[n] \leq 1$ সবসময়), তাই DFT-এর সামগ্রিক ম্যাগনিটিউডও কমবে। গুরুত্বপূর্ণ তুলনা পরম মান নয়, বরং মূল লোব বনাম দূরের বিনের অনুপাত — যা হ্যামিং-এ অনেক ভালো (কম লিকেজ)। বাস্তব প্রয়োগে (যেমন ফিল্টার ডিজাইন) প্রয়োজনে একটি স্বাভাবিকীকরণ (normalization) ফ্যাক্টর যোগ করে এই অ্যামপ্লিটিউড ক্ষতি সংশোধন করা যায়।
প্র ০৩ যদি সিগন্যালের ফ্রিকোয়েন্সি $f_0=5.5$ Hz-এর বদলে ঠিক $5.0$ Hz (একটি পূর্ণসংখ্যা বিন) হতো, উইন্ডোয়িং কি তখনও প্রয়োজনীয় হতো?
না, প্রয়োজন হতো না — L২২-এর ডেমোর মতোই, যদি ফ্রিকোয়েন্সি ঠিক একটি বিনে পড়ে, DFT-এর ধরে নেওয়া "পর্যায়বৃত্ত পুনরাবৃত্তি" সিগন্যালের প্রকৃত পিরিয়ডিসিটির সাথে ঠিক মিলে যায় (প্রান্তগুলো মসৃণভাবে জোড়া লাগে), তাই কোনো ধারালো ভাঙন হয় না এবং লিকেজও হয় না। কিন্তু বাস্তব সিগন্যালের প্রকৃত ফ্রিকোয়েন্সি আগে থেকে জানা যায় না, তাই ব্যবহারিকভাবে সবসময় উইন্ডোয়িং প্রয়োগ করাই নিরাপদ অভ্যাস।
অনুশীলন
-
চিন্তা করুন: উপরের প্রথম কোড সেলে
f0 = 5.5-কেf0 = 8.0(একটি পূর্ণসংখ্যা বিন, যেহেতু $fs/N=1$ Hz) বদলালে, rectangular DFT-তে কি এখনও লিকেজ দেখা যাবে বলে আপনার ধারণা?না — $f_0=8.0$ Hz ঠিক $k=8$ বিনে পড়ে ($8.0/1.0=8$, পূর্ণসংখ্যা), তাই এই ক্ষেত্রে rectangular DFT-ই একটি পরিষ্কার একক-বিন পিক দেখাবে, L২২-এর ডেমোর মতো — কোনো উল্লেখযোগ্য লিকেজ ছাড়াই।
-
পরীক্ষা করুন: উপরের উভয় কোড সেলে
f0 = 5.5-কেf0 = 8.0-এ বদলে রান করুন এবং দেখুন rectangular বনাম hamming-এর "দূরের বিন" লিকেজ যোগফল কতটা কাছাকাছি আসে।রান করলে দেখা যাবে rectangular-এ $k=8$-এ একটি একক তীক্ষ্ণ পিক এবং আশেপাশের বিনে প্রায় শূন্য ম্যাগনিটিউড — অর্থাৎ "দূরের বিন" যোগফল rectangular-এই ইতিমধ্যে খুব ছোট হবে (L২২-এর মতো)। হ্যামিং উইন্ডো তখনও লিকেজ আরও কিছুটা কমাবে, কিন্তু পার্থক্য $f_0=5.5$ Hz-এর ক্ষেত্রের মতো নাটকীয় হবে না — কারণ শুরুতেই rectangular-এর লিকেজ কম ছিল, উইন্ডোয়িংয়ের "লাভ" তাই সীমিত।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- জিরো-প্যাডিং ও ফ্রিকোয়েন্সি রেজোলিউশন পরবর্তী পাঠ লিকেজ কমানোর (উইন্ডোয়িং) বিপরীতে — কেন শুধু জিরো যোগ করলে প্রকৃত রেজোলিউশন বাড়ে না, তার একটি সম্পূর্ণ ডেমো।
- DFT-এর বৈশিষ্ট্য — সিমেট্রি, পিরিয়ডিসিটি, লিকেজ M৫ এই পাঠের লিকেজ ডেমোর তাত্ত্বিক ভূমিকা এবং কনজুগেট সিমেট্রি/পিরিয়ডিসিটির সাথে সম্পর্ক।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M৭-এ এই হ্যামিং উইন্ডো সূত্রই ব্যবহৃত হবে windowed-sinc FIR ফিল্টার ডিজাইনে, আর M১০-এ STFT/স্পেকট্রোগ্রামে।