چند روز پیش امیر یه هدفون مجهز به سیستم کاهش نویز آورده بود، قبلا همچین ادعاهایی رو تو هدفونها دیده بودم ولی ویژگی محسوسی نداشتند، اما این یکی رو به محض این که رو گوشام گذاشتم، سکوت قابل ملاحظهای رو حس کردم، بعد پیرموان همین موضوع و این که چطوری این اتفاق میفته باهم بحث کردیم، در واقع، مطالب این دست همیشه تو اخبار و سایتها هست ولی تا وقتی که لمسشون نکردیم کنجکاوشون نمی شیم و راحت از کنارشون رد میشیم. تو بحثی که با هم میکردیم نمیدونستم، آیا میتونم از واژه سیگنال صوتی منفی (و یا معکوس) استفاده کنم یا نه. تصمیم گرفتم این موضوع رو بصورت سادهای تست کنم. از فرصت تعطیلی پیش اومده استفاده کردم، با پایتون یه سیگنال صوتی استریو ۶۰۰ هرتز ساختم که، کانالهاش با هم اختلاف فاز ۱۸۰ درجه داشتند. الان در ادامه یه مقدمه کوچک از این تکنولوژی میگم و همچنین به نحوهی ساخت سیگنال صوتی تو پایتون اشاره میکنم و بعد نتیجه کار رو میگم.
کنترل نویز فعال روشی هست که در آن با اضافه کردن صوت دوم اثر صوت ناخواسته اصلی را کاهش میدهند. این مفهموم ابتدا در اواخر دهه ۱۹۳۰ معرفی شد و توسعههای انجام یافته در دهه ۱۹۵۰ منجر به هدستهای هواپیمایی اواخر دهه ۱۹۸۰ شد و الان در وسایل نقلیهجادهای و تلفنهای همراه استفاده میشود.
در این روش صدای نویز توسط میکروفونهایی دریافت میشود و سپس بوسیله مدارات آنالوگ و یا روشهای دیجیتال بر روی آن پردازش انجام میگیرد و توسط بلندگویی دیگر صوتی با همان دامنه ولی در فاز معکوس (که به آنتی فاز معروف است) تولید میشود، این امواج با امواج اصلی ترکیب میشوند و در فرآیندی به نام تداخل، موج جدیدی را تشکیل می دهند و به طور موثر کدیگر را لغو میکنند، تاثیری که تداخل مخرب نامیده میشود. یرای گرفتن نتیجه بهتر باید مکان منشا نویز و بلندگوی پخشکنند امواج آنتی فاز باید یکسان باشد.
طبق معمول تو پایتون کلی کتابخونه برا این کار هست، من از 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()
سیگنال تولیدی:
برای تست دو تا اسپیکر (کانال چپ و راست) رو کنار هم گذاشتم و یک میکروفون رو به فاصله مساوی از هر دو اسپیکر قرار دادم و سپس کانالها رو بصورت تک به تک فعال کردم و خروجیشان رو از طریق میکروفن و نرم افزار Audacity ثبت کردم تا از بالانس بودن هر دو اسپیکر مطمئن شوم، چنان که تفاوتی در خروجی اسپیکرها دیده شود باید با تغییر بهره، هر دو کانال را بالانس کرد. بعد از بالانس کردن، فقط یکی از کانالها را پخش میکنم و سیگنال زیر رو از طریق میکروفون دریافت میکنم:
سپس هر دو کانال را با هم پخش میکنم و نتیجه خروجی زیر میشود.