आदर्श प्रतिक्रिया से व्यावहारिक फिल्टर तक
Hamming ने फुरिए श्रृंखला का उपयोग करके FIR फिल्टर्स के लिए एक चार-चरणीय डिजाइन विधि प्रस्तुत की।
चरण 1: आदर्श प्रतिक्रिया निर्दिष्ट करें
H_ideal(f) को परिभाषित करें: वह सटीक आवृत्ति प्रतिक्रिया जो आप चाहते हैं। एक lowpass फिल्टर के लिए: f < f_c के लिए H = 1, f > f_c के लिए H = 0। यह आवृत्ति डोमेन में एक चरण फ़ंक्शन है।
चरण 2: फुरिए गुणांक की गणना करें
H_ideal(f) को आवृत्ति चर में एक फुरिए श्रृंखला के रूप में विस्तारित करें। गुणांक c_k फिल्टर की आदर्श आवेग प्रतिक्रिया मान हैं:
c_k = ∫₀¹ H_ideal(f) · e^{i2πfk} df
Cutoff f_c वाले lowpass फिल्टर के लिए: k ≠ 0 के लिए c_k = sin(2πf_c·k) / (πk), c_0 = 2f_c।
यह आवेग प्रतिक्रिया अनंत है — sinc फ़ंक्शन समय में हमेशा के लिए विस्तारित होता है। एक व्यावहारिक फिल्टर को गुणांक की एक सीमित संख्या की आवश्यकता है।
चरण 3: 2N+1 पदों तक ट्रंकेट करें
केवल |k| ≤ N के लिए गुणांक c_k को रखें। 2N+1 शब्दों की यह आयताकार विंडो सबसे सरल ट्रंकेशन है। यह Gibbs घटना उत्पन्न करता है: cutoff के पास ≈9% overshoot।
चरण 4: एक विंडो लागू करें
Gibbs overshoot को कम करने के लिए ट्रंकेटेड गुणांकों को एक विंडो फ़ंक्शन w_k से गुणा करें:
c̃_k = c_k · w_k
विंडो किए गए गुणांक c̃_k व्यावहारिक फिल्टर को परिभाषित करते हैं।
फुरिए गुणांक की गणना करना
Cutoff f_c वाले lowpass फिल्टर के लिए फुरिए गुणांक सूत्र c_k = sin(2πf_c·k) / (πk) आवेग प्रतिक्रिया देता है।
Lower cutoff f_l और upper cutoff f_u वाले bandpass फिल्टर के लिए, आदर्श प्रतिक्रिया के लिए फुरिए गुणांक है: c_k = [sin(2πf_u·k) − sin(2πf_l·k)] / (πk)।
विंडो Gibbs Overshoot को कैसे कम करते हैं
एक विंडो फ़ंक्शन w_k ट्रंकेटेड गुणांक अनुक्रम को इसके केंद्रीय मान से किनारों पर शून्य तक कम करता है। यह taper आयताकार ट्रंकेशन द्वारा पेश किए गए तीव्र किनारों को हटाता है।
Tapering क्यों काम करता है
Gibbs overshoot इसलिए होता है क्योंकि आयताकार विंडो का फुरिए ट्रांसफॉर्म (sinc फ़ंक्शन) में बड़े sidelobes हैं। ये sidelobes discontinuity के पास एक साथ जुड़ते हैं ≈9% overshoot उत्पन्न करने के लिए।
एक smooth विंडो का फुरिए ट्रांसफॉर्म छोटे sidelobes के साथ होता है। गुणांकों को विंडो से गुणा करने से आदर्श आवृत्ति प्रतिक्रिया को विंडो के फुरिए ट्रांसफॉर्म के साथ convolve किया जाता है। छोटे sidelobes → कम ripple।
सामान्य विंडोज़
Rectangular (कोई windowing नहीं): sidelobes ≈ −13 dB, Gibbs ≈ 9%।
Hann (von Hann): w_k = 0.5 + 0.5·cos(πk/N)। Sidelobes ≈ −31 dB।
Hamming: w_k = 0.54 + 0.46·cos(πk/N)। Sidelobes ≈ −41 dB, first sidelobe ≈ −43 dB। Gibbs < 0.2%।
Kaiser: w_k = I₀(α·√(1−(k/N)²)) / I₀(α)। Tunable: α sidelobe स्तर को नियंत्रित करता है, एक डिजाइन को sidelobe height बनाम transition band width के बीच trade-off करने की अनुमति देता है।
विंडो Trade-Off
हर विंडो एक trade-off को लागू करता है: sidelobes को दबाना हमेशा main lobe को चौड़ा करता है।
एक व्यापक main lobe का अर्थ एक व्यापक transition band है — passband & stopband के बीच आवृत्तियों की श्रेणी।
Hamming ने इसे Kaiser के डिजाइन पैरामीटर के संदर्भ में औपचारिक रूप दिया:
- δ: allowable ripple (ideal से ऊर्ध्वाधर tolerance — प्रतिक्रिया 0 या 1 से कितनी विचलित हो सकती है)
- ΔF: transition width (horizontal tolerance — pass से stop तक संक्रमण कितना संकीर्ण है)
Kaiser की विधि δ और ΔF से अकेले N (गुणांक की संख्या) और α (विंडो shape पैरामीटर) दोनों को ढूंढती है। कोई अनुमान नहीं।
विशिष्टताओं से गुणांकों तक
Kaiser की विधि दो विशिष्टताओं — δ (ripple tolerance) और ΔF (transition width) — लेती है और परीक्षण और त्रुटि के बिना N और विंडो गुणांक दोनों का उत्पादन करती है।
डिजाइन अनुक्रम
1. A = −20·log₁₀(δ) की गणना करें (dB में attenuation)
2. Shape पैरामीटर α की गणना करें:
- यदि A > 50: α = 0.1102·(A − 8.7)
- यदि 21 ≤ A ≤ 50: α = 0.5842·(A − 21)^{0.4} + 0.07886·(A − 21)
- यदि A < 21: α = 0 (rectangular window)
3. N = (A − 8) / (2.285 · 2πΔF) की गणना करें
4. Kaiser विंडो weights की गणना करें: w_k = I₀(α·√(1−(k/N)²)) / I₀(α)
5. आदर्श फुरिए गुणांकों को विंडो weights से गुणा करें
6. परिणामी transfer फ़ंक्शन का मूल्यांकन करें और ripple की δ के विरुद्ध जांच करें। यदि ripple δ से अधिक है (edge interference), एक छोटे tolerance के साथ दोहराएं।
Hamming ने नोट किया: Kaiser exponent 0.4 पर पहुंचे 0.5 को आजमाकर (बहुत बड़ा) और finding 0.4 अच्छी तरह fit करता है। कंप्यूटर ने सैद्धांतिक अनुसंधान के लिए एक प्रायोगिक उपकरण के रूप में कार्य किया।
Kaiser की विधि को लागू करना
Bessel फ़ंक्शन I₀(x) Kaiser के विंडो सूत्र में दिखाई देता है। यह एक तेजी से अभिसारी श्रृंखला के रूप में गणना करता है:
I₀(x) = Σ_{m=0}^∞ [(x/2)^m / m!]²
छोटे x के लिए श्रृंखला कुछ शब्दों में अभिसरण करती है क्योंकि m!² के कारण।