একটি সম্পূর্ণ DSP পাইপলাইন তৈরি — ডিজাইন
এই পাঠে যা শিখবেন
- একটি বাস্তব-সদৃশ (কিন্তু সম্পূর্ণ সিন্থেটিক) DSP সমস্যাকে সুনির্দিষ্ট পাইপলাইন-পর্যায়ে ভাঙা
- স্যাম্পল রেট বাছাইয়ের সময় নাইকুইস্ট মার্জিন কীভাবে বিবেচনা করতে হয় (M2 থেকে)
- DFT/FFT দিয়ে কোন ফ্রিকোয়েন্সি "রাখতে হবে" আর কোনটি "সরাতে হবে" তা আগে থেকেই পরিকল্পনা করা (M5/M6 থেকে)
- কেন এই সিনারিওতে FIR ফিল্টার IIR-এর চেয়ে ভালো পছন্দ, এবং কাটঅফ ফ্রিকোয়েন্সি ও ট্যাপ-সংখ্যা কীভাবে বাছাই করতে হয় (M7/M8 থেকে)
- একটি ফিল্টার ডিজাইনকে তার ফ্রিকোয়েন্সি রেসপন্স সরাসরি গণনা করে যাচাই করা — সিগন্যালে প্রয়োগ করার আগেই
১ · সিনারিও — একটি হাইপোথেটিক্যাল ভাইব্রেশন সেন্সর
কল্পনা করুন একটি ঘূর্ণায়মান যন্ত্রাংশের (rotating shaft) স্বাস্থ্য পর্যবেক্ষণের জন্য একটি ভাইব্রেশন সেন্সর বসানো আছে। যন্ত্রাংশটি সুস্থ অবস্থায় ৪০ Hz-এ একটি স্থির কম্পন-টোন তৈরি করে (এটাই আমাদের কাঙ্ক্ষিত সিগন্যাল) — কিন্তু সেন্সরের রিডিং-এ দুটো অবাঞ্ছিত উপাদান মিশে যায়: (ক) কাছাকাছি বৈদ্যুতিক তার/মোটর থেকে আসা ১০০ Hz ইন্টারফেয়ারেন্স টোন, এবং (খ) সেন্সরের নিজস্ব ব্রডব্যান্ড র্যান্ডম নয়েজ। এটি সম্পূর্ণ কাল্পনিক ও সিন্থেটিক একটি উদাহরণ — কোনো প্রকৃত রেকর্ড করা সেন্সর ডেটা নয়, শুধু কোর্সের কৌশলগুলো একসাথে প্রয়োগ করার জন্য একটি বাস্তব-সদৃশ পরিস্থিতি।
লক্ষ্য: সেন্সর সিগন্যাল থেকে ১০০ Hz ইন্টারফেয়ারেন্স ও নয়েজ সরিয়ে ৪০ Hz কাঙ্ক্ষিত ভাইব্রেশন টোন যতটা সম্ভব অক্ষত রাখা — যাতে একজন প্রকৌশলী পরিষ্কার সিগন্যাল দেখে যন্ত্রাংশের প্রকৃত অবস্থা বুঝতে পারেন।
৪০ Hz ঘূর্ণন-ভাইব্রেশন টোন — এটাই রাখতে হবে।
১০০ Hz বৈদ্যুতিক পিকআপ — এটা সরাতে হবে।
সেন্সরের র্যান্ডম নয়েজ — যতটা সম্ভব কমাতে হবে।
২ · পাইপলাইনের ধাপ ও স্যাম্পল রেট সিদ্ধান্ত (M2)
M2-এ (L05 নাইকুইস্ট-শ্যানন থিওরেম, L06 অ্যালিয়াসিং) শেখা হয়েছিল স্যাম্পল রেট fs অবশ্যই
সিগন্যালের সর্বোচ্চ ফ্রিকোয়েন্সির অন্তত দ্বিগুণ হতে হবে, নাহলে অ্যালিয়াসিং ঘটে এবং তথ্যের ক্ষতি স্থায়ী হয়ে
যায় (L01-এর ডেমো)। আমাদের সিনারিওতে সর্বোচ্চ প্রাসঙ্গিক ফ্রিকোয়েন্সি ইন্টারফেয়ারেন্স টোন,
১০০ Hz। নিরাপদ মার্জিন রাখার জন্য আমরা বেছে নিচ্ছি:
নাইকুইস্ট সীমা ১২৮ Hz — ১০০ Hz ইন্টারফেয়ারেন্সের চেয়ে ২৮ Hz মার্জিন, নিরাপদ।
মোট সময়কাল ০.৫ সেকেন্ড — DFT বিন-রেজোলিউশন
fs/N = 2 Hz, যথেষ্ট সূক্ষ্ম ৪০/১০০ Hz আলাদা করতে (M5/L25-এ বিস্তারিত)।
fs = 256 বাছাই করার আরেকটি কারণ — এটি ২-এর ঘাত (2⁸), তাই এর সাথে
N = 128 = 2⁷ স্যাম্পল ব্যবহার করলে M6-এর radix-2 FFT (L27-L28) সরাসরি প্রয়োগ করা যায়, যদিও এই
পাঠে আমরা মূলত M5-এর সরাসরি DFT ব্যবহার করব ছোট আকারের কারণে।
৩ · স্পেকট্রাল পরিকল্পনা (M5/M6)
fs = 256 Hz ও N = 128 স্যাম্পল দিয়ে DFT বিন-রেজোলিউশন হয় 256/128 = 2 Hz
— অর্থাৎ প্রতিটি বিন k-এর সাথে ফ্রিকোয়েন্সি k × 2 Hz যুক্ত। এই থেকে আগে থেকেই
গণনা করা যায়:
$$\text{bin}_{\text{desired}} = \frac{40}{2} = 20, \qquad \text{bin}_{\text{interf}} = \frac{100}{2} = 50$$
অর্থাৎ L57-এর DFT ধাপে আমরা আগে থেকেই জানি কাঙ্ক্ষিত শক্তি বিন ২০-এ আর ইন্টারফেয়ারেন্স বিন ৫০-এ দেখা যাওয়া উচিত (M5/L22-এর সরাসরি সমষ্টি সূত্র ব্যবহার করে) — এই পরিকল্পনাটাই ফিল্টার কাটঅফ বাছাইয়ের ভিত্তি তৈরি করে।
৪ · ফিল্টার টাইপ ও ডিজাইন সিদ্ধান্ত (M7/M8)
এখন প্রশ্ন: FIR (M7) নাকি IIR (M8)? ভাইব্রেশন-ডায়াগনস্টিক্সের জন্য সিগন্যালের ওয়েভফর্ম-শেপ গুরুত্বপূর্ণ (শুধু ফ্রিকোয়েন্সি নয়) — আর M7/L31-এ শেখা হয়েছিল windowed-sinc FIR ফিল্টার লিনিয়ার ফেজ দেয়, যার মানে সব ফ্রিকোয়েন্সি একই পরিমাণ সময়-বিলম্বে (group delay) দিয়ে যায় — ওয়েভফর্মের আকার বিকৃত হয় না। M8/L35-এ শেখা IIR ফিল্টার সাধারণত নন-লিনিয়ার ফেজ দেয়, যা ভাইব্রেশন সিগন্যালের শেপ বিকৃত করতে পারে। তাই এই সিনারিওতে FIR স্পষ্ট পছন্দ।
ডিজাইন মেথড হিসেবে M7/L31-এর windowed-sinc পদ্ধতি বেছে নেওয়া হয়েছে — একটি আদর্শ (ideal)
sinc লো-পাস ইমপালস রেসপন্সকে M7/L24-এর Hamming উইন্ডো দিয়ে গুণ করে বাস্তবায়নযোগ্য করা হয়। কাটঅফ ফ্রিকোয়েন্সি
বাছাইয়ের যুক্তি সহজ: এটি অবশ্যই ৪০ Hz-এর উপরে (যাতে কাঙ্ক্ষিত টোন পাস হয়) অথচ ১০০ Hz-এর অনেক নিচে (যাতে
ইন্টারফেয়ারেন্স আটকানো যায়) হতে হবে — তাই fc = 60 Hz, দুটোর প্রায় মাঝামাঝি (লগ-স্কেলেও যুক্তিসঙ্গত
দূরত্বে)। ট্যাপ-সংখ্যা M নিয়ে M7/L34-এর ট্রেড-অফ প্রযোজ্য — বেশি ট্যাপ মানে তীক্ষ্ণ ট্রানজিশন
কিন্তু বেশি গণনা ও বেশি group delay; নিচের কোড সেলে M = 25 বাছাই করে সেটি সরাসরি ফ্রিকোয়েন্সি
রেসপন্স গণনা করে যাচাই করা হয়েছে যে এটি যথেষ্ট।
৫ · ডিজাইন যাচাই — কোর ফাংশনগুলো একত্র করা
নিচের কোড সেলে পাইপলাইনের দুটো মূল বিল্ডিং-ব্লক লেখা হয়েছে: (১) সিন্থেটিক সিগন্যাল জেনারেটর, এবং (২) windowed-sinc FIR লো-পাস ডিজাইনার। ফিল্টার প্রয়োগ ও নয়েজ-সহ পূর্ণ সিগন্যালের DFT বিশ্লেষণ L57 ক্যাপস্টোনের জন্য রাখা হয়েছে — এখানে আমরা শুধু ফিল্টারের ফ্রিকোয়েন্সি রেসপন্স সরাসরি গণনা করে ডিজাইন সিদ্ধান্তটি যাচাই করছি, কোনো সিগন্যালে প্রয়োগ করার আগেই।
import math, cmath
FS = 256.0 # স্যাম্পল রেট, Hz
N = 128 # স্যাম্পল সংখ্যা
F_DESIRED = 40.0 # কাঙ্ক্ষিত ভাইব্রেশন টোন, Hz
F_INTERF = 100.0 # ইন্টারফেয়ারেন্স টোন, Hz
def make_test_signal(fs, n_samples, f_desired, f_interf, a_desired=1.0, a_interf=0.6):
desired = [a_desired * math.sin(2 * math.pi * f_desired * n / fs) for n in range(n_samples)]
interference = [a_interf * math.sin(2 * math.pi * f_interf * n / fs + 0.7) for n in range(n_samples)]
return desired, interference
def sinc(x):
if x == 0.0:
return 1.0
return math.sin(math.pi * x) / (math.pi * x)
def design_fir_lowpass(fc, fs, M):
"""windowed-sinc FIR লো-পাস: ideal sinc x Hamming window, DC গেইন ১-এ নরমালাইজড।"""
taps = []
alpha = (M - 1) / 2
for n in range(M):
h_ideal = (2 * fc / fs) * sinc((2 * fc / fs) * (n - alpha))
w = 0.54 - 0.46 * math.cos(2 * math.pi * n / (M - 1)) # Hamming window
taps.append(h_ideal * w)
s = sum(taps)
return [t / s for t in taps]
def freq_response_mag(h, f, fs):
w = 2 * math.pi * f / fs
H = sum(h[n] * cmath.exp(-1j * w * n) for n in range(len(h)))
return abs(H)
desired, interference = make_test_signal(FS, N, F_DESIRED, F_INTERF)
print("প্রথম ৫টি স্যাম্পল -- কাঙ্ক্ষিত টোন:", [round(v, 4) for v in desired[:5]])
print("প্রথম ৫টি স্যাম্পল -- ইন্টারফেয়ারেন্স:", [round(v, 4) for v in interference[:5]])
FC = 60.0
M_TAPS = 25
h = design_fir_lowpass(FC, FS, M_TAPS)
print(f"\nফিল্টার: fc={FC} Hz, M={M_TAPS} ট্যাপ, DC গেইন যাচাই sum(h)={sum(h):.6f}")
print("প্রথম ৫টি ট্যাপ:", [round(v, 5) for v in h[:5]])
print(f"\n{'freq(Hz)':>8} | {'|H(f)|':>8}")
for f in [20, 40, 60, 80, 100, 120]:
print(f"{f:8d} | {freq_response_mag(h, f, FS):8.4f}")
|H(f)| —
20 Hz: 1.0000, 40 Hz: 1.0030 (কাঙ্ক্ষিত টোন প্রায় অক্ষত), 60 Hz: 0.5006
(কাটঅফে -৬ dB, প্রত্যাশিত), তারপর দ্রুত নেমে 80 Hz: 0.0018, 100 Hz: 0.0012
(ইন্টারফেয়ারেন্স প্রায় সম্পূর্ণ আটকানো), 120 Hz: 0.0011। DC গেইন sum(h) = 1.000000
নিশ্চিত করে ফিল্টার একটি স্থির (DC) সিগন্যালকে অবিকৃত রাখে — এটি normalization ঠিক আছে কি না তার একটি
দ্রুত স্যানিটি-চেক।
স্যাম্পল রেট: fs = 256 Hz (M2, নাইকুইস্ট মার্জিন ২৮ Hz)।
স্যাম্পল সংখ্যা: N = 128 (M5, বিন-রেজোলিউশন ২ Hz)।
বিন প্ল্যান: কাঙ্ক্ষিত বিন ২০ (৪০ Hz), ইন্টারফেয়ারেন্স বিন ৫০ (১০০ Hz)।
ফিল্টার: windowed-sinc FIR লো-পাস, fc = 60 Hz, M = 25 ট্যাপ,
Hamming window (M7)। এই সবগুলো সিদ্ধান্ত এখন L57 ক্যাপস্টোনে একটি সম্পূর্ণ, নয়েজ-সহ সিগন্যালের উপর
বাস্তবায়ন ও যাচাই করা হবে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
কাটঅফ ফ্রিকোয়েন্সি fc = 60 Hz কেন fc = 45 Hz বা fc = 95 Hz
না করে ৪০ আর ১০০-এর প্রায় মাঝামাঝি বাছাই করা হলো?
একটি বাস্তব ফিল্টারের (এই ক্ষেত্রে সীমিত ট্যাপ-সংখ্যার FIR) কাটঅফের কাছে একটি সরু "ট্রানজিশন ব্যান্ড" থাকে, ধারালো দেয়াল নয় (M7/L34-এ বিস্তারিত)। কাটঅফ কাঙ্ক্ষিত টোনের (৪০ Hz) খুব কাছে বসালে ৪০ Hz নিজেই কিছুটা কমে যেতে পারে; ইন্টারফেয়ারেন্সের (১০০ Hz) খুব কাছে বসালে ইন্টারফেয়ারেন্স যথেষ্ট আটকানো নাও যেতে পারে। দুটোর মাঝামাঝি বসালে উভয় দিকেই যথেষ্ট মার্জিন থাকে — উপরের কোড সেলের ফ্রিকোয়েন্সি রেসপন্স টেবিল সেটাই দেখায়: ৪০ Hz-এ গেইন প্রায় ১.০, ১০০ Hz-এ গেইন প্রায় ০।
প্র ০২
M = 25 ট্যাপের বদলে M = 9 ট্যাপ ব্যবহার করলে কী ঘটবে বলে আপনার ধারণা?
M7/L34-এর ট্রেড-অফ অনুযায়ী কম ট্যাপ মানে চওড়া, কম-তীক্ষ্ণ ট্রানজিশন ব্যান্ড — অর্থাৎ ১০০ Hz-এ গেইন
০.০০১২-এর মতো প্রায় শূন্যে না নেমে অনেক বেশি থেকে যেতে পারে, তাই ইন্টারফেয়ারেন্স কম আটকানো হবে। সুবিধা
হলো কম ট্যাপ মানে কম গণনা এবং কম group delay ((M-1)/2 স্যাম্পল, M=9-এ মাত্র
৪ স্যাম্পল বনাম M=25-এ ১২ স্যাম্পল)।
প্র ০৩ যদি ইন্টারফেয়ারেন্স টোন ১০০ Hz-এর বদলে ৪৫ Hz হতো (কাঙ্ক্ষিত ৪০ Hz-এর খুব কাছে), তাহলে কি একটি সাধারণ লো-পাস ফিল্টার দিয়ে সমস্যাটি সমাধান করা সম্ভব হতো?
কঠিন হয়ে যেত। একটি লো-পাস ফিল্টার শুধু একটি কাটঅফের নিচে/উপরে ভাগ করে — কাঙ্ক্ষিত ও ইন্টারফেয়ারেন্স দুটোই কাটঅফের একদিকে খুব কাছাকাছি থাকলে একটি বাস্তবায়নযোগ্য ট্যাপ-সংখ্যার ফিল্টার দিয়ে দুটোকে আলাদা করা অনেক বেশি ট্যাপ দাবি করত (M7/L34)। এমন ক্ষেত্রে একটি সংকীর্ণ ব্যান্ড-স্টপ (notch) ফিল্টার বেশি উপযুক্ত হতো — যা নির্দিষ্টভাবে শুধু ৪৫ Hz-এর আশেপাশে আটকায়, বাকি স্পেকট্রাম স্পর্শ করে না।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
FC = 60.0-কেFC = 50.0-এ পরিবর্তন করলে|H(40)|ও|H(100)|কীভাবে বদলাবে বলে আপনার ধারণা — বাড়বে না কমবে?কাটঅফ কমিয়ে ৫০ Hz করলে ৪০ Hz কাটঅফের আরও কাছাকাছি চলে আসে, তাই
|H(40)|সামান্য কমার সম্ভাবনা (ট্রানজিশন ব্যান্ডের প্রান্তের দিকে চলে যাওয়ায়), কিন্তু|H(100)|আরও কমবে, কারণ ১০০ Hz এখন কাটঅফ থেকে আরও দূরে (স্টপ-ব্যান্ডে আরও গভীরে)। -
পরীক্ষা করুন: উপরের কোড সেলে
FC = 50.0করে Run চাপুন এবং ফ্রিকোয়েন্সি রেসপন্স টেবিলে আপনার অনুমান যাচাই করুন।রান করলে দেখা যাবে
|H(40)|কিছুটা কমে (যদিও এখনও ১-এর কাছাকাছি) আর|H(100)|আরও ছোট মানে নেমে যায় — নিশ্চিত করে যে কাটঅফ ও ইন্টারফেয়ারেন্সের মধ্যে দূরত্ব যত বেশি, স্টপ-ব্যান্ড অ্যাটেনুয়েশন তত ভালো হয়, কিন্তু কাটঅফ কাঙ্ক্ষিত টোনের যত কাছাকাছি যায়, তার নিজের গেইন তত বেশি ঝুঁকিতে পড়ে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- ক্যাপস্টোন — এই ডিজাইন বাস্তবায়ন ও যাচাই করুন L57 · শেষ পাঠ এই পাঠে ডিজাইন করা পাইপলাইন এখন একটি সম্পূর্ণ নয়েজ-সহ সিগন্যালে বাস্তবায়ন, DFT বিশ্লেষণ, ফিল্টার প্রয়োগ, SNR উন্নতি ও একটি চূড়ান্ত প্রমাণ-ভিত্তিক সিদ্ধান্তে নিয়ে যাওয়া হবে।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।