درس:پردازش گفتار دیحیتال/فصل دوم/بخش سوم

از ویکی جامع پردیس دانشگاهی دانشگاه قم
پرش به: ناوبری، جستجو

تبديل فوريه و کاربردها

بحث تبديل فوريه را با چند تعريف رياضی لازم آغاز می کنيم و سپس به بيان يک سری کاربردها و مفاهيم خواهيم پرداخت. توجه به نکات زير در شروع بحث ضروری به نظر می رسد.

  • مطالبی که در اين قسمت بحث خواهد شد برای سيگنال های گسسته و رقمی مشترک است. از اين رو در اين قسمت تنها واژه گسسته را به کار می بريم و توجه داريم که مباحث ما شامل سيگنال رقمی هم می شود.
  • مباحث مطرح شده در این قسمت، مخصوص سيگنال يک بعدی است. تبدیل فوریه مربوط به سیگنال های دوبعدی در جای خود بیان خواهد شد.
  • فرض می کنيم يک سيگنال (يک بعدی) پيوسته به صورتی مثل ، ... نشان داده شود (متغیر را گرفته ایم.این لزوما به معنی زمان نیست). سيگنال گسسته را نیز با نمادی مثل نشان می دهيم. فرض می کنيم انديس از صفر شروع گردد.

مثال 1-12. مشخص کننده يک سيگنال گسسته است. به طوری که ، ... اندیس در این مثال از صفر تا سه تغییر می کند.

تعریف و محاسبه تبدیل فوریه

برای آشنایی با تبدیل فوریه، ابتدا سری فوریه را معرفی می کنیم که به توابع متناوب مربوط است.

در اوايل قرن نوزدهم فردی به نام جوزف فوريه ادعا نمود که هر تابع متناوبی را می توان به صورت يک مجموع از توابع سينوسی و کسينوسی بيان کرد. اين مجموع را اصطلاحا سری فوريه[۱] می نامند. به عبارت دقیق‏تر، سری فوریه بيان می کند که هر تابع متناوب[۲] پيوسته با دوره تناوب را می توان به صورت زير نوشت:

(1-1)

که در این رابطه می باشد و فرکانس اصلی[۳] يا همساز (هارمونیک) اصلی[۴] خوانده می شود و ، ...همسازهای دوم، سوم ....خوانده می شوند. اگر را زمان با واحد ثانيه بگيريم واحد برابر است که هرتز خوانده می شود. همچنين ضرايب ، ضرايب سری فوريه ناميده می شوند و نشان دهنده ميزان تأثير فرکانس (همساز) متناظر می باشد.

می دانیم و و در نتیجه می توان نشان داد که رابطه بالا به عبارت زير تبديل می شود:

(2-1)

ضرایب يا همان ضرايب سری فوريه از رابطه زير به دست می آيند:

(3-1)

اين در صورتی است که تابع متناوب باشد. در حالتی که تابع نامتناوب باشد می توان فرض کرد که تابعی متناوب با تناوب داريم. در اين حالت می توان نشان داد که ضرايب گسسته تبديل به تابعی پيوسته بر حسب فرکانس يعنی خواهد شد و سيگما در (1-3) به انتگرال تبديل می شود و رابطه زير را خواهيم داشت:

(4-1)

در اينجا ديگر عددی برابر نيست. بلکه متغيری پيوسته است که از تا تغییر می کند.تابع در واقع متناظر با همان ضرايب گسسته است که اکنون به تابعی پيوسته تبديل شده اند. اين تابع با استفاده از رابطه زير به دست می آيد:

(5-1)

رابطه بالا اصطلاحا تبديل فوريه سيگنال پيوسته خوانده می شود. در واقع برای تابع متناوب ضرايب فوريه و برای تابع نامتناوب تبديل فوريه داريم.

اين، تعريف تبديل فوريه برای يک تابع پيوسته بود. برای تابع گسسته نيز به طور مشابه تعريفی برای تبديل فوريه داريم. در زير تعريف تبدیل فوريه را به طور کامل ذکر کرده ايم.

تعريف تبديل فوريه

  • برای سيگنال پيوسته تبديل فوريه به صورت زير تعريف می شود:
(6-1)
  • برای سيگنال گسسته تبديل فوريه به صورت زير تعريف می شود:
(7-1)

که تعداد عناصر(نقاط) سيگنال گسسته می باشد.

