تولید صوت در متلب با سیگنال ورودی
تولید صوت در متلب با سیگنال ورودی : پروژه متلب
پروژه متلب پردازش صدا در متلب که به پردازش سیگنال هم معروف است (Audio Signal Processing) تغییرات مقادیر فیزیکی در طول زمان را توصیف می کند و پردازش سیگنال یعنی دستکاری سیگنال ها برای تغییر رفتار یا استخراج اطلاعات. متلب (Matlab) ابزاری برای ساخت و دستکاری سیگنال های زمان گسسته ارائه می دهد که شامل خواندن و تجزیه و تحلیل آنها است. متلب روی تغییر صداها، روش های مورد استفاده برای پخش موسیقی و بخش های مخابراتی متمرکز است.
فیلتر پایین گذر (low-pass filter)
فرض می کنیم که سیگنال ما با نویز سفید گاوسی ترکیب شده و حالا می خواهیم این نویز را با استفاده از فیلتر پایین گذر کاهش بدهیم.
کد متلب برای فیلتر پایین گذر (LPF)
سیگنال صوتی را با اجرای کد زیر به متلب وارد می کنیم:
% Program to implement a LPR(FIR) with cutoff 8kHz to denoise audio signal.
[fileName, pathName] = uigetfile(‘*.*’, ‘select the input audio’);
[x, Fs] = audioread(num2str(fileName)); % x is the audio samples and Fs is the sampling rate.
پروژه متلب نمونه های صوتی (x) اعدادی هستند که مقدار موج را در یک نقطه در یک زمان خاص نشان می دهند. فرکانس نمونه برداری (Fs) تعداد نمونه های صوتی بازیابی شده در هر ثانیه است. audioread هم یک تابع داخلیست که برای خواندن صدای ورودی از آن استفاده می شود. وقتی این تابع اجرا شد، کل نمونه صوتی در متغیر x بارگذاری و فرکانس نمونه برداری در متغیر Fs ذخیره می شود.
دانلود کنید: ۷ درس کاربردی آموزش برنامه نویسی در متلب
ویژگی های فیلتری که از آن استفاده خواهیم کرد:
% filter implementation
Fsf = 44100; % Sampling Frequency
Fp = 8e3; % Passband Frequency in Hz
Fst = 8.4e3; % stopband Frequency
Ap = 1; % passband ribble in db
Ast = 95; % stopband attenuation in db
سپس فیلتر را با دور زدن تمام ویژگی های تابع designfilt طراحی می کنیم.
df = designfilt(‘lowpassfir’, ‘PassbandFrequency’, Fp, ‘StopbandFrequency’,…
Fst, ‘passbandRipple’, Ap, ‘stopbandAttenuation’, Ast, ‘sampleRate’, Fsf);
به محض اجرا، df را خواهیم داشت که یک شئ فیلتر کننده (filter object) است. برای بررسی اینکه آیا فیلتر درست کار می کند یا نه، از تابع fvtool استفاده می کنیم. این کار باعث تجسم پاسخ فرکانسی فیلتر می شود.
fvtool(df); % visualize freq response of filter
xn = awgn(x,15,’measured’); % signal corrupted by white Gaussian noise
پروژه متلب در کد بالا، x سیگنال اصلی محسوب می شود چون حاوی نمونه هایی از صدای ورودی است. برای از بین بردن آن نویز گاوسی را با استفاده از تابع awgn اضافه می کنیم. xn سیگنال خراب ما است. عدد ۱۵ هم نسبت SNR (نسبت سیگنال به نویز) است. SNR نسبت اطلاعات مورد نظر به نویز پس زمینه است. نسبت بالا نشان دهنده اضافه شدن نویز کمتر و نسبت پایین بیانگر این است که نویز بیشتر اضافه شده است.
حتما بخوانید: آموزش نکات پایه ای و مهم سیمولینک در نرم افزار متلب
سپس در حالی که فیلتر (df) و سیگنال نویز (xn) را به عنوان پارامترهای تابع عبور می دهیم، سیگنال نویز را با استفاده از تابع filter ، فیلتر می کنیم:
y = filter(df, xn);
خروجی های df در متغیر y ذخیره می شوند. اینها نمونه های صوتی فیلتر شده هستند. سپس سیگنال اصلی، سیگنال نویزدار و سیگنال فیلتر شده را با استفاده از تابع plot و مطابق شکل زیر رسم می کنیم:
%plotting signals
subplot(3,1,1)
plot(x)
title(‘original signal’)
subplot(3,1,2)
plot(xn)
title(‘Noisy signal’)
subplot(3,1,3)
plot(y)
title(‘filtered signal’)
موقع اجرای این تابع، پاسخ فیلتر شده که بسته به ماهیت سیگنال، پایین گذر و شکل موج است را دریافت می کنیم.
حالا می توانیم ببینیم که نویز چطور در خروجی کاهش پیدا می کند. توجه داشته باشید که به جای ترسیم کل نمونه، از عدد ۴۵۰ برای مشاهده تفاوت استفاده می کنیم. این شکل موجها فیلتراسیون را به وضوح نشان می دهند، اما برای فهمیدن تفاوت می توانیم به آهنگ هم گوش کنیم.
برای گوش دادن به موسیقی در متلب، فرمان sound(xn, fs) را برای سیگنال نویز در پنجره فرمان اجرا می کنیم. همین کار را برای سیگنال فیلتر شده sound(y, Fs) هم اجرا می کنیم. موقع گوش دادن به موسیقی خروجی، متوجه می شوید که نویز پس زمینه به میزان قابل توجهی کاهش می یابد.
اکولایزر گرافیکی (Graphic equalizer)
اغلب اوقات موقع پخش آهنگ روی هر نوع پخش کننده صوتی، موتجه این نوع اکولایزر می شوید. از این اکولایزر برای تولید افکت ها و جلوه های صوتی مختلف استفاده می شود. متلب برای اجرای این اکولایزر یک تابع داخلی دارد.
کد متلب برای اکولایزر
ابتدا audioDeviceReader را مقداردهی اولیه می کنیم:
deviceReader = audioDeviceReader(‘Driver’, ‘ALSA’, ‘device’,…
‘line In(RealtekHighDefination Audio)’, ‘samplesperFrame’, ۲۰۴۸, ‘SampleRate’, ۴۴۱۰۰);
برای پخش آهنگ، تابع audioDeviceWriter را اجرا می کنیم. این تابع موسیقی را با همان نرخ نمونه برداری (sample rate) پخش می کند و همانطور که نشان داده شده از یک ابزار اکولایزر برای اجرای افکت استفاده می کند:
deviceWriter = audioDeviceWriter(‘SampleRate’, device reader.SampleRate);
equalizer = graphicEQ(‘Bandwidth’, ‘۱ octave’, ‘structure’, ‘parallel’, ‘SampleRate’,…
deviceReader.SampleRate); % we define the bandwidth which we have taken as 1 0ctave
ما ساختار اکولایزر را موازی می گیریم. این بدان معناست که فیلترهای موازی زیادی اجرا می شوند. خط deviceReader.SampleRate دستگاه و نرخ نمونه برداری را شبیه سازی می کند. سپس بهره یا گین (gain) را مشخص می کنیم. دستاوردها موقعیت نوار لغزنده اکولایزر هستند.
equalizer.Gains = [4 4.2 4.6 2.7 -3.7 -5.2 -2.5 2.3 5.4 6.5];
برای تجسم اکولایزر از تابع visualize به صورت زیر استفاده می کنیم:
visualize(equalizer)
nUnderruns = 0;
tic;
سپس از حلقه while برای تکرار به مدت ۳۰ ثانیه استفاده می کنیم:
while toc < 30 % 30 sec of simulation
in = deviceReader();
out = equalizer(in);
nUnderruns = nUnderruns + deviceWriter(out);
end
deviceReader تمام نمونه های ورودی را می خواند و آنها را در متغیر in ذخیره می کند. سپس متغیر in به اکولایزر ارسال و خروجی در متغیر out ذخیره می شود. در مرحله بعد متغیر out توسط deviceReader خوانده و از طریق اسپیکر لپ تاپ پخش می شود.
پس از جذب، پاکسازی می کنیم تا تمام ورودی ها آزاد شوند.
% clean up
release(out);
release(deviceReader)
release(deviceWriter)
افکت اکو (Echo effect)
پروژه متلب اکو برای بهتر شدن افکت سیگنالها به آنها اضافه می شود. معادله این افکت به این صورت است:
y(n) = x(n) + a.x[ n-d ]
“y(n)” سیگنال خروجی است. “a” بهره یا گین و”d” تاخیر است. در اینجا گین میزان عمق مورد نیاز شما را مشخص می کند.
کد متلب برای افکت اکو
[filename, pathname] = uigetfile(‘*.*’, ‘select your audio file’);
[x, Fs] = audioReader(num2str(filename));
n = length(x); % length of the music file
a = 0.8; % attenuation factor(gain)
d = 2000; % Delay input stream
y = zeros((n + d),1); % Initialize the output music signal
xn = padarray(x, [d,0], 0, ‘pre’);
for i = (d+1): 1: n
y(i-d,1) = x(i) + a*xn(i-d);
end
برای گوش دادن به آهنگ، ما sound(y, Fs) را در در پنجره فرمان اجرا می کنیم.
افکت فلنج (Flange effect)
افکت فلنج با معادله y(n) = x(n) + a.x[ n-d [ n ]] ترتیب اثر می دهد. در افکت های بزرگ به دلیل موج سینوسی با فرکانس پایین تاخیر بیشتری وجود دارد و این تاخیر با توجه به شکل سینوس و همانطور که در معادله نشان داده شده تغییر می کند.
خروجی متلب :
دیدگاه ها