پردازش صدا در متلب (آموزش کامل و نکات کاربردی)

رتبه: 5 ار 1 رای SSSSS
پردازش صدا در متلب
نویسنده: تیم تولید محتوا زمان مطالعه 8 دقیقه
Banner Image

پردازش صدا در متلب که به پردازش سیگنال هم معروف است (Audio Signal Processing) تغییرات مقادیر فیزیکی در طول زمان را توصیف می کند و پردازش سیگنال یعنی دستکاری سیگنال ها برای تغییر رفتار یا استخراج اطلاعات. متلب (Matlab) ابزاری برای ساخت و دستکاری سیگنال های زمان گسسته ارائه می دهد که شامل خواندن و تجزیه و تحلیل آنها است. متلب روی تغییر صداها، روش های مورد استفاده برای پخش موسیقی و بخش های مخابراتی متمرکز است.

ما در این مقاله روش های فیلتر کردن سیگنال های مختلف را بررسی می کنیم و به اکولایزر گرافیکی، افکت اکو (echo)، افکت فلنج (flange) و فیلتر پایین گذر (low-pass filter) که برای حذف نویز سفید گاوسی استفاده می شود نگاهی می اندازیم.

حتما بخوانید: دانلود رایگان ۱۳ فیلم کاربردی آموزش شبکه عصبی در متلب

علاوه بر این، تکنیک های پردازش طیفی برای تبدیل صدای مرتبط، دانش عملی مورد نیاز برای تجزیه و تحلیل، سنتز و توصیف سیگنال های صوتی در حوزه برنامه های موسیقی را هم بررسی می کنیم.

فیلتر پایین گذر (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 سیگنال خراب ما است. عدد 15 هم نسبت 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’)

موقع اجرای این تابع، پاسخ فیلتر شده که بسته به ماهیت سیگنال، پایین گذر و شکل موج است را دریافت می کنیم.

plot of magnitude response

plot of the signals

حالا می توانیم ببینیم که نویز چطور در خروجی کاهش پیدا می کند. توجه داشته باشید که به جای ترسیم کل نمونه، از عدد 450 برای مشاهده تفاوت استفاده می کنیم. این شکل موجها فیلتراسیون را به وضوح نشان می دهند، اما برای فهمیدن تفاوت می توانیم به آهنگ هم گوش کنیم.

معرفی نرم افزار متلب (۴ کاربرد اصلی و ۳ نقطه قوت)

برای گوش دادن به موسیقی در متلب، فرمان sound(xn, fs) را برای سیگنال نویز در پنجره فرمان اجرا می کنیم. همین کار را برای سیگنال فیلتر شده sound(y, Fs) هم اجرا می کنیم. موقع گوش دادن به موسیقی خروجی، متوجه می شوید که نویز پس زمینه به میزان قابل توجهی کاهش می یابد.

اکولایزر گرافیکی (Graphic equalizer)

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

کد متلب برای اکولایزر

ابتدا audioDeviceReader را مقداردهی اولیه می کنیم:

deviceReader = audioDeviceReader(‘Driver’, ‘ALSA’, ‘device’,…

‘line In(RealtekHighDefination Audio)’, ‘samplesperFrame’, 2048, ‘SampleRate’, 44100);

برای پخش آهنگ، تابع audioDeviceWriter را اجرا می کنیم. این تابع موسیقی را با همان نرخ نمونه برداری (sample rate) پخش می کند و همانطور که نشان داده شده از یک ابزار اکولایزر برای اجرای افکت استفاده می کند:

deviceWriter = audioDeviceWriter(‘SampleRate’, device reader.SampleRate);

equalizer = graphicEQ(‘Bandwidth’, ‘1 octave’, ‘structure’, ‘parallel’, ‘SampleRate’,…

deviceReader.SampleRate); % we define the bandwidth which we have taken as 1 0ctave

چرب زبان

متلب رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، حل ساده سخت ترین پروژه ها، شبیه سازیها و مسائل، فوق العاده پولساز، خرید و دانلود!

ما ساختار اکولایزر را موازی می گیریم. این بدان معناست که فیلترهای موازی زیادی اجرا می شوند. خط 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 برای تکرار به مدت 30 ثانیه استفاده می کنیم:

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 ]] ترتیب اثر می دهد. در افکت های بزرگ به دلیل موج سینوسی با فرکانس پایین تاخیر بیشتری وجود دارد و این تاخیر با توجه به شکل سینوس و همانطور که در معادله نشان داده شده تغییر می کند.

کد متلب برای افکت فلنج

[filename, pathname] = uigetfile(‘*.*’, ‘select your audio file’);

[x, Fs] = audioReader(num2str(filename));

n = length(x); % length of the music

tn = n/Fs; % finds length of music in seconds

f = 0.25; % frequency of sine wave in Hz

ما از linspace استفاده می کنیم تا مقدار n نقطه را با فاصله مساوی بدست آوریم:

t = linspace(0, tn, n);

d = 100; % Delay factor

سپس یک موج سینوسی با فرکانس پایین در زیر ایجاد می کنیم. ضریب تاخیر زمانی است که سیگنال از یک نقطه عبور می کند و بر حسب میلی ثانیه اندازه گیری می شود.

modsin = sin(2*pi*f*t);

سپس مقدار تاخیر با استفاده از تابع round و گرد کردن حاصل ضرب، ضریب تاخیر و مدسین (modsin) ایجاد می شود:

modsin1 = round(d.*modsin’) + d; %variable delay

y = zeros(n + d, 1); % initializing the output music signal

a = 0.5; % attenuation factor

xn = padarray(x,[d,0], 0, ‘pre’);

for i = (d+1):1:n

y(i-d,1) = x(1) + a*xn(i-modsin1(i-d));

end

برای گوش دادن به موسیقی با افکت فلنج، sound(y, Fs) را در خط فرمان اجرا می کنیم.

جمع بندی

متلب ابزار خوب و مناسبی برای تجزیه و تحلیل سیگنال صوتی است و عملکردهایی دارد که تجسم این سیگنال ها را بسیار آسانتر می کنند. همانطور که در این مطلب بررسی کردیم تجزیه و تحلیل سیگنال صوتی به ابزار مناسبی نیاز دارد که متلب دقیقا همین ابزار است.

در ادامه: روش گوس سایدل در متلب از صفر تا صد

فیلتر کردن سیگنال صوتی یک ویژگی مهم است، چون می توان از آن برای حفظ اطلاعات از دست رفته استفاده کرد. این ویژگی باعث می شود که متلب در طیف گسترده ای از زمینه ها قابل استفاده باشد.

profile name
تیم تولید محتوا

بخندید کتاب بخونید و خوب باشید تا جامعه مون به آرامش برسه. لطفا ! هر سوالی دارید در بخش نظرات مطرح کنید. ما یا سایر هموطنان عزیز پاسخ خواهیم داد. برای کمک به سایت ما و گسترش آموزش در بین هموطنان، در سایتها، وبلاگ ها و شبکه های اجتماعی لینک سایت ما را درج کنید.

مطالب پیشنهادی برای شما

محصولات مرتبط

مشاهده همه

دیدگاهتان را بنویسید

1 2 3 4 5

1 نظر درباره «پردازش صدا در متلب (آموزش کامل و نکات کاربردی)»

  • حسینی
    حسینی آیا این دیدگاه مفید بود ؟

    ممنون از اموزش صدا در متلب ،من یک صدا وارد مطلب کردم میخوام delay time روی صدا اعمال کنم یعنی با زیاد کردن بازه زمانی در هر ثانیه زمان بیشتر و سرعت صدا کندتر بشه ولی تابع delay روی آن اعمال نمیشه کد برنامه رو خدمتتون میفرستم :
    [x, fs] = audioread(speech.wav);
    t = 0:1/fs:0.005;
    signal = cos(2*pi*1000*t);
    n=length(x);
    tn=n/fs;
    delayed_signal = delayseq(signal,0.25e-3,fs);
    sound(delayed_signal,fs)
    لطفا راهنمایی می فرمایید ممنون

    پاسخ
مشاهده همه نظرات
سبد خرید
سبد خرید شما خالی است
× جهت نصب روی دکمه زیر در گوشی کلیک نمائید
آی او اس
سپس در مرحله بعد برروی دکمه "Add To Home Screen" کلیک نمائید