به رابطه (1-6) تبدیل فوريه پيوسته (CFT[۵]) و به (1-7) تبديل فوريه گسسته (DFT[۶]) گفته می شود.

در شکل زیر، همسازهای اول تا سوم در يک سری فوريه و مجموع آنها نشان داده شده است.


شکل 1-4. همساز اول تا سوم يک سيگنال و مجموع آنها (Karris, 2012)


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

مثال 1-13. سيگنال گسسته به صورت زير تعريف شده است. مطلوبست محاسبه DFT اين سيگنال.








با توجه به رابطه خواهیم داشت:





نکته: حاصل تبديل فوريه در حالت کلی شامل اعداد مختلط است. با توجه به (1-7) خواهیم داشت:

(8-1)


در نتيجه قسمت های حقيقی[۷] و موهومی[۸] را می توان به صورت زير نوشت:


(9-1)



قضيه: اگر تبديل فوريه گسسته سيگنال باشد خواهيم داشت:


(10-1)


اين رابطه نشان می دهد که سيگنال از روی DFT اش يعنی قابل بازسازی[۹] می باشد.

نکته: رابطه (1-10)، معکوس DFT يا IDFT[۱۰] نامیده می شود.

مثال 1-14. معکوس مثال 1-13 را انجام دهيد. يعنی فرض کنيد تبديل فوريه گسسته به صورت زير مفروض باشد و از روی آن را به دست بياوريم.








همان گونه که ملاحظه می شود توانسته ايم به اوليه دست پيدا کنيم.

مثال 1-13 و مثال 1-14 نشان می دهند بهتر است محاسبه DFT يا IDFT با استفاده از نرم افزار انجام شود.

مثال 1-15. برنامه MATLAB زير تبديل فوريه سيگنال پيوسته را محاسبه می کند.


syms t;
x_t=sin(t^2);
y=fourier(x_t);


در این برنامه، از جعبه ابزار ریاضیات سمبلیک MATLAB استفاده شده است. تابع fourier تبديل فوريه سيگنال را محاسبه می کند. با تغيير x_t می توان تبديل فوريه سيگنال هاي ديگر را محاسبه کرد.

مثال 1-16. مطلوبست انجام مثال 1-13 با نوشتن يک برنامه MATLAB

روش اول


clc
x=[1 2 2 1];
N=length(x);
for m=1:N
    X(m)=0;
    for n=1:N
        X(m)=X(m)+x(n)*exp(-j*2*pi*(n-1)*(m-1)/N);
    end
end
fprintf('\nThe original signal:');
fprintf('\nx[n]=[');
fprintf('%.2f\t',x);
fprintf(']');
fprintf('\nThe DFT:');
fprintf('\nX[m]=[');
fprintf('%.2f+(%.2fj)\t',[real(X);imag(X)]);
fprintf(']\n');


توضيحات

clc: برای پاک کردن صفحه نمايش MATLAB به کار می رود.

length: تابعی که طول يک آرايه را حساب می کند.

fprintf: برای نمايش متن يا مقدار متغيرها به کار می رود. توضيحات بيشتر آن را در Help نرم افزار MATLAB بيابيد.

real: قسمت حقيقی عدد مختلط را برمی گرداند.

imag: قسمت موهومی عدد مختلط را برمی گرداند.


روش دوم

تابع FFT در MATLAB ، DFT سيگنال را محاسبه می کند. برنامه زير همان کار برنامه قبل را به صورت ساده تری انجام می دهد.


clear all
close all
clc
x=[1 2 2 1];
N=length(x);
X=fft(x);
fprintf('\nThe original signal:');
fprintf('\nx[n]=[');
fprintf('%.2f\t',x);
fprintf(']');
fprintf('\nThe DFT:');
fprintf('\nX[m]=[');
fprintf('%.2f+(%.2fj)\t',[real(X);imag(X)]);
fprintf(']\n');


نکته: در MATLAB اندیس آرایه ها از عدد یک شروع می شود.

مثال 1-17. مطلوبست انجام مثال 1-14 با نوشتن يک برنامه MATLAB

روش اول


clear all
close all
clc
X=[6 -1-j  0  -1+j];
N=length(X);
for n=1:N
    x(n)=0;
    for m=1:N
        x(n)=x(n)+(1/N)*X(m)*exp(j*2*pi*(m-1)*(n-1)/N);
