تبدیل فوریه ابزاری قدرتمند برای تجزیه و تحلیل سیگنال ها است و در همه چیز از پردازش صوتی گرفته تا فشرده سازی تصویر استفاده می شود. SCIPY اجرای بالغ را در ماژول Scipy. fft خود فراهم می کند ، و در این آموزش ، شما می آموزید که چگونه از آن استفاده کنید.
ماژول Scipy. fft ممکن است در ابتدا ارعاب کننده به نظر برسد زیرا بسیاری از توابع وجود دارد ، اغلب با نام های مشابه ، و اسناد و مدارک از اصطلاحات فنی زیادی استفاده می کنند بدون توضیح. خبر خوب این است که برای شروع استفاده از ماژول فقط باید چند مفهوم اصلی را درک کنید.
نگران نباشید اگر با ریاضی راحت نیستید! از طریق نمونه های مشخص ، احساس الگوریتم را به دست خواهید آورد و اگر می خواهید به معادلات شیرجه بزنید ، پیوندهایی برای منابع بیشتر وجود خواهد داشت. برای معرفی بصری در مورد نحوه عملکرد Fourier Transform ، شما ممکن است ویدیوی 3Blue1Brown را دوست داشته باشید.
در این آموزش ، شما یاد خواهید گرفت:
- چگونه و چه موقع از تبدیل فوریه استفاده می کنیم
- نحوه انتخاب عملکرد صحیح از scipy. fft برای مورد استفاده خود
- نحوه مشاهده و اصلاح طیف فرکانس یک سیگنال
- کدام تبدیل های مختلف در scipy. fft موجود است
اگر می خواهید خلاصه ای از این آموزش را پس از پایان خواندن نگه دارید ، پس ورق تقلب را در زیر بارگیری کنید. این توضیحات مربوط به تمام توابع موجود در ماژول Scipy. fft و همچنین تجزیه و تحلیل انواع مختلف تبدیل موجود است:
SCIPY. FFT SHEET CHEAT: برای دسترسی به یک برگه تقلب Scipy. fft که خلاصه تکنیک های توضیح داده شده در این آموزش است ، اینجا را کلیک کنید.
ماژول Scipy. fft
تبدیل فوریه ابزاری مهم در بسیاری از برنامه ها ، به ویژه در محاسبات علمی و علوم داده است. به همین ترتیب ، SCIPY مدتهاست که اجرای آن و تحولات مرتبط با آن را فراهم کرده است. در ابتدا ، SCIPY ماژول Scipy. fftpack را ارائه داد ، اما آنها از آن زمان اجرای خود را به روز کرده و آن را به ماژول Scipy. fft منتقل کرده اند.
Scipy پر از عملکرد است. برای معرفی کلی تر در کتابخانه ، Python علمی را ببینید: استفاده از SCIPY برای بهینه سازی.
Scipy و Matplotlib را نصب کنید
قبل از شروع کار ، باید Scipy و Matplotlib را نصب کنید. شما می توانید این کار را یکی از دو روش انجام دهید:
نصب با anaconda: نسخه آناکوندا را بارگیری و نصب کنید. این همراه با Scipy و Matplotlib است ، بنابراین پس از پیگیری مراحل موجود در نصب ، شما تمام شد!
نصب با PIP: اگر قبلاً PIP را نصب کرده اید ، می توانید کتابخانه ها را با دستور زیر نصب کنید:
می توانید نصب را با تایپ پایتون در ترمینال خود و اجرای کد زیر تأیید کنید:
این کد Scipy و Matplotlib را وارد می کند و مکان ماژول ها را چاپ می کند. رایانه شما احتمالاً مسیرهای مختلفی را نشان می دهد ، اما تا زمانی که یک مسیر را چاپ کند ، نصب کار می کرد.
Scipy اکنون نصب شده است! اکنون وقت آن رسیده است که به تفاوت های بین Scipy. fft و Scipy. fftpack نگاهی بیندازیم.
scipy. fft vs scipy. fftpack
وقتی به مستندات SCIPY نگاه می کنید ، ممکن است با دو ماژول روبرو شوید که بسیار شبیه به هم هستند:
- scipy. fft
- scipy. fftpack
ماژول Scipy. fft جدیدتر است و باید از Scipy. fftpack ترجیح داده شود. می توانید اطلاعات بیشتری در مورد تغییر در یادداشت های انتشار برای SCIPY 1. 4. 0 بخوانید ، اما خلاصه سریع وجود دارد:
- Scipy. fft دارای API بهبود یافته است.
- Scipy. fft استفاده از چندین کارگر را امکان پذیر می کند ، که می تواند در برخی شرایط باعث افزایش سرعت شود.
- Scipy. fftpack میراث محسوب می شود و Scipy به جای آن از Scipy. fft استفاده می کند.
مگر اینکه دلیل خوبی برای استفاده از scipy. fftpack داشته باشید ، باید با scipy. fft بچسبید.
scipy. fft vs numpy. fft
اجرای سریع فوریه (FFT) Scipy شامل ویژگی های بیشتری است و بیشتر از اجرای Numpy رفع اشکال می شود. در صورت انتخاب ، باید از اجرای SCIPY استفاده کنید.
Numpy یک اجرای FFT را برای سازگاری به عقب حفظ می کند ، حتی اگر نویسندگان بر این باورند که عملکردی مانند تبدیل های فوریه به بهترین وجه در SCIPY قرار دارد. برای اطلاعات بیشتر به سؤالات متداول SCIPY مراجعه کنید.
تبدیل فوریه
تجزیه و تحلیل فوریه زمینه ای است که چگونه می توان یک عملکرد ریاضی را در یک سری از عملکردهای مثلثات ساده تر تجزیه کرد. تبدیل فوریه ابزاری از این زمینه برای تجزیه یک تابع در فرکانس های مؤلفه آن است.
خوب ، این تعریف بسیار متراکم است. برای اهداف این آموزش ، تبدیل فوریه ابزاری است که به شما امکان می دهد سیگنال بگیرید و قدرت هر فرکانس را در آن مشاهده کنید. به اصطلاحات مهم در آن جمله نگاهی بیندازید:
- سیگنال اطلاعاتی است که با گذشت زمان تغییر می کند. به عنوان مثال ، آثار صوتی ، فیلم و ولتاژ همه نمونه هایی از سیگنال ها هستند.
- فرکانس سرعتی است که چیزی در آن تکرار می شود. به عنوان مثال ، ساعت ها با فرکانس یک هرتز (هرتز) یا یک تکرار در ثانیه تیک می زنند.
- قدرت ، در این حالت ، فقط به معنای قدرت هر فرکانس است.
تصویر زیر یک نمایش بصری از فرکانس و قدرت در برخی از امواج سینوسی است:

قله های موج سینوسی با فرکانس بالا نسبت به موج موج سینوسی با فرکانس پایین به هم نزدیک است زیرا بیشتر آنها تکرار می شوند. موج سینوسی کم مصرف قله های کمتری نسبت به دو موج دیگر سینوسی دارد.
برای ساختن این بتن تر ، تصور کنید که از تبدیل فوریه در ضبط کسی که همزمان سه نت را روی پیانو پخش می کند ، استفاده کرده اید. طیف فرکانس حاصل سه قله را نشان می دهد ، یکی برای هر یک از یادداشت ها. اگر شخص یک نت را به آرامی از سایرین بازی کند ، قدرت فرکانس آن نت پایین تر از دو مورد دیگر خواهد بود.
در اینجا آنچه که این مثال پیانو از نظر بصری به نظر می رسد وجود دارد:

بالاترین نت در پیانو نسبت به دو نت ساکت تر پخش شد ، بنابراین طیف فرکانس حاصل برای آن نت اوج کمتری دارد.
چرا به تبدیل فوریه نیاز دارید؟
تبدیل فوریه در بسیاری از برنامه ها مفید است. به عنوان مثال ، Shazam و سایر خدمات شناسایی موسیقی از Transform Fourier برای شناسایی آهنگ ها استفاده می کنند. فشرده سازی JPEG از نوعی از تبدیل فوریه برای از بین بردن اجزای فرکانس بالا تصاویر استفاده می کند. تشخیص گفتار از تبدیل فوریه و تبدیل های مرتبط برای بازیابی کلمات گفتاری از صدای خام استفاده می کند.
به طور کلی ، در صورت نیاز به فرکانس های موجود در یک سیگنال ، به تبدیل فوریه نیاز دارید. اگر کار با یک سیگنال در دامنه زمان دشوار است ، پس استفاده از تبدیل فوریه برای انتقال آن به دامنه فرکانس ، ارزش تلاش دارد. در بخش بعدی ، تفاوت های بین حوزه های زمان و فرکانس را بررسی خواهید کرد.
دامنه زمانی در مقابل دامنه فرکانس
در طول بقیه آموزش ، اصطلاحات دامنه زمان و دامنه فرکانس را مشاهده خواهید کرد. این دو اصطلاح به دو روش مختلف برای دیدن یک سیگنال اشاره می کنند ، یا به عنوان فرکانس های مؤلفه آن یا به عنوان اطلاعاتی که با گذشت زمان متفاوت است.
در دامنه زمان ، سیگنال موجی است که در طول زمان (محور y) در دامنه (محور x) متفاوت است. شما به احتمال زیاد عادت کرده اید که نمودارها را در دامنه زمان ببینید ، مانند این:

این تصویری از برخی از صدا است که یک سیگنال دامنه زمان است. محور افقی زمان را نشان می دهد ، و محور عمودی دامنه را نشان می دهد.
در دامنه فرکانس ، یک سیگنال به عنوان یک سری فرکانس ها (محور x) نشان داده می شود که هر یک دارای یک قدرت مرتبط (محور Y) هستند. تصویر زیر سیگنال صوتی فوق پس از تبدیل شدن فوریه است:

در اینجا ، سیگنال صوتی از قبل توسط فرکانس های تشکیل دهنده آن نشان داده شده است. هر فرکانس در امتداد پایین دارای یک قدرت مرتبط است و طیفی را که می بینید تولید می کند.
برای کسب اطلاعات بیشتر در مورد دامنه فرکانس ، ورودی واژه نامه Deepai را بررسی کنید.
انواع فوریه تبدیل می شود
تبدیل فوریه را می توان به انواع مختلف تبدیل تقسیم کرد. اساسی ترین زیربخش مبتنی بر نوع داده هایی است که تبدیل به آن عمل می کند: توابع مداوم یا توابع گسسته. این آموزش فقط با تبدیل گسسته فوریه (DFT) سروکار خواهد داشت.
شما اغلب اصطلاحات dft و fft استفاده شده به صورت متناوب ، حتی در این آموزش را مشاهده خواهید کرد. با این حال ، آنها کاملاً یکسان نیستند. تبدیل سریع فوریه (FFT) یک الگوریتم برای محاسبه تبدیل گسسته فوریه (DFT) است ، در حالی که DFT خود تبدیل است.
تمایز دیگری که در کتابخانه Scipy. fft ساخته شده اید بین انواع مختلف ورودی است. FFT () ورودی پیچیده را می پذیرد ، و RFFT () ورودی با ارزش واقعی را می پذیرد. برای توضیح در مورد اعداد پیچیده و واقعی ، با استفاده از Transform Fast Fourier (FFT) به بخش بروید.
دو تبدیل دیگر از نزدیک با DFT ارتباط دارند: تبدیل گسسته Cosine (DCT) و تبدیل سینوسی گسسته (DST). شما در مورد کسانی که در بخش هستند ، می توانید از کنجکین گسسته و تبدیل سینوسی یاد بگیرید.
مثال عملی: سر و صدای ناخواسته را از صوتی حذف کنید
برای کمک به ایجاد درک خود از تبدیل فوریه و آنچه می توانید با آن انجام دهید ، می خواهید برخی از صدا را فیلتر کنید. ابتدا ، یک سیگنال صوتی با وزوزهای بلند در آن ایجاد خواهید کرد ، و سپس با استفاده از تبدیل فوریه ، وزوز را حذف خواهید کرد.
ایجاد سیگنال
امواج سینوسی گاهی اوقات با صدای خالص نامیده می شوند زیرا آنها یک فرکانس واحد را نشان می دهند. برای تولید صدا از امواج سینوسی استفاده خواهید کرد زیرا در طیف فرکانس حاصل قله های مشخصی ایجاد می کنند.
نکته جالب دیگر در مورد امواج سینوسی این است که آنها برای تولید Numpy ساده هستند. اگر قبلاً از NUMPY استفاده نکرده اید ، می توانید بررسی کنید که Numpy چیست؟
در اینجا چند کد وجود دارد که موج سینوسی ایجاد می کند:
بعد از وارد کردن Numpy و Matplotlib ، دو ثابت را تعریف می کنید:
- Sample_Rate تعیین می کند که تعداد داده ها از سیگنال برای نشان دادن موج سینوسی در ثانیه چه تعداد داده استفاده می کنند. بنابراین اگر سیگنال نرخ نمونه 10 هرتز را داشته باشد و یک موج سینوسی پنج ثانیه ای باشد ، می تواند 10 * 5 = 50 نقطه داده داشته باشد.
- مدت زمان نمونه تولید شده است.
در مرحله بعد ، شما یک تابع را برای تولید موج سینوسی تعریف می کنید زیرا بعداً از آن استفاده خواهید کرد. این تابع یک فرکانس ، FREQ را می گیرد و سپس مقادیر X و Y را که برای ترسیم موج استفاده خواهید کرد ، برمی گرداند.
مختصات x موج سینوسی به طور مساوی بین 0 و DURATION قرار دارند، بنابراین کد از ()linspace NumPy برای تولید آنها استفاده می کند. برای تولید یک مقدار شروع، یک مقدار پایان و تعداد نمونه لازم است. تنظیم endpoint=False برای اینکه تبدیل فوریه به درستی کار کند مهم است زیرا سیگنال را دوره ای فرض می کند.
np. sin() مقادیر تابع سینوس را در هر یک از مختصات x محاسبه می کند. نتیجه در فرکانس ضرب می شود تا موج سینوسی در آن فرکانس نوسان کند و حاصل ضرب در 2π برای تبدیل مقادیر ورودی به رادیان می شود.
توجه: اگر قبلاً مثلثات زیادی انجام نداده اید، یا اگر نیاز به تجدید نظر دارید، دوره مثلثات آکادمی خان را بررسی کنید.
پس از تعریف تابع، از آن برای تولید یک موج سینوسی دو هرتز که پنج ثانیه طول می کشد استفاده می کنید و با استفاده از Matplotlib آن را رسم می کنید. نمودار موج سینوسی شما باید چیزی شبیه به این باشد:

محور x زمان را بر حسب ثانیه نشان می دهد و از آنجایی که برای هر ثانیه زمان دو قله وجود دارد، می توانید ببینید که موج سینوسی دو بار در ثانیه نوسان می کند. فرکانس این موج سینوسی خیلی کم است که قابل شنیدن نیست، بنابراین در بخش بعدی، چند موج سینوسی با فرکانس بالاتر تولید خواهید کرد و نحوه ترکیب آنها را خواهید دید.
مخلوط کردن سیگنال های صوتی
خبر خوب این است که میکس سیگنال های صوتی تنها شامل دو مرحله است:
- اضافه کردن سیگنال ها با هم
- عادی سازی نتیجه
قبل از اینکه بتوانید سیگنال ها را با هم ترکیب کنید، باید آنها را تولید کنید:
در این مثال کد چیز جدیدی وجود ندارد. به ترتیب به متغیرهای nice_tone و noise_tone یک لحن با صدای متوسط و یک لحن بالا اختصاص داده شده است. شما از صدای بلند به عنوان نویز ناخواسته خود استفاده خواهید کرد، بنابراین برای کاهش قدرت آن در 0. 3 ضرب می شود. سپس کد این زنگ ها را با هم اضافه می کند. توجه داشته باشید که از زیرخط (_) برای کنار گذاشتن مقادیر x برگردانده شده توسط ()gene_sine_wave استفاده می کنید.
مرحله بعدی عادی سازی یا مقیاس بندی سیگنال برای قرار گرفتن در قالب هدف است. با توجه به نحوه ذخیره صدا در آینده، فرمت هدف شما یک عدد صحیح 16 بیتی است که محدوده ای ا ز-32768 تا 32767 دارد:
در اینجا، کد mixed_tone را مقیاس بندی می کند تا به خوبی در یک عدد صحیح 16 بیتی قرار گیرد و سپس با استفاده از NumPy's np. int16 آن را به آن نوع داده ارسال می کند. تقسیم mixed_tone بر حداکثر مقدار آن، آن را بی ن-1 و 1 مقیاس می کند. وقتی این سیگنال در 32767 ضرب می شود، بین 32767- و 32767 مقیاس می شود که تقریباً محدوده np. int16 است. کد فقط 1000 نمونه اول را ترسیم می کند تا بتوانید ساختار سیگنال را واضح تر ببینید.
طرح شما باید چیزی شبیه به این باشد:

این سیگنال مانند یک موج سینوسی تحریف شده به نظر می رسد. موج سینوسی که می بینید لحن 400 هرتز است که شما ایجاد کرده اید و اعوجاج لحن 4000 هرتز است. اگر از نزدیک نگاه کنید ، می بینید که اعوجاج شکل موج سینوسی را دارد.
برای گوش دادن به صدا ، باید آن را در فرمی ذخیره کنید که یک پخش کننده صوتی می تواند آن را بخواند. ساده ترین راه برای انجام این کار استفاده از روش wavfile. write Scipy برای ذخیره آن در یک فایل WAV است. عدد صحیح 16 بیتی یک نوع داده استاندارد برای پرونده های WAV است ، بنابراین سیگنال خود را به عدد صحیح 16 بیتی عادی می کنید:
این کد در دایرکتوری که اسکریپت Python خود را اجرا می کنید ، به یک پرونده mysinewave. wav می نویسد. سپس می توانید با استفاده از هر پخش کننده صوتی یا حتی با پایتون به این پرونده گوش دهید. صدای کمتری و صدای بلند را خواهید شنید. این امواج 400 هرتز و 4000 هرتز سینوسی است که شما مخلوط کرده اید.
پس از اتمام این مرحله ، نمونه صوتی خود را آماده کرده اید. مرحله بعدی از بین بردن صدای بلند با استفاده از تبدیل فوریه است!
با استفاده از تبدیل سریع فوریه (FFT)
وقت آن است که از FFT در صدای تولید شده خود استفاده کنید. FFT یک الگوریتم است که تبدیل فوریه را پیاده سازی می کند و می تواند طیف فرکانس را برای یک سیگنال در دامنه زمان ، مانند صوتی شما محاسبه کند:
این کد تبدیل فوریه صوتی تولید شده شما را محاسبه کرده و آن را ترسیم می کند. قبل از شکستن آن ، به نقشه ای که تولید می کند نگاهی بیندازید:

در فرکانس های منفی می توانید دو قله را در فرکانس های مثبت و آینه های آن قله ها مشاهده کنید. قله های فرکانس مثبت در 400 هرتز و 4000 هرتز است که مربوط به فرکانس هایی است که شما در صدا قرار داده اید.
تبدیل فوریه سیگنال پیچیده و پیچیده شما را گرفته و آن را فقط به فرکانس های موجود در آن تبدیل کرده است. از آنجا که شما فقط دو فرکانس قرار داده اید ، فقط دو فرکانس بیرون آمده است. تقارن منفی مثبت یک عارضه جانبی برای قرار دادن ورودی واقعی به تبدیل فوریه است ، اما بعداً درباره آن بیشتر خواهید شنید.
در دو خط اول ، توابع را از scipy. fft وارد می کنید که بعداً از آن استفاده خواهید کرد و یک متغیر را تعریف می کنید ، که تعداد کل نمونه ها را در سیگنال ذخیره می کند.
پس از این مهمترین بخش ، محاسبه تبدیل فوریه:
کد دو عملکرد بسیار مهم را فراخوانی می کند:
FFT () خود را محاسبه می کند.
fftfreq () فرکانس های موجود در مرکز هر سطل را در خروجی FFT () محاسبه می کند. بدون این ، هیچ راهی برای ترسیم محور x در طیف فرکانس شما وجود نخواهد داشت.
سطل آشغال طیف وسیعی از مقادیر است که مانند یک هیستوگرام گروه بندی شده است. برای اطلاعات بیشتر در مورد سطل ها ، به این سؤال مبادله پشته پردازش سیگنال مراجعه کنید. برای اهداف این آموزش ، می توانید آنها را فقط به عنوان مقادیر مجرد فکر کنید.
هنگامی که مقادیر حاصل از تبدیل فوریه و فرکانس های مربوط به آنها را دارید ، می توانید آنها را ترسیم کنید:
بخش جالب این کد پردازش شما قبل از ترسیم آن به YF است. شما با NP. ABS () در YF تماس می گیرید زیرا مقادیر آن پیچیده است.
یک عدد پیچیده عددی است که دارای دو بخش ، یک قسمت واقعی و یک قسمت خیالی است. دلایل زیادی وجود دارد که تعریف اعداد مانند این مفید است ، اما تمام آنچه شما باید در حال حاضر بدانید این است که آنها وجود دارند.
ریاضیدانان به طور کلی اعداد پیچیده را در فرم A + BI می نویسند ، جایی که A قسمت واقعی و B قسمت تخیلی است. I After B به این معنی است که B یک شماره خیالی است.
توجه: بعضی اوقات شماره های پیچیده ای را که با استفاده از i نوشته شده است مشاهده خواهید کرد ، و گاهی اوقات آنها را با استفاده از J ، مانند 2 + 3 I و 2 + 3 J نوشته خواهید کرد. این دو یکسان هستند ، اما من بیشتر توسط ریاضیدانان و J بیشتر توسط مهندسان استفاده می شود.
برای اطلاعات بیشتر در مورد شماره های پیچیده ، به دوره آکادمی خان نگاهی بیندازید یا ریاضیات صفحه سرگرم کننده است.
از آنجا که اعداد پیچیده دارای دو بخش هستند ، نمودار کردن آنها در برابر فرکانس در یک محور دو بعدی شما را ملزم به محاسبه یک مقدار واحد از آنها می کند. این جایی است که np. abs () وارد می شود. این تعداد (a² + b²) را برای اعداد پیچیده محاسبه می کند ، که این یک بزرگی کلی برای دو عدد در کنار هم و مهمتر از آن یک مقدار واحد است.
توجه: به عنوان گذشته ، ممکن است متوجه شده باشید که FFT () حداکثر فرکانس بیش از 20 هزار هرتز ، 22050 هرتز را برمی گرداند. این مقدار دقیقاً نیمی از نرخ نمونه برداری ما است و فرکانس Nyquist نامیده می شود.
این یک مفهوم اساسی در پردازش سیگنال است و به این معنی است که میزان نمونه برداری شما باید حداقل دو برابر فرکانس در سیگنال شما باشد.
سریعتر آن را با RFFT ()
طیف فرکانس که FFT () خروجی در مورد محور y منعکس شده بود به طوری که نیمی از منفی آینه نیمه مثبت بود. این تقارن با وارد کردن اعداد واقعی (اعداد پیچیده) به تبدیل ایجاد شده است.
شما می توانید از این تقارن استفاده کنید تا با محاسبه تنها نیمی از آن ، فوریه خود را سریعتر تبدیل کنید. Scipy. fft این هک سرعت را به شکل RFFT () پیاده سازی می کند.
نکته جالب در مورد RFFT () این است که این یک جایگزین قطره ای برای FFT () است. کد FFT را از قبل به یاد داشته باشید:
مبادله در RFFT () ، کد بیشتر یکسان است ، فقط با چند تغییر کلیدی:
از آنجایی که rfft() تنها نیمی از خروجی را برمی گرداند که ()fft، از یک تابع متفاوت برای دریافت نگاشت فرکانس استفاده می کند، rfftfreq() به جای fftfreq() .
rfft() همچنان خروجی پیچیده تولید می کند، بنابراین کد رسم نتیجه آن یکسان باقی می ماند. با این حال، طرح باید به شکل زیر باشد زیرا فرکانس های منفی ناپدید می شوند:

می بینید که تصویر بالا فقط جنبه مثبت طیف فرکانسی است که fft() تولید می کند. rfft() هرگز نیمه منفی طیف فرکانس را محاسبه نمی کند، که باعث می شود سریعتر از استفاده از fft() .
استفاده از rfft() می تواند تا دو برابر سریعتر از fft() باشد، اما برخی طول های ورودی سریعتر از بقیه هستند. اگر می دانید که فقط با اعداد واقعی کار خواهید کرد، پس این یک هک سرعت است که ارزش دانستن دارد.
اکنون که طیف فرکانس سیگنال را دارید، می توانید به فیلتر کردن آن بروید.
فیلتر کردن سیگنال
یک چیز عالی در مورد تبدیل فوریه این است که برگشت پذیر است، بنابراین هر تغییری که در سیگنال در حوزه فرکانس ایجاد می کنید، زمانی اعمال می شود که آن را به حوزه زمان برگردانید. شما از این مزیت برای فیلتر کردن صدای خود و خلاص شدن از شر فرکانس بالا استفاده خواهید کرد.
هشدار: تکنیک فیلترینگ نشان داده شده در این بخش برای سیگنال های دنیای واقعی مناسب نیست. برای توضیح علت، به بخش اجتناب از تله های فیلترینگ مراجعه کنید.
مقادیر بازگردانده شده توسط rfft() نشان دهنده قدرت هر bin فرکانس است. اگر قدرت یک bin داده شده را صفر کنید، فرکانس های موجود در آن bin دیگر در سیگنال دامنه زمانی حاصله وجود نخواهد داشت.
با استفاده از طول xf، ماکزیمم فرکانس، و این واقعیت که سطل های فرکانس به طور مساوی فاصله دارند، می توانید شاخص فرکانس مورد نظر را محاسبه کنید:
سپس می توانید yf را روی 0 در شاخص هایی در اطراف فرکانس هدف قرار دهید تا از شر آن خلاص شوید:
کد شما باید نمودار زیر را تولید کند:

از آنجایی که فقط یک قله وجود دارد، به نظر می رسد که کار کرده است! در مرحله بعد، تبدیل فوریه معکوس را برای بازگشت به حوزه زمان اعمال خواهید کرد.
استفاده از FFT معکوس
اعمال FFT معکوس مشابه اعمال FFT است:
از آنجایی که از rfft() استفاده می کنید، باید از irfft() برای اعمال معکوس استفاده کنید. با این حال، اگر از fft() استفاده کرده بودید، تابع معکوس ()ifft بود. طرح شما اکنون باید به شکل زیر باشد:

همانطور که می بینید، اکنون یک موج سینوسی تکی دارید که با فرکانس 400 هرتز در نوسان است و نویز 4000 هرتز را با موفقیت حذف کرده اید.
یک بار دیگر، باید سیگنال را قبل از نوشتن در یک فایل عادی کنید. شما می توانید این کار را به همان روش دفعه قبل انجام دهید:
وقتی به این پرونده گوش می دهید ، می شنوید که سر و صدای آزار دهنده از بین رفته است!
جلوگیری از فیلتر کردن مشکلات
مثال فوق بیشتر از استفاده در دنیای واقعی برای اهداف آموزشی است. تکرار روند بر روی یک سیگنال در دنیای واقعی ، مانند یک قطعه موسیقی ، می تواند وزوز بیشتری را نسبت به حذف آن معرفی کند.
در دنیای واقعی ، شما باید سیگنال ها را با استفاده از توابع طراحی فیلتر در بسته Scipy. Signal فیلتر کنید. فیلتر کردن موضوعی پیچیده است که شامل ریاضیات زیادی است. برای معرفی خوب ، به راهنمای دانشمند و مهندس پردازش سیگنال دیجیتال نگاهی بیندازید.
سسین گسسته و سینوسی تبدیل می شود
یک آموزش در مورد ماژول Scipy. fft بدون نگاه به تبدیل گسسته Cosine (DCT) و تبدیل سینوسی گسسته (DST) کامل نخواهد بود. این دو تبدیل از نزدیک با تبدیل فوریه ارتباط نزدیکی دارند اما کاملاً بر روی اعداد واقعی عمل می کنند. این بدان معناست که آنها یک عملکرد واقعی را به عنوان یک ورودی به دست می آورند و یک عملکرد واقعی دیگر را به عنوان یک خروجی تولید می کنند.
SCIPY این تبدیل ها را به عنوان DCT () و DST () پیاده سازی می کند. انواع i * و * n به ترتیب نسخه های معکوس و n-dimental از توابع هستند.
DCT و DST کمی شبیه به دو نیمه هستند که با هم تبدیل فوریه را تشکیل می دهند. این کاملاً صادق نیست زیرا ریاضیات بسیار پیچیده تر است ، اما این یک مدل ذهنی مفید است.
بنابراین اگر DCT و DST مانند نیمه های تبدیل فوریه هستند ، پس چرا آنها مفید هستند؟
از یک چیز ، آنها سریعتر از یک تبدیل کامل فوریه هستند زیرا آنها به طور مؤثر نیمی از کار را انجام می دهند. آنها حتی می توانند سریعتر از RFFT () باشند. مهمتر از این ، آنها کاملاً در تعداد واقعی کار می کنند ، بنابراین شما هرگز نباید نگران اعداد پیچیده باشید.
قبل از اینکه بتوانید یاد بگیرید که چگونه بین آنها انتخاب کنید ، باید عملکردهای یکنواخت و عجیب را درک کنید. حتی توابع در مورد محور y متقارن هستند ، در حالی که عملکردهای عجیب و غریب در مورد منشأ متقارن هستند. برای تصور این بصری ، به نمودارهای زیر نگاهی بیندازید:

می بینید که عملکرد یکنواخت در مورد محور y متقارن است. عملکرد عجیب و غریب در مورد y = - x متقارن است ، که به عنوان متقارن در مورد منشأ توصیف می شود.
هنگامی که یک تبدیل فوریه را محاسبه می کنید ، وانمود می کنید که عملکردی که در آن محاسبه می کنید بی نهایت است. تبدیل کامل فوریه (DFT) فرض می کند که عملکرد ورودی خود را بی نهایت تکرار می کند. با این حال ، DCT و DST فرض می کنند که عملکرد از طریق تقارن گسترش می یابد. DCT فرض می کند که عملکرد با تقارن حتی گسترش یافته است ، و DST فرض می کند که با تقارن عجیب و غریب گسترش یافته است.
تصویر زیر نشان می دهد که چگونه هر یک از تبدیل ها عملکرد را به بی نهایت تصور می کند:

در تصویر بالا ، DFT عملکرد را همانطور که هست تکرار می کند. DCT عملکرد را به صورت عمودی برای گسترش آن آینه می کند و DST آن را به صورت افقی آینه می کند.
توجه داشته باشید که تقارن دلالت بر DST منجر به پرش های بزرگ در عملکرد می شود. اینها ناپیوستگی نامیده می شوند و در طیف فرکانس حاصل ، اجزای فرکانس بالاتری تولید می کنند. بنابراین ، مگر اینکه بدانید داده های شما تقارن عجیب و غریب دارد ، باید به جای DST از DCT استفاده کنید.
DCT بسیار مورد استفاده قرار می گیرد. نمونه های بسیار دیگری وجود دارد ، اما استانداردهای JPEG ، MP3 و WebM همه از DCT استفاده می کنند.
نتیجه
تبدیل فوریه یک مفهوم قدرتمند است که در زمینه های مختلف ، از ریاضی خالص گرفته تا مهندسی صوتی و حتی امور مالی استفاده می شود. اکنون با تبدیل گسسته فوریه آشنا هستید و به خوبی مجهز شده اید تا با استفاده از ماژول Scipy. fft ، آن را برای مشکلات فیلتر استفاده کنید.
در این آموزش ، شما یاد گرفتید:
- چگونه و چه موقع از تبدیل فوریه استفاده می کنیم
- نحوه انتخاب عملکرد صحیح از scipy. fft برای مورد استفاده خود
- تفاوت بین دامنه زمان و دامنه فرکانس چیست
- نحوه مشاهده و اصلاح طیف فرکانس یک سیگنال
- چگونه استفاده از RFFT () می تواند کد شما را سرعت بخشد
در بخش آخر ، شما همچنین در مورد تبدیل گسسته از تبدیل و تبدیل سینوسی گسسته آموخته اید. شما دیدید که برای استفاده از آنها چه کارکردهایی را انجام می دهید ، و یاد گرفتید که چه زمانی از دیگری استفاده کنید.
اگر خلاصه ای از این آموزش را دوست دارید ، می توانید برگه تقلب را در زیر بارگیری کنید. این توضیحات مربوط به تمام توابع موجود در ماژول Scipy. fft و همچنین تجزیه و تحلیل انواع مختلف تبدیل موجود است:
SCIPY. FFT SHEET CHEAT: برای دسترسی به یک برگه تقلب Scipy. fft که خلاصه تکنیک های توضیح داده شده در این آموزش است ، اینجا را کلیک کنید.
به کاوش در این موضوع جذاب و آزمایش با تحول بپردازید ، و حتماً اکتشافات خود را در نظرات زیر به اشتراک بگذارید!
هر دو روز یک ترفند کوتاه و شیرین پایتون را به صندوق ورودی خود تحویل دهید. هیچ اسپم هرگزاشتراک هر زمان را لغو کنید. تحت نظارت تیم واقعی پایتون.

درباره کامرون مک لود
کامرون یک مدیر محصول مستقر در لندن است که هم در اوقات فراغت خود پایتون و انگلیسی را می نویسد.
هر آموزش در Real Python توسط تیمی از توسعه دهندگان ایجاد می شود تا مطابق با استانداردهای با کیفیت بالا ما باشد. اعضای تیم که در این آموزش کار کرده اند عبارتند از:
بهترین استراتژی معاملات...
ما را در سایت بهترین استراتژی معاملات دنبال می کنید
برچسب :
نویسنده : صدرا ذوالریاستین
بازدید : 61
تاريخ : سه
شنبه
22 فروردين
1402 ساعت: 12:39