تبدیل فوریه در میکروکنترلر. تجزیه و تحلیل طیفی سیگنال ها تبدیل فوریه سریع
پردازندههای تخصصی زیادی برای پردازش سیگنال دیجیتال (DSP) وجود دارد، مانند DSP از سری TMS320 تگزاس اینسترومنت، که هم هستههای عدد صحیح ساده و هم هیولاهایی مانند زیرخانواده خانواده C6000 را شامل میشود که دادههای ممیز شناور را پردازش میکند. یک سری کامل ADSP از دستگاه های آنالوگ وجود دارد (که شامل BlackFin کم و بیش جهانی می شود)، همچنین راه حل های ساده تری از MicroChip - dsPIC وجود دارد.
با این حال، DSP تخصصی خوب است، اما آیا همیشه اینقدر ضروری است؟ بله، با یک جریان عظیم اطلاعات به سادگی غیرقابل جایگزین است، اما وظایف پردازش ساده تری نیز وجود دارد. به طور خاص، من به کار تبدیل مضاعف علاقه مند بودم - سیگنال صوتی پیچیده می شود، در نتیجه یک طیف به دست می آید، سپس هر عملیاتی را می توان روی طیف انجام داد و تبدیل معکوس را می توان انجام داد، در نتیجه سیگنال پردازش شده را به دست آورد. همه اینها باید در زمان واقعی انجام شود و کیفیتی کمتر از کیفیت تلفن دریافت کنید.
امسال سال 2000 نیست، راهحلهای تکتراشهای مبتنی بر هستههای ARM7/Cortex-M3 با کارایی بالا وجود دارد که قیمت آنها به میزان قابل توجهی کاهش یافته است ، تقریباً یک عملیات ضرب-انباشت DSP و نتیجه 64 بیتی است) و Cortex-M3 نیز شامل تقسیم سخت افزاری است.
می خواهم فوراً به شما هشدار دهم که پردازش سیگنال تخصص من نیست ، تقریباً تمام دانش (یا بهتر است بگوییم درک اصول) از مؤسسه حفظ شده است ، اما اکنون فقط می خواستم آن را آزمایش و اجرا کنم. منظور من این است که ممکن است در توصیف، جایگزینی مفاهیم و غیره نادرستی وجود داشته باشد. در واقع، دقت تحصیلی من را خیلی نگران نکرد.
تقریباً برای هر DSP، کار ذکر شده در بالا ساده و سرراست است. اما یک هسته RISC با هدف کلی چگونه رفتار خواهد کرد؟ اگر AVR یا PIC را در نظر بگیریم، بعید است که کافی باشند. 8 بیت و فرکانس ساعت پایین تاثیر دارد. اگرچه علم چان طرح هایی دارد که در آنها یک FFT روی AVR انجام می دهد و طیف سیگنال را ترسیم می کند. با این حال، در این حالت، در زمان واقعی، به سادگی تصویرسازی (با حداقل دقت پردازش) انجام می شود و نه پردازش سیگنال کامل با کیفیت صوتی قابل قبول.
LPC2146 به عنوان یک تراشه آزمایشی، بر اساس هسته ARM7TDMI-S و دارای حداکثر فرکانس ساعت 60 مگاهرتز (در عمل، در 72 یا حتی 84 مگاهرتز کار نمی کند) انتخاب شد. چرا؟ اولاً من یک برد اشکال زدایی برای آن دارم و ثانیاً یک ADC و DAC روی برد وجود دارد ، یعنی. حداقل تریم خارجی مورد نیاز است.
کمی تئوری
اول از همه، ارزیابی عملکرد FFT (تبدیل فوریه سریع) روی میکروکنترلرهای ARM جالب بود. بر اساس این ارزیابی، میتوان نتیجه گرفت که آیا سرعت کافی برای پردازش جریانی از دادههای صوتی و سیگنال با چه فرکانس نمونهبرداری و چند کانال را میتوان روی چنین میکروکنترلری پردازش کرد یا خیر.
بر اساس تبدیل فوریه، می توانید فیلترهای هوشمندانه ای (با ویژگی های بسیار جذاب) بسازید. من در درجه اول به مشکلات تغییر صدای سیگنال (بالا و کاهش طیف) و "انعکاس" طیف علاقه مند بودم. مورد دوم در رادیوهای SDR برای گوش دادن به پخشهای رادیویی با باند پایین LSB مورد نیاز است.
من شما را با تئوری بار نمی کنم و توضیح نمی دهم که تبدیل فوریه چیست، مطالب بسیار زیادی در مورد این موضوع وجود دارد، از آنچه من استفاده کردم: یک ویکی و یک فصل از یک کتاب بسیار خوب و آموزنده.
پیاده سازی نرم افزار
پیاده سازی نرم افزارهای زیادی برای FFT وجود دارد، با این حال، من خودم نوشتم. هدف اصلی من بهینه سازی کد برای یک معماری خاص بود. اولاً من فوراً روی 32 بیت تمرکز کردم ، ثانیاً فقط محاسبات اعداد صحیح مورد نیاز بود و مطلوب بود که از عملیات تقسیم اجتناب شود. پیدا کردن چیزی آماده برای برآورده کردن این الزامات از قبل مشکل ساز است.
تمام ثابت هایی که از قبل قابل محاسبه بودند محاسبه و در جداول (عمدتا مقادیر توابع مثلثاتی) قرار گرفتند. این بهینه سازی اصلی الگوریتم است، در غیر این صورت تقریباً به طور کامل الگوریتم توصیف شده را تکرار می کند.
مهمترین مورد نیاز برای محاسبات اعداد صحیح است. در طول فرآیند پیاده سازی، حتی خطایی وجود داشت که باعث سرریز در یکی از متغیرهای حلقه 32 بیتی شد. علاوه بر این، در تمام دادههای آزمایشی ظاهر نشد، بنابراین تا زمانی که پیدا شد باعث سردرد شد.
من تمام متون منبع را در یک آرشیو جمع آوری کردم. پیاده سازی نهایی نیست، محاسبات تکراری وجود دارد (تقارن طیف و فاز در نظر گرفته نمی شود) و بهینه سازی استفاده از بافرها مورد نیاز است، زیرا در حال حاضر رم بیش از حد برای محاسبات استفاده می شود (تقریبا 12k برای تبدیل 1024 امتیاز). ).
اولین تست ها
درام رول: من در حال آزمایش سرعت تبدیل برای نمونه ای از 1024 امتیاز هستم، فرکانس هسته پردازنده 60 مگاهرتز است. آزمایش در یک شبیه ساز انجام شد، بنابراین ادعا نمی کند که 100٪ دقیق است، اما این نتیجه می تواند به عنوان یک نشانگر استفاده شود (در تجربه قبلی من، اگرچه شبیه ساز دروغ گفت، اما زیاد نبود). تست نسخه اول کد، کامپایلر RealView MDK، گزینه بهینه سازی O3، حالت تولید کد ARM.
بنابراین آنچه می بینیم:
6 میلیثانیه برای هر تبدیل، در مجموع کمی بیش از 12 میلیثانیه برای تبدیل رفت و برگشت. به نظر می رسد که با فرکانس نمونه برداری 44100 هرتز (استاندارد برای صدا) و نمونه هایی با وضوح حداکثر 16 بیت، محاسبات خالص ~ 44 * 12 میلی ثانیه = 528 میلی ثانیه طول می کشد. و این در یک نسخه میانی از سیستم عامل است، زمانی که برخی از بهینه سازی کد هنوز کامل نشده است (طبق برآوردها، الگوریتم را می توان تقریباً 2 برابر شتاب داد)! به نظر من، این فقط یک شاخص عالی است.
در مجموع، انتظار می رود که بار اصلی حدود 50٪ باشد، 50٪ دیگر برای تبدیل در طیف و هزینه های سربار در هنگام کار با ADC، DAC و سایر انتقال داده ها باقی می ماند. اگر فرکانس نمونه برداری را به سطح "تلفن" (حدود 4800-9600 هرتز) کاهش دهید، بار هسته حتی کمتر می شود (حدود 15-30٪).
بنابراین، بخش ریاضی کم و بیش روشن است. می توانید به اجرای ملموس ادامه دهید.
اهن
برای پلتفرم تست، ما از یک برد توسعه Keil MCB2140 با یک بلندگو استفاده کردیم. یک سیم مینی جک برای اتصال به خروجی خطی دستگاه لحیم شده و یک زنجیره ورودی ساده مونتاژ می شود. همانطور که قبلا ذکر شد، برد از قبل دارای یک بلندگو است که به خروجی آنالوگ میکروکنترلر متصل است و کنترل هایی (دکمه و پتانسیومتر) وجود دارد.
![](https://i2.wp.com/igorkov.org/images/mcb2140.jpg)
در اینجا یک طرح از مدار ورودی است:
![](https://i0.wp.com/igorkov.org/images/dsp-amplifer.jpg)
اشکال زدایی نرم افزار در مراحل زیر انجام شد:
- اشکال زدایی تمام لوازم جانبی لازم: ADC، DAC، تایمر، نشانگر LED.
- تست با دیجیتالی شدن سیگنال: داده ها را با سرعت مورد نیاز دیجیتالی می کنم و در بافر قرار می دهم، سپس داده ها را از بافر استخراج می کنم و سیگنال را پخش می کنم. آن ها تغییر سیگنال ساده در زمان، بدون هیچ تغییری. در این مرحله مکانیسم کار با 2 بافر لازم برای کار بیشتر مورد آزمایش قرار می گیرد.
- تبدیل فوریه رو به جلو و معکوس به نسخه قبلی اضافه شده است. این تست در نهایت عملکرد صحیح کد FFT را تأیید می کند و همچنین بررسی می کند که آیا کد با عملکرد موجود مطابقت دارد.
- پس از این، اسکلت اصلی اپلیکیشن انجام شد، می توانید به سراغ کاربردهای عملی بروید.
مشکل پس از اضافه کردن FFT به کد ایجاد شد: نویز و سوت های اضافی در سیگنال ظاهر شد. به طور کلی این رفتار برای من بسیار عجیب به نظر می رسید، زیرا ... بدون تبدیل، سیگنال عبوری از مسیر دیجیتال کاملاً تمیز باقی می ماند. دلیل اول برای این: پس از مدار آنالوگ، دامنه سیگنال در ADC کامل نبود (0-3.3V)، بلکه فقط در 0.5-2V در حداکثر حجم پخش کننده بود، دوم: نویز بسیار قوی به دلیل عدد صحیح محاسبات (+-1 واحد، که معلوم شد برای ایجاد تداخل شنیداری کافی است).
برای مبارزه با اولین مشکل، تصمیم گرفته شد تا تنظیم قسمت آنالوگ را آغاز کنیم. و برای حل مشکل نویز، از فیلتر پایین گذر استفاده کنید.
کاربرد 1: تغییر صدای سیگنال
برد دارای یک پتانسیومتر (مقاومت متغیر) است که می توان از آن برای کنترل استفاده کرد. در این مورد، طیف سیگنال را به سمت بالا و پایین تنظیم می کند، به اندازه ای که ترکیبات مورد علاقه شما را «تبدیل» کند.
در اینجا چیزی است که در حوزه فرکانس اتفاق می افتد:
![](https://i2.wp.com/igorkov.org/images/dsp-arm-3.png)
در این مورد، نتیجه تبدیل در 2 بافر قرار می گیرد. یک بافر قسمت واقعی و دیگری قسمت خیالی است. معنای فیزیکی اعداد به دست آمده در آنها: بخش واقعی حاوی مقادیر هارمونیک ها است، بخش خیالی شامل تغییر فاز برای این هارمونیک ها است. علاوه بر این، همانطور که می بینید، سیگنال اولیه توسط N-value توصیف می شود و پس از تبدیل، مقدار 2N به دست می آید. مقدار اطلاعات تغییر نمی کند و افزایش 2 برابری در مقدار اطلاعات به دلیل این واقعیت است که داده های بافر دارای افزونگی در قالب تکرار مقادیر هستند.
یک نشانگر LCD کاراکتری دو خطی به عنوان دستگاه نمایشگر استفاده می شود. نکته اصلی در اجرای این پروژه سخت افزار نیست، بلکه نرم افزار، به طور دقیق تر پیاده سازی تبدیل فوریه گسسته (DFT) بر روی یک میکروکنترلر 8 بیتی است. فوراً باید توجه داشت که نویسنده در این زمینه متخصص نیست و بنابراین با مبانی شروع کرده است - با تبدیل فوریه گسسته ساده. الگوریتم تبدیل فوریه سریع نه تنها سریع است، بلکه بسیار پیچیده است.
تبدیل فوریه گسسته (در ادبیات انگلیسی DFT، تبدیل فوریه گسسته) یکی از تبدیل های فوریه است که به طور گسترده در الگوریتم های پردازش سیگنال دیجیتال استفاده می شود (اصلاحات آن در فشرده سازی صدا در MP3، فشرده سازی تصویر در JPEG و غیره) و همچنین در حوزه های دیگر مربوط به تجزیه و تحلیل فرکانس ها در یک سیگنال گسسته (به عنوان مثال، آنالوگ دیجیتالی شده). تبدیل فوریه گسسته به یک تابع گسسته به عنوان ورودی نیاز دارد. چنین توابعی اغلب با نمونه برداری (نمونه گیری مقادیر از توابع پیوسته) ایجاد می شوند.
نمودار مدار یک آنالایزر طیف سیگنال صوتی بسیار ساده است و می توان آن را به دو بخش دیجیتال و آنالوگ تقسیم کرد.
قسمت دیجیتال توسط یک میکروکنترلر و یک نشانگر LCD متصل به آن تشکیل می شود. میکروکنترلر از یک تشدید کننده کوارتز 16 مگاهرتز کلاک می شود. ولتاژ تغذیه +5 ولت به عنوان ولتاژ مرجع برای ADC میکروکنترلر استفاده می شود.
گذرگاه داده نشانگر LCD به پورت C میکروکنترلر (خطوط ورودی/خروجی PC0-PC3) و باس کنترل به پورت D (PD5, PD6) میکروکنترلر متصل است. نشانگر در حالت 4 بیتی کار می کند. برای تنظیم کنتراست از یک مقاومت متغیر با مقدار اسمی 4.7 کیلو اهم استفاده شده است. برای کار با نشانگر، نمادهای سفارشی برای نمایش 8 ستون افقی از آنالیزور ایجاد شدند.
میکروکنترلر از یک تشدید کننده کوارتز خارجی 16 مگاهرتز کار می کند.
قسمت آنالوگ دستگاه مهمترین قطعه و پیش تقویت کننده سیگنال میکروفون الکترت است که خروجی آن به کانال ADC0 ADC تعبیه شده در میکروکنترلر متصل می شود. ما باید سطح صفر را در ورودی ADC دقیقاً به نصف ولتاژ مرجع تنظیم کنیم، یعنی. 2.5 V. در این مورد، می توانیم از نیم موج مثبت و منفی سیگنال استفاده کنیم، اما دامنه آن نباید از حد تعیین شده، یعنی. بهره باید به خوبی تنظیم شود تا از اضافه بار جلوگیری شود. تمام شرایط فوق توسط یک تراشه تقویت کننده عملیاتی کم مصرف مشترک برآورده می شود.
الگوریتم DFT در مقایسه با تبدیل فوریه سریع کمی کندتر است. اما آنالایزر طیف ما به سرعت بالایی نیاز ندارد و اگر بتواند نرخ به روز رسانی حدود 30 فریم در ثانیه را ارائه دهد، این برای تجسم طیف سیگنال صوتی بیش از اندازه کافی خواهد بود. در هر صورت، در نسخه ما امکان دستیابی به سرعت 100 فریم در ثانیه وجود دارد، اما این مقدار پارامتر برای یک نشانگر LCD کاراکتری دو خطی بسیار زیاد است و توصیه نمی شود. فرکانس نمونه برداری برای تبدیل فوریه گسسته 32 نقطه ای 20 کیلوهرتز است و از آنجایی که نتیجه تبدیل متقارن است، فقط باید از نیمه اول استفاده کنیم. 16 نتیجه اول بنابراین می توانیم طیف فرکانس را تا 10 کیلوهرتز نمایش دهیم و وضوح آنالایزر 10 کیلوهرتز/16 = 625 هرتز است.
نویسنده طرح تلاش کرد تا سرعت محاسبات DFT را افزایش دهد. اگر این تبدیل N نقطه داشته باشد، باید مقادیر N2/2 سینوس و کسینوس را پیدا کنیم. برای تبدیل 32 نقطه ای ما باید 512 مقدار سینوس و کسینوس را پیدا کنیم. اما، قبل از پیدا کردن آنها، باید زاویه (درجه) را محاسبه کنیم، که مقداری زمان CPU را می گیرد، بنابراین تصمیم گرفته شد از جداول مقادیر برای این محاسبات استفاده کنیم. هنگام محاسبه در برنامه میکروکنترلر، از اعداد ممیز شناور و دقت مضاعف استفاده نمی شود، زیرا پردازش در یک میکروکنترلر 8 بیتی بیشتر طول می کشد. در عوض، مقادیر موجود در جداول جستجو از دادههای عدد صحیح 16 بیتی ضرب در 10000 استفاده میکنند. سپس پس از انجام تبدیل، نتایج بر 10000 تقسیم میشوند. با این رویکرد، امکان انجام 120 تبدیل 32 نقطهای در هر واحد وجود دارد. دوم، که برای دستگاه های ما بیش از اندازه کافی است.
نمایش عملکرد یک آنالایزر طیف بر روی میکروکنترلر ATmega32
دانلودها
کد منبع (برنامه میکروکنترلر، جداول داده های سینوسی، کسینوس و زاویه) -
- واضح است که رفتن فراتر از نور و موسیقی در AVR دشوار است، پارامترها درست نیستند. اما 120 تبدیل 32 امتیازی در ثانیه ممکن است برای اکثر کارها کافی باشد. و البته می توانید نمونه دیگری با فرکانس 625 هرتز بگیرید یا بهتر است نرخ تازه سازی را از دست بدهید. شایان ذکر است که MK از نظر عملکرد احساس بدی خواهد داشت. اما در اینجا می توانید خروجی نتیجه را با استفاده از روش های انتقال داده های سخت افزاری سازماندهی کنید. سپس یک میکروکنترلر کمکی خواهد بود و اصلیترین آن فقط دادهها را از آن دریافت میکند و آن را سازگار با سایر فرآیندها پردازش میکند. به طور کلی، هنوز هم به فرکانس پردازنده بستگی دارد. روزی روزگاری امکان اورکلاک مگا بالای 20 مگاهرتز وجود داشت، اما برای این کارها احتمالاً فقط در فرکانس های بالا دچار اشکال می شویم. ایده خوب است، اگر فقط قسمت های بیشتری از ریاضی نوشته شود ... این پیاده سازی آن در MK است
- من همچنین تحلیلگرهای جالب تری ساخته ام: You Tube یا نسخه ای روی LCD رنگی: You Tube بر اساس کتابخانه معروف Chen است :)
- "ما باید زاویه (درجه ها) را محاسبه کنیم" آیا کسی می تواند با جزئیات بیشتری به ما بگوید که مقادیر این جداول چگونه محاسبه می شوند؟
- با جدول سینوس ها و کسینوس ها همه چیز مشخص است. مشخص نیست مقادیر جدول درجه_جستجو چگونه محاسبه می شوند؟