end
end
fprintf('\nThe DFT:');
fprintf('\nX[m]=[');
fprintf('%.2f+(%.2fj)\t',[real(X);imag(X)]);
fprintf(']\n');
fprintf('\nThe original signal:');
fprintf('\nx[n]=[');
fprintf('%.2f\t',x);
fprintf(']');


روش دوم

در MATLAB تابع IFFT معکوس تابع فوريه را حساب می کند.


clear all
close all
clc
X=[6 -1-j  0  -1+j];
x=ifft(X);
fprintf('\nThe DFT:');
fprintf('\nX[m]=[');
fprintf('%.2f+(%.2fj)\t',[real(X);imag(X)]);
fprintf(']\n');
fprintf('\nThe original signal:');
fprintf('\nx[n]=[');
fprintf('%.2f\t',x);
fprintf(']');


نکته: برای محاسبه DFT الگوريتمی به نام الگوریتم پروانه[۱۱] وجود دارد که با سرعت زيادتری محاسبه را انجام می دهد. در MATLAB اين الگوريتم پياده سازی شده است. از اين رو نام تابع MATLAB به جای DFT، واژهFFT که مخفف عبارت "تبدیل فوریه سریع"[۱۲] می باشد، استفاده شده است. همين الگوريتم برای محاسبه IDFT هم استفاده می شود و در نتيجه نام تابع در MATLAB به جای IDFT، IFFT می باشد. برای آشنایی با این الگوریتم، به (Mitra, 2001) مراجعه نمایید.

نکته: هر عدد مختلط به صورت قابل تبدیل است که ، دامنه[۱۳] و ، فاز[۱۴] خوانده می شوند. در نتيجه می توان DFT را نيز به این شکل بیان نمود.

نکته: در خصوص سيگنال های طبيعی مانند صدا بيشتر با دامنه کار داريم. چون بيشتر اطلاعاتی که برای پردازش آنها نياز است در دامنه وجود دارد.

مثال 1-18. در مثال 1-13 دامنه و فاز به صورت زير می باشد.




نکته: در MATLAB تابع atan2 برای محاسبه فاز سيگنال به کار می رود و تابع abs دامنه را محاسبه می کند. برای آشنايی با اين دو تابع به مثال زیر توجه کنيد.

مثال 1-19. سیگنال به صورت زير مفروض است. مطلوبست نوشتن برنامه MATLAB که دامنه و فاز تبديل فوريه آن يعنی را محاسبه کند و سپس و دامنه و فاز را رسم کند.



clear all
close all
clc
x=[0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0.7431...
0.3922 0.6555 0.1712 0.7060 0.0318 0.2769 0.0462...
0.0971 0.8235 0.6948 0.3171 0.9502 0.0344];
X=fft(x);
X_amp=abs(X); %The amplitude of X
X_phase=atan2(imag(X),real(X)); %The phase of X
subplot(3,1,1);
stem(x);
title('The original signal x[n]');
subplot(3,1,2);
stem(X_amp);
title('The amplitude of its Fourier transfor X[m]');
subplot(3,1,3);
stem(X_phase);
title('The phase of its Fourier transfor X[m]');


توضيحات

تابع atan2 با گرفتن بخش موهومی و حقيقی فاز آن را محاسبه می کند. همان گونه که می دانيم فاز يک عدد موهومی از قانون زير به دست می آيد.


(11-1)


(البته برای نقطه فاز تعريف نمی شود).

تابع atan2 اين رابطه را پياده سازی می کند.


شکل 1-5. نمودار مربوط به نتيجه اجراي مثال 1-19

مثال 1-20. برنامه زير يک فايل صوتی به نام DO_6001_12000.wav را می خواند. همان گونه که گفته شد صدا در واقع يک سيگنال يک بعدی است و می توان آن را با نشان داد. اين مثال در واقع تکرار مثال 1-19 برای اين سيگنال صوتی می باشد.


clear all
close all
clc
x=wavread('DO_6001_12000.wav');
X=fft(x);
X_amp=abs(X);
X_phase=atan2(imag(X),real(X)); %The phase of X
subplot(3,1,1);
stem(x);
title('The original signal x[n]');
subplot(3,1,2);
stem(X_amp);
title('The amplitude of its Fourier transfor X[m]');
subplot(3,1,3);
stem(X_phase);
title('The phase of its Fourier transfor X[m]');


