پردازش صدا در متلب (آموزش کامل و نکات کاربردی)
پردازش صدا در متلب که به پردازش سیگنال هم معروف است (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’)
موقع اجرای این تابع، پاسخ فیلتر شده که بسته به ماهیت سیگنال، پایین گذر و شکل موج است را دریافت می کنیم.
حالا می توانیم ببینیم که نویز چطور در خروجی کاهش پیدا می کند. توجه داشته باشید که به جای ترسیم کل نمونه، از عدد 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
ما ساختار اکولایزر را موازی می گیریم. این بدان معناست که فیلترهای موازی زیادی اجرا می شوند. خط 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) را در خط فرمان اجرا می کنیم.
جمع بندی
متلب ابزار خوب و مناسبی برای تجزیه و تحلیل سیگنال صوتی است و عملکردهایی دارد که تجسم این سیگنال ها را بسیار آسانتر می کنند. همانطور که در این مطلب بررسی کردیم تجزیه و تحلیل سیگنال صوتی به ابزار مناسبی نیاز دارد که متلب دقیقا همین ابزار است.
در ادامه: روش گوس سایدل در متلب از صفر تا صد
فیلتر کردن سیگنال صوتی یک ویژگی مهم است، چون می توان از آن برای حفظ اطلاعات از دست رفته استفاده کرد. این ویژگی باعث می شود که متلب در طیف گسترده ای از زمینه ها قابل استفاده باشد.
ممنون از اموزش صدا در متلب ،من یک صدا وارد مطلب کردم میخوام 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)
لطفا راهنمایی می فرمایید ممنون