অডিও প্রসেসিং-এ DSP
এই পাঠে যা শিখবেন
- ডিজিটাল অডিও কীভাবে সংখ্যার সিরিজ হিসেবে প্রতিনিধিত্ব করা হয়, এবং একটি "নোট"-এ ফান্ডামেন্টাল ও হারমোনিক্স কী ভূমিকা রাখে
- একটি সিন্থেটিক টোনের ওপর হাতে-লেখা DFT চালিয়ে সত্যিকারের হারমোনিক পিক শনাক্ত করা
- একটি লো-পাস ফিল্টার প্রয়োগ করে EQ-এর মতো ফ্রিকোয়েন্সি-সিলেক্টিভ শেপিং সত্যিকারের গণনা দিয়ে দেখা
- বাস্তব-বিশ্বের অডিও DSP অ্যাপ্লিকেশনে এই কৌশলগুলো কীভাবে ব্যবহৃত হয় তার একটি সাধারণ চিত্র
১ · অডিও সিগন্যাল আসলে সংখ্যার একটি সিরিজ
একটি মাইক্রোফোন বাতাসের চাপের ক্রমাগত (continuous) পরিবর্তন ধরে, আর একটি ADC (M2-এ বিস্তারিত) সেটিকে
নির্দিষ্ট বিরতিতে স্যাম্পল করে সংখ্যার একটি তালিকায় রূপান্তর করে — বাস্তব CD-কোয়ালিটি অডিওতে সাধারণত
৪৪১০০ Hz, প্রফেশনাল প্রোডাকশনে ৪৮০০০ Hz বা তার বেশি রেট ব্যবহার হয়। এই পাঠে আমরা ডেমো দ্রুত রাখতে মাত্র
fs = 400 Hz এবং N = 64 স্যাম্পল ব্যবহার করব — এই সংখ্যাগুলো এবং
নিচের টোনটি সম্পূর্ণ সিন্থেটিক, শিক্ষামূলক উদাহরণ, কোনো সত্যিকারের রেকর্ড করা শব্দ নয়।
একটি মিউজিক্যাল নোট সাধারণত একটি একক সাইন-তরঙ্গ নয় — এটি একটি ফান্ডামেন্টাল ফ্রিকোয়েন্সি ($f_0$নোটের মূল, সর্বনিম্ন ফ্রিকোয়েন্সি — এটিই কানে "পিচ" হিসেবে ধরা পড়ে।) এবং তার পূর্ণসংখ্যা গুণিতক — হারমোনিক্স ($2f_0$, $3f_0$, ...) — এর যোগফল, যেখানে উচ্চতর হারমোনিক্সের প্রশস্ততা সাধারণত ছোট হয়। এই মিশ্রণই একটি পিয়ানো আর একটি বাঁশির একই পিচের নোটকে ভিন্ন শোনায় — এটাই "টিমব্র"।
নোটের মূল ফ্রিকোয়েন্সি — কানে যা "পিচ" হিসেবে ধরা পড়ে।
ফান্ডামেন্টালের পূর্ণসংখ্যা গুণিতক ফ্রিকোয়েন্সি, সাধারণত কমতে থাকা প্রশস্ততায় — টিমব্র নির্ধারণ করে।
এই পাঠের টোন, স্পেকট্রাম, ফিল্টার আউটপুট — সবকিছু কোডে জেনারেট করা, কোনো রেকর্ড করা অডিও ফাইল ব্যবহার হয়নি।
২ · একটি সিন্থেটিক টোন তৈরি ও DFT দিয়ে হারমোনিক পিক দেখা
নিচে একটি সিন্থেটিক "নোট" তৈরি করা হচ্ছে — ফান্ডামেন্টাল $f_0 = 50$ Hz (প্রশস্ততা ১.০), দ্বিতীয় হারমোনিক $2f_0 = 100$ Hz (প্রশস্ততা ০.৫), তৃতীয় হারমোনিক $3f_0 = 150$ Hz (প্রশস্ততা ০.২৫)। M5-এর সরাসরি DFT সূত্র $X[k] = \sum_{n=0}^{N-1} x[n] e^{-j2\pi kn/N}$ প্রয়োগ করে দেখা যাক স্পেকট্রামে ঠিক কোথায় পিক দেখা যায়।
import math, cmath
fs = 400.0 # স্যাম্পল রেট (Hz) -- শুধু ডেমো দ্রুত রাখতে ছোট রাখা হয়েছে
N = 64 # স্যাম্পল সংখ্যা
f0, f1, f2 = 50.0, 100.0, 150.0 # ফান্ডামেন্টাল + ২য় + ৩য় হারমোনিক
# *** সম্পূর্ণ সিন্থেটিক, শিক্ষামূলক টোন -- কোনো রেকর্ড করা অডিও নয় ***
tone = [
1.00 * math.sin(2 * math.pi * f0 * n / fs)
+ 0.50 * math.sin(2 * math.pi * f1 * n / fs)
+ 0.25 * math.sin(2 * math.pi * f2 * n / fs)
for n in range(N)
]
def dft_magnitude(x):
n_samples = len(x)
mags = []
for k in range(n_samples):
s = 0 + 0j
for n in range(n_samples):
s += x[n] * cmath.exp(-2j * math.pi * k * n / n_samples)
mags.append(abs(s))
return mags
mags = dft_magnitude(tone)
print("প্রথম ৮টি স্যাম্পল:", [round(v, 4) for v in tone[:8]])
print()
print(f"fs = {fs} Hz, N = {N} স্যাম্পল, ফ্রিকোয়েন্সি রেজোলিউশন = {fs/N} Hz/bin")
print()
print(f"{'k':>3} | {'ফ্রিকোয়েন্সি (Hz)':>18} | {'|X[k]|':>10}")
for k in range(N // 2 + 1):
if mags[k] > 1.0:
print(f"{k:>3} | {k*fs/N:>18.2f} | {mags[k]:>10.3f}")
৩ · ইকুয়ালাইজেশন (EQ) — ফ্রিকোয়েন্সি-সিলেক্টিভ ফিল্টারিং হিসেবে
একটি অডিও ইকুয়ালাইজার আসলে M7-এ শেখা ডিজিটাল ফিল্টারেরই একটি প্রয়োগ — নির্দিষ্ট ফ্রিকোয়েন্সি ব্যান্ড বাড়ানো বা কমানো। নিচে আগের টোনে একটি ৩৩-ট্যাপ windowed-sinc লো-পাস ফিল্টার (কাট-অফ ১২০ Hz, M7-এর পদ্ধতি অনুসরণ করে) প্রয়োগ করে দেখা যাক — এটি কি সত্যিই তৃতীয় হারমোনিককে (১৫০ Hz, কাট-অফের ওপরে) ফান্ডামেন্টাল ও দ্বিতীয় হারমোনিকের (কাট-অফের নিচে) চেয়ে বেশি দমন করে?
# windowed-sinc লো-পাস ফিল্টার -- কাট-অফ ১২০ Hz (M7-এর পদ্ধতি)
fc = 120.0
M = 16 # ফিল্টার অর্ধ-দৈর্ঘ্য -> মোট ট্যাপ = 2M+1
taps = 2 * M + 1
fc_norm = fc / fs
h = []
for i in range(-M, M + 1):
if i == 0:
hv = 2 * fc_norm
else:
hv = math.sin(2 * math.pi * fc_norm * i) / (math.pi * i)
w = 0.54 - 0.46 * math.cos(2 * math.pi * (i + M) / (taps - 1)) # Hamming window
h.append(hv * w)
dc_gain = sum(h)
h = [c / dc_gain for c in h] # DC গেইন ১-এ নরমালাইজ
def convolve(x, h):
y = [0.0] * (len(x) + len(h) - 1)
for n in range(len(x)):
for k in range(len(h)):
y[n + k] += x[n] * h[k]
return y
filtered_full = convolve(tone, h)
filtered = filtered_full[M:M + N] # ফিল্টারের M-স্যাম্পল বিলম্ব বাদ দিয়ে align
mags_after = dft_magnitude(filtered)
print(f"ফিল্টার: {taps}-ট্যাপ windowed-sinc lowpass, কাট-অফ = {fc} Hz")
print()
print(f"{'উপাদান':>13} | {'ফ্রিকোয়েন্সি':>13} | {'আগে |X[k]|':>12} | {'পরে |X[k]|':>12} | {'অনুপাত':>8}")
labels = ["ফান্ডামেন্টাল", "২য় হারমোনিক", "৩য় হারমোনিক"]
for label, k in zip(labels, [8, 16, 24]):
ratio = mags_after[k] / mags[k]
print(f"{label:>13} | {k*fs/N:>10.1f} Hz | {mags[k]:>12.3f} | {mags_after[k]:>12.3f} | {ratio:>8.4f}")
অডিও প্রসেসিং-এর প্রায় সবকিছুই — ইকুয়ালাইজেশন, নয়েজ রিডাকশন, কমপ্রেশন (MP3-এর মতো ফরম্যাটে DCT-ভিত্তিক এনার্জি কমপ্যাকশন ব্যবহার হয়, M10-এ বিস্তারিত), ইকো ক্যানসেলেশন (M10-এর LMS অ্যাডাপটিভ ফিল্টার) — এই কোর্সের ভিত্তি: সিগন্যালকে স্যাম্পল করা, DFT/FFT দিয়ে ফ্রিকোয়েন্সি-ডোমেইনে দেখা, এবং ফিল্টার দিয়ে নির্দিষ্ট ফ্রিকোয়েন্সি বাছাই বা দমন করা — এর ওপর দাঁড়িয়ে। বাস্তব সিস্টেম শুধু স্কেলে (৪৪১০০ Hz-এ হাজার হাজার স্যাম্পল/সেকেন্ড) ও জটিলতায় (মাল্টি-ব্যান্ড EQ, সাইকোঅ্যাকোস্টিক মডেল) বড়, নীতি একই থাকে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ উপরের DFT-তে ফান্ডামেন্টালের ম্যাগনিটিউড ৩২.০, কিন্তু তার প্রশস্ততা ছিল ১.০। এই "৩২" সংখ্যাটা কোথা থেকে এলো?
একটি খাঁটি সাইন-তরঙ্গ $A\sin(2\pi f_0 n/f_s)$-এর $N$-বিন্দু DFT-তে সংশ্লিষ্ট বিনের ম্যাগনিটিউড হয় $A \times N/2$ (যতক্ষণ $f_0$ ঠিক একটি বিনে পড়ে)। এখানে $A=1.0$ এবং $N=64$, তাই $1.0 \times 64/2 = 32.0$ — ঠিক যা কোড দেখাচ্ছে। এই একই সূত্র দ্বিতীয় হারমোনিকের জন্যও মেলে: $0.5 \times 32 = 16.0$।
প্র ০২ ফিল্টারের পরে ফান্ডামেন্টালও সামান্য কমেছে (অনুপাত ০.৯৯৫৭, ঠিক ১.০ নয়) — এটি কি ফিল্টার ডিজাইনের একটি ভুল?
না, এটি প্রত্যাশিত। একটি বাস্তব (finite-length) লো-পাস ফিল্টারের ফ্রিকোয়েন্সি রেসপন্স কাট-অফের নিচেও একেবারে সমতল ১.০ নয় — এটি ধীরে ধীরে কমতে শুরু করে (M7-এর "ট্রানজিশন ব্যান্ড" ধারণা)। ৩৩-ট্যাপের মতো তুলনামূলক ছোট ফিল্টারে এই প্রভাব বেশি দেখা যায়; M7/L34-এ দেখা যাবে বেশি ট্যাপ ব্যবহার করলে (যেমন ৫১-ট্যাপ) এই "রোল-অফ" আরও তীক্ষ্ণ এবং পাসব্যান্ড আরও সমতল হয়।
প্র ০৩ এই পাঠের টোন, স্পেকট্রাম ও ফিল্টার আউটপুট আসলে কোনো রেকর্ড করা গান বা মানুষের কণ্ঠস্বর প্রতিনিধিত্ব করে না — তাহলে এই ডেমোটি কেন উপকারী?
কারণ এটি একটি নিয়ন্ত্রিত, যাচাইযোগ্য উদাহরণ — আমরা ঠিক জানি সিগন্যালে কোন ফ্রিকোয়েন্সি আছে (৫০, ১০০, ১৫০ Hz), তাই DFT ও ফিল্টার ঠিক কাজ করছে কিনা তা সহজেই যাচাই করা যায়। বাস্তব রেকর্ড করা অডিওতে "সঠিক উত্তর" আগে থেকে জানা থাকে না, তাই ভুল বোঝা কঠিন হয়। এই সহজ, স্বচ্ছ উদাহরণ দিয়ে কৌশলটি শেখার পর সেটি যেকোনো বাস্তব সিগন্যালে প্রয়োগ করা যায়।
অনুশীলন
-
চিন্তা করুন: যদি টোনে একটি চতুর্থ হারমোনিক ($4f_0 = 200$ Hz, প্রশস্ততা ০.১) যোগ করা হয়,
তাহলে DFT-তে কোন বিনে ($k$-এর মান) নতুন পিক দেখা যাবে, এবং তার প্রত্যাশিত ম্যাগনিটিউড কত হবে বলে মনে হয়?
(রেজোলিউশন $fs/N = 6.25$ Hz/bin মনে রাখুন।)
$k = 200 / 6.25 = 32$, এবং প্রত্যাশিত ম্যাগনিটিউড $0.1 \times 32 = 3.2$। লক্ষ্য করুন $k=32$ আসলে $N/2 = 32$, অর্থাৎ Nyquist ফ্রিকোয়েন্সি ($fs/2 = 200$ Hz) — এটি এই স্যাম্পল রেটে প্রতিনিধিত্বযোগ্য সর্বোচ্চ ফ্রিকোয়েন্সি।
-
পরীক্ষা করুন: উপরের প্রথম কোড সেলে
f2 = 150.0-এর পরে+ 0.10 * math.sin(2 * math.pi * 200.0 * n / fs)যোগ করে টোনের তালিকায় যোগ করুন এবং Run চেপে আপনার হিসেব যাচাই করুন।রান করলে $k=32$ বিনে ম্যাগনিটিউড ৩.২০০ দেখাবে — ঠিক হিসেব অনুযায়ী। বাকি তিনটি পিক ($k=8,16,24$) অপরিবর্তিত থাকবে, কারণ DFT প্রতিটি ফ্রিকোয়েন্সি উপাদানকে স্বাধীনভাবে শনাক্ত করে (লিনিয়ারিটির কারণে, M4/L15-এ বিস্তারিত)।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
- Numerical Methods কোর্স সহোদর কোর্স সাধারণ সংখ্যাগত অ্যালগরিদম, রুট-ফাইন্ডিং, ইন্টিগ্রেশন ও ODE সলভিং-এর গভীর কভারেজ — এই কোর্স সেই একই "হাতে-লেখা" দর্শনের উপর সিগন্যাল-প্রসেসিং-নির্দিষ্ট দিকটি যোগ করে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।