شکل 1-6 نتيجه اجرای اين مثال را نشان می دهد. به علت وجود تعداد زياد نمونه ها نمودارها پيوسنه به نظر می رسد.

نکته مهم: با دقت در شکل 1-5 مشاهده می کنيم مقادير دارای تقارن می باشند و مقادير نيز دارای تقارن اما به صورت معکوس می باشند (البته برای اولين نمونه يعنی ، نقطه متناظر متقارن وجود ندارد). می توان ثابت کرد در حالت کلی هم همين وضعيت برقرار است. با توجه به (1-9) خواهيم داشت:


(12-1)



از اين رابطه نتيجه می گيريم:


(13-1)


به عنوان مثال با فرض خواهيم داشت و .البته چون انديس آرايه ها در MATLAB از یک شروع می شود متناظر اين روابط در شکل بالا و خواهد شد.


شکل 1-6. نمودار مربوطه به نتيجه اجراي مثال 1-20

کاربردهای تبدیل فوریه

گفته شد که هر تابع متناوب را می توان به صورت سری فوريه که شامل مجموع مؤلفه های سينوسی و کسينوسی با ضرايب مي باشد، بیان نمود. نکته مهم اينکه هر چه مقدار در عبارات یا افزايش يابد منحنی های تنگ تری خواهيم داشت (به شکل 1-7 دقت شود). از اين نکته، نتيجه مهمی گرفته می شود. اگر تابعی با نواحی تنگ يا با جهش های سريع داشته باشيم می توانيم نتيجه بگيريم تابع متناوب ما دارای همسازهايی در فرکانس های بالا (مثلا می باشد و اگر تابعی با شکل نرم[۱۵] داشته باشيم آنگاه ضرايب متناظر با همسازها يا فرکانس های بالا برابر صفر هستند يا ناچيزند.

هر چند اين نکته در مورد توابع متناوب و سری فوريه بيان شد اما به صورت شهودی می توان آن را در مورد توابع نامتناوب و تبديل فوريه تعميم داد. در مواردی که تابع نامتناوب دارای جهش و تغييرات سريع باشد می توان نتيجه گرفت که یا در مقادیر بزرگ یا دارای مقدار قابل توجه می باشد و بالعکس اگر یا در مقادیر بزرگ دارای مؤلفه بودند می توان نتيجه گرفت تابع دارای تغييرات سريع می باشد. در شکل 1-8 نتايج حاصل از محاسبه برای دو تابع مختلف آورده شده است. همان گونه که ملاحظه می شود تابعی که تغييرات سريع تری داشته است در های بالا مقادير قابل توجه تری داشته است. توجه داريم که به دليل تقارن تنها به نيمی از نمونه های آن بايد توجه می کنيم. به بيان خلاصه تبديل فوريه يک سيگنال نشان دهنده ميزان تغييرات آن می باشد.

(الف)
||
(ب)
||
(ت)

شکل 1-7. مجموع مؤلفه سینوسی به ازای مقادير مختلف .الف) - ب).. - ت)


(الف)
||
(ب)

شکل 1-8. تبديل فوريه به ازاي دو سيگنال گسسته مختلف-

الف)

ب)



