Active Noise Cancellation

چند روز پیش امیر یه هدفون مجهز به سیستم کاهش نویز آورده بود، قبلا همچین ادعاهایی رو تو هدفون‌ها دیده بودم ولی ویژگی محسوسی نداشتند، اما این یکی رو به محض این که رو گوشام گذاشتم، سکوت قابل ملاحظه‌ای رو حس کردم، بعد پیرموان همین موضوع و این که چطوری این اتفاق میفته باهم بحث کردیم، در واقع، مطالب این دست همیشه تو اخبار و سایت‌ها هست ولی تا وقتی که لمس‌شون نکردیم کنجکاو‌شون نمی شیم و راحت از کنارشون رد می‌شیم. تو بحثی که با هم می‌کردیم نمی‌دونستم، آیا می‌تونم از واژه سیگنال صوتی منفی (و یا معکوس) استفاده کنم یا نه. تصمیم گرفتم این موضوع رو بصورت ساده‌ای تست کنم. از فرصت تعطیلی پیش اومده استفاده کردم، با پایتون یه سیگنال صوتی استریو ۶۰۰ هرتز ساختم که، کانال‌هاش با هم اختلاف فاز ۱۸۰ درجه داشتند. الان در ادامه یه مقدمه کوچک از این تکنولوژی می‌گم و همچنین به نحوه‌ی ساخت سیگنال صوتی تو پایتون اشاره می‌کنم و بعد نتیجه کار رو می‌گم.

حذف نویز فعال

Active Noise Cancellation

Active Noise Cancellation که به عنوان کنترل نویز فعال نیز هم شناخته می‌شود، روشی هست که در‌ آن با اضافه کردن صوت دوم اثر صوت ناخواسته اصلی را کاهش می‌دهند. این مفهموم ابتدا در اواخر دهه ۱۹۳۰ معرفی شد و توسعه‌های انجام یافته در دهه ۱۹۵۰ منجر به هدست‌های هواپیمایی اواخر دهه ۱۹۸۰ شد و الان در وسایل نقلیه‌جاده‌ای و تلفن‌های همراه استفاده می‌شود. 

در این روش صدای نویز توسط میکروفون‌هایی دریافت می‌شود و سپس بوسیله مدارات آنالوگ و یا روش‌های دیجیتال بر روی آن پردازش انجام می‌گیرد و توسط بلندگویی دیگر صوتی با همان دامنه ولی در فاز معکوس  (که به آنتی فاز معروف است)  تولید می‌شود، این امواج با امواج اصلی ترکیب می‌شوند و در فرآیندی به نام تداخل، موج جدیدی را تشکیل می دهند و به طور موثر کدیگر را لغو می‌کنند، تاثیری که تداخل مخرب نامیده می‌شود. یرای گرفتن نتیجه بهتر باید مکان منشا نویز و بلندگوی پخش‌کنند امواج آنتی فاز باید یکسان باشد.

 

ساخت سیگنال معکوس با پایتون

طبق معمول تو پایتون کلی کتابخونه برا این کار هست، من از wave استفاده کردم، یک سیگنال استریو ساختم که دو تا کانال‌هاش در فاز مخالف هم بودند.

import math
import wave
import struct

freq = 600.0
data_size = 50000
fname = "WaveTest.wav"
frate = 30000.0 # framerate as a float
amp = 64000.0 # multiplier for amplitude
sine_list_x = []
sine_list_y = []

for x in range(data_size):
 sine_list_x.append(math.sin(2*math.pi*freq*(x/frate)))

for y in range(data_size):
 sine_list_y.append(-1*math.sin(2*math.pi*freq*(y/frate)))

wav_file = wave.open(fname, "w")
nchannels = 2
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))

for s, t in zip(sine_list_x, sine_list_y):
 # write the audio frames to file
 wav_file.writeframes(struct.pack('<hh', int(s*amp/2),int(t*amp/2)))

wav_file.close()
سیگنال تولیدی: 
 
Active Noise Cancellation

تست و نتیجه کار:

برای تست دو تا اسپیکر (کانال چپ و راست) رو کنار هم گذاشتم و یک میکروفون رو به فاصله مساوی از هر دو اسپیکر قرار دادم و سپس کانال‌ها رو بصورت تک به تک فعال کردم و خروجی‌شان رو از طریق میکروفن و نرم افزار Audacity ثبت کردم تا از بالانس بودن هر دو اسپیکر مطمئن شوم، چنان که تفاوتی در خروجی اسپیکرها دیده شود باید با تغییر بهره، هر دو کانال را بالانس کرد. بعد از بالانس کردن، فقط یکی از کانال‌ها را پخش می‌کنم و سیگنال زیر رو از طریق میکروفون دریافت می‌کنم:
Active Noise Cancellation
 
سپس هر دو کانال را با هم پخش می‌کنم و نتیجه خروجی زیر می‌شود. 
Active Noise Cancellation
 
چنان که در ویدیوی زیر مشاهده می‌شود زمانی که هر دو کانال با هم پخش می‌شوند میزان بلندی صدا نسبت به حالت تک کانال، کاهش قابل ملاحظه‌ای دارد.