در ادامه بحث نکته بسيار مهم و کليدی که در واقع ايده و سرچشمه اکثر کاربردهای تبديل فوريه می باشد را توضيح می دهيم. اين نکته مهم آن است که اکثر سيگنال های طبيعی مانند صدا يا تصوير دارای تغييرات نرم و غير سريع می باشند. با توجه به اين موضوع کاربردهای جالب و متعددی برای تبديل فوريه به وجود آمده است. به عنوان مثال در اينجا به دو کاربرد اشاره می شود.

  • بالا بردن کيفيت سيگنال: همان گونه که گفته شد اکثر سيگنال های طبيعی دارای طبيعت تغيير نرم هستند. در مقابل اختلالات و نويزهايی که اين سيگنال ها دچار آن می شوند (مانند خِش خِش های صوتی) دارای آهنگ تغييرات شديد می باشند. اگر سیگنال، اطلاعات مهمی در فرکانس های بالا نداشته باشد و از سيگنال نويزی شده تبديل فوريه گرفته و مؤلفه های فرکانس بالای آن را صفر کنیم، می توانيم بگوييم تغييرات سريع يا نويزها را حذف کرده ایم. اگر چه ممکن است با این کار، به کيفيت سيگنال اصلی (بدون نويز) هم آسيب وارد شود اما چون اين سيگنال در فرکانس های بالا مقادير کمی دارد اين تخريب، چندان قابل توجه نخواهد بود.
  • فشرده سازی[۱۶] : فرض کنيد يک سيگنال گسسته با 1000 نمونه داشته باشيم. از اين سيگنال تبديل فوريه می گيريم. نتيجه با 1000 مؤلفه خواهد بود. از اين 1000 مؤلفه، 500 مؤلفه اول را انتخاب می کنيم و با انجام تبديل فوريه معکوس به ای با 500 نمونه می رسيم. در اينجا حذف فرکانس های بالا با توجه به اينکه سيگنال در آنها مقادير قابل توجهی ندارد مشکل مهمی ايجاد نمی کند. اما ما توانسته ايم تعداد را از 1000 نمونه به 500 نمونه کاهش دهيم. به اين عمل فشرده سازی گفته می شود.

مثال 1-21. برنامه زير يک صدا را می خواند و مقداری از نويز موجود آن را حذف می کند.


[s Fs]=wavread('noisy1.wav');
wavplay(2*s)
S=fft(s);
S_amp=abs(S);
S_phase=atan2(imag(S),real(S));
len=length(s);
S_amp(fix(len/4):fix(len/2))=0;
S_phase(fix(len/4):fix(len/2))=0;

for i=2:fix((len-1)/2)
    S_amp(len-i)=S_amp(i);
    S_phase(len-i)=-S_phase(i);
end
S2=S_amp.*exp(j.*S_phase);
s2=abs(ifft(S2));
wavplay(2*s2,Fs)


فایل سیگنال نویزی،noisy1.wav نام دارد که در سی ‏دی همراه کتاب وجود دارد.

بعد از اجرای برنامه زير مشاهده می شود که هر چند صدای حذف نويز شده ميزان نويز (خش خش) کمتری دارد اما به کيفيت صدای اصلی هم آسيب وارد شده است. علت آن است که مؤلفه های فرکانس بالا را کلا صفر گرفته ايم و در نتيجه بخش هايی از داده که در فرکانس بالا هستند هم تحت تأثير قرار گرفته اند. يک راه بهتر می تواند اين باشد که همه آنها را يکباره صفر نکنيم بلکه به صورت خطی آنها را تضعيف کنيم تا در نهايت صفر شوند.

مثال 1-22. برنامه زير يک فايل صوتی را مي خواند. بعد از تبديل فوريه گرفتن، نيمه بالای فرکانسی را حذف می کند. به اين ترتيب اگر تعداد نمونه های صوت اوليه بود اکنون نمونه برای تبديل فوريه خواهيم داشت. همچنين بعد از گرفتن عکس تبديل فوريه به صدايی دست خواهيم يافت که تعداد نمونه هايش نصف اولی است و در واقع فشرده شده است. در برنامه هم صدای اوليه و هم صدای فشرده شده پخش می شود.


[s Fs]=wavread('Do.wav');
wavplay(2*s)
S=fft(s);
len=length(S);
S1=S(1:fix(len/4));
for i=2:fix((len-1)/4)
    S1 (len/2-i)=S1(i);
end
s1=ifft(S1);
wavplay(2*real(s1),Fs/2);
wavwrite(real(s1),'222.wav');


در قسمت های ديگر کتاب با کاربردهای مهم ديگری از تبديل فوريه آشنا می شويم. همچنین برای آشنايی بیشتر با تبدیل فوریه و انواع آن به کتاب‏های مربوط به پردازش سیگنال مانند (Oppenheim & Willsky, 1996) و (Oppenheim & Schafer, 2009) مراجعه نمایید.

پاورقی

  1. Fourier series
  2. Periodic
  3. Fundamental frequency
  4. Fundamental harmonic
  5. Continuous Fourier transform (CFT)
  6. Discrete Fourier transform (DFT)
  7. Real part
  8. Imaginary part
  9. Restore
  10. Inverse DFT (IDFT)
  11. Butterfly algorithm
  12. Fast Fourier Transform (FFT)
  13. Amplitude
  14. Phase
  15. Smooth
  16. Compression