کاربرد عملی تبدیل فوریه برای پردازش سیگنال پردازش سیگنال دیجیتال در میکروکنترلرهای ARM7 Fourier transform avr

قضیه فوریه بیان می کند که هر سیگنالی را می توان به یک سری در مجموعه ای متعارف از توابع تناوبی (مثلاً سینوس ها و کسینوس ها) با فرکانس هایی که مضرب فرکانس سیگنال تناوبی هستند، گسترش داد. بنابراین، تجزیه و تحلیل طیفی یک سیگنال مبتنی بر جستجوی ضرایب وزنی (در حالت کلی، پیچیده) است که ماژول آن مربوط به کسری از قدرت نوسان هارمونیک مربوطه است که در برهم نهی کلی همه هارمونیک ها وارد شده است.

تبدیل فوریه سریع

تبدیل فوریه سریع یک الگوریتم محاسباتی است که با موفقیت از خواص تناوب توابع مثلثاتی برای جلوگیری از محاسبات غیر ضروری در تبدیل فوریه گسسته (DFT) استفاده می‌کند و در نتیجه یافتن ضرایب در بسط فوریه را سریع‌تر می‌کند. تفاوت اصلی با تبدیل گسسته فقط در روش محاسبه مقادیر عددی (الگوریتم) است و نه در خود پردازش سیگنال. هم در مورد FFT و هم در مورد DFT نتیجه محاسبات یکسان است. تنها مورد نیاز برای الگوریتم FFT یک اندازه نمونه است که مضربی از N = 2L باشد، که در آن L هر عدد صحیح مثبت است. متداول‌ترین الگوریتم‌های FFT پایه 2 عبارت‌اند از: کاهش‌دهنده زمان و کاهش فرکانس.

در این کار، یک الگوریتم FFT radix-2 با نازک شدن زمان (الگوریتم Cooley-Tukey) پیاده سازی شده است. با مطالعه برخی از قوانین DFT به راحتی به دست می آید. بیایید به اصطلاح ضریب چرخش را معرفی کنیم:

در این حالت، در DFT، ضرایب فوریه برای تعدادی از مقادیر سیگنال (f0,f1,…,fN-1) با این رابطه بیان می شود:

یک سری سیگنال از 4 مقدار را در نظر بگیرید: (f0,f1,f2,f3). اجازه دهید تبدیل فوریه را به شکل ماتریس ارائه کنیم (ضریب نرمال سازی 1/N در بردار ستون Cij در سمت راست عبارت گنجانده شده است):

پس از نوشتن ضرایب چرخش با استفاده از فرمول اویلر و تعیین مقادیر آنها برای k = 0، 1، 2،.. 9، می توانید نموداری بسازید (شکل 2) که از آن الگوی تکرار ضرایب قابل مشاهده است.

شکل 2. سری توان w برای N=4

با جایگزینی مقادیر عددی به (4) دریافت می کنیم:

یعنی مقادیر w از w4 با مقدار مربوطه از w0 تا w3 برابر است. در مرحله بعد، معادله ماتریس (4) را به شکل غیر استاندارد بازنویسی می‌کنیم (نشان‌های مشابه برای وضوح عملیات بیشتر معرفی می‌شوند):

بیایید ستون های ماتریس را با هم عوض کنیم و آن را به دو گروه تقسیم کنیم: با شاخص های زوج f0، f2 و فرد f1، f3:

اجازه دهید در نظر بگیریم که wk+1 = wkw1، سپس عبارت (6) به صورت زیر بازنویسی می‌شود:

با استفاده از نسبت ها:

ضرایب انبساط مورد نیاز را در قالب یک بردار ستونی با مقادیر سلول بدست می آوریم:

نمایش گرافیکی الگوریتم (شکل 3) شبیه یک پروانه با بال های باز است، به همین دلیل است که این روش محاسبه "پروانه" نامیده می شود.

شکل 3. نمودار پروانه ای برای یک سری از 4 عبارت

بنابراین، در مرحله اول الگوریتم، اعضای تعدادی از مقادیر سیگنال به دو شاخص زوج و فرد تقسیم می شوند. سپس نمودار "پروانه" اجرا می شود که شامل دو مرحله است که تعداد آنها برابر با توان دو عدد از حجم نمونه است (N = 4 = 22). در هر مرحله، دو "پروانه" اجرا می شود و تعداد کل آنها بدون تغییر باقی می ماند. هر عمل پروانه مربوط به یک عملیات ضرب است. برای مقایسه: در DFT با نمونه برداری (f0,f1,f2,f3) عملیات ضرب باید 4×4 = 16 بار و در مورد FFT فقط 4 بار انجام شود.

این سریال را می توان به صورت زیر نیز نوشت:

(2),
که در آن، k-امین دامنه مختلط.

رابطه بین ضرایب (1) و (3) با فرمول های زیر بیان می شود:

توجه داشته باشید که هر سه نمایش سری فوریه کاملاً معادل هستند. گاهی اوقات، هنگام کار با سری فوریه، استفاده از نماهای استدلال خیالی به جای سینوس ها و کسینوس ها راحت تر است، یعنی تبدیل فوریه را به شکل پیچیده استفاده کنید. اما استفاده از فرمول (1) برای ما راحت است، که در آن سری فوریه به عنوان مجموع کسینوس ها با دامنه ها و فازهای مربوطه ارائه می شود. در هر صورت، این نادرست است که بگوییم تبدیل فوریه یک سیگنال واقعی منجر به دامنه های هارمونیک پیچیده می شود. همانطور که ویکی به درستی می گوید، "تبدیل فوریه (؟) عملیاتی است که یک تابع از یک متغیر واقعی را با یک تابع دیگر، همچنین یک متغیر واقعی، مرتبط می کند."

جمع:
مبنای ریاضی برای تجزیه و تحلیل طیفی سیگنال ها تبدیل فوریه است.

تبدیل فوریه به شما این امکان را می دهد که یک تابع پیوسته f(x) (سیگنال) را که بر روی قطعه (0, T) به عنوان مجموع تعداد نامتناهی (سری نامتناهی) از توابع مثلثاتی (سینوس و/یا کسینوس) با مقدار معینی تعریف شده است، نشان دهید. دامنه ها و فازها نیز در قطعه (0، T) در نظر گرفته شده است. به چنین سریالی سری فوریه می گویند.

اجازه دهید به نکات دیگری توجه کنیم که درک آنها برای استفاده صحیح از تبدیل فوریه در تحلیل سیگنال لازم است. اگر سری فوریه (مجموع سینوسی ها) را در کل محور X در نظر بگیریم، می بینیم که خارج از قطعه (0, T) تابع نشان داده شده توسط سری فوریه به صورت دوره ای تابع ما را تکرار می کند.

به عنوان مثال، در نمودار شکل 7، تابع اصلی بر روی قطعه (-T\2، +T\2) تعریف شده است، و سری فوریه یک تابع تناوبی را نشان می دهد که در کل محور x تعریف شده است.

این اتفاق می افتد زیرا سینوسی ها خود توابع تناوبی هستند و بر این اساس مجموع آنها یک تابع تناوبی خواهد بود.


شکل 7 نمایش یک تابع اصلی غیر تناوبی توسط سری فوریه

بدین ترتیب:

تابع اصلی ما پیوسته و غیر تناوبی است که بر روی یک قطعه مشخص از طول T تعریف شده است.
طیف این تابع گسسته است، یعنی در قالب یک سری نامتناهی از اجزای هارمونیک - سری فوریه - ارائه می شود.
در واقع، سری فوریه تابع تناوبی خاصی را تعریف می کند که با تابع ما در قطعه (0، T) منطبق است، اما برای ما این تناوب معنی دار نیست.

دوره های اجزای هارمونیک مضربی از مقدار قطعه (0, T) است که تابع اصلی f(x) بر روی آن تعریف شده است. به عبارت دیگر، دوره های هارمونیک مضربی از مدت زمان اندازه گیری سیگنال هستند. به عنوان مثال، دوره اولین هارمونیک سری فوریه برابر با بازه T است که تابع f(x) بر روی آن تعریف شده است. پریود هارمونیک دوم سری فوریه برابر با بازه T/2 است. و به همین ترتیب (شکل 8 را ببینید).


شکل 8 دوره های (فرکانس) اجزای هارمونیک سری فوریه (در اینجا T = 2؟)

بر این اساس، فرکانس اجزای هارمونیک مضرب 1/T است. یعنی فرکانس های مولفه های هارمونیک Fk برابر است با Fk = k\T، که در آن k از 0 تا؟، به عنوان مثال k = 0 F0 = 0 است. k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (در فرکانس صفر - جزء ثابت).

اجازه دهید تابع اصلی ما یک سیگنال ثبت شده در طول T=1 ثانیه باشد. سپس دوره هارمونیک اول برابر با مدت زمان سیگنال ما T1=T=1 ثانیه و فرکانس هارمونیک 1 هرتز خواهد بود. دوره هارمونیک دوم برابر طول مدت سیگنال تقسیم بر 2 (T2=T/2=0.5 ثانیه) و فرکانس 2 هرتز خواهد بود. برای هارمونیک سوم T3=T/3 ثانیه و فرکانس 3 هرتز است. و غیره.

گام بین هارمونیک ها در این مورد 1 هرتز است.

بنابراین، یک سیگنال با مدت زمان 1 ثانیه را می توان به اجزای هارمونیک (به دست آوردن یک طیف) با وضوح فرکانس 1 هرتز تجزیه کرد.
برای افزایش وضوح 2 برابر به 0.5 هرتز، باید مدت زمان اندازه گیری را 2 بار افزایش دهید - تا 2 ثانیه. سیگنالی که 10 ثانیه طول می کشد را می توان به اجزای هارمونیک (برای بدست آوردن یک طیف) با وضوح فرکانس 0.1 هرتز تجزیه کرد. هیچ راه دیگری برای افزایش وضوح فرکانس وجود ندارد.

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

3. سیگنال های گسسته و تبدیل فوریه گسسته

با توسعه فناوری دیجیتال، روش های ذخیره سازی داده های اندازه گیری (سیگنال ها) نیز تغییر کرده است. اگر قبلاً سیگنالی را می‌توانست روی یک ضبط صوت ضبط کرده و روی نوار به شکل آنالوگ ذخیره می‌کرد، اکنون سیگنال‌ها دیجیتالی شده و در فایل‌هایی در حافظه رایانه به‌عنوان مجموعه‌ای از اعداد (نمونه) ذخیره می‌شوند.

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


شکل 9 نمودار کانال اندازه گیری

سیگنال از مبدل اندازه گیریدر یک دوره زمانی T به ADC می رسد. نمونه های سیگنال (نمونه برداری) به دست آمده در زمان T به کامپیوتر منتقل شده و در حافظه ذخیره می شوند.


شکل 10 سیگنال دیجیتالی - N نمونه در طول زمان T دریافت شد

الزامات پارامترهای دیجیتالی شدن سیگنال چیست؟ دستگاهی که سیگنال آنالوگ ورودی را به یک کد گسسته تبدیل می کند ( سیگنال دیجیتال) مبدل آنالوگ به دیجیتال (ADC، انگلیسی آنالوگ به دیجیتال مبدل، ADC) (ویکی) نامیده می شود.

یکی از پارامترهای اصلی ADC حداکثر فرکانس نمونه برداری (یا نرخ نمونه برداری، نرخ نمونه انگلیسی) است - نرخ نمونه برداری یک سیگنال پیوسته زمان هنگام نمونه برداری از آن. با هرتز اندازه گیری می شود. ((ویکی))

طبق قضیه کوتلنیکوف، اگر یک سیگنال پیوسته دارای طیف محدود شده با فرکانس Fmax باشد، می توان آن را به طور کامل و بدون ابهام از نمونه های گسسته آن که در فواصل زمانی گرفته شده بازسازی کرد. ، یعنی با فرکانس Fd؟ 2*Fmax، که در آن Fd فرکانس نمونه برداری است. Fmax - حداکثر فرکانس طیف سیگنال. به عبارت دیگر فرکانس دیجیتالی شدن سیگنال (فرکانس نمونه برداری ADC) باید حداقل 2 برابر بیشتر از حداکثر فرکانس سیگنالی باشد که می خواهیم اندازه گیری کنیم.

اگر نمونه‌هایی با فرکانس کمتر از آنچه قضیه کوتلنیکف لازم است، بگیریم، چه اتفاقی می‌افتد؟

در این مورد، اثر "aliasing" رخ می دهد (همچنین به عنوان اثر استروبوسکوپی، اثر moiré شناخته می شود)، که در آن یک سیگنال با فرکانس بالا، پس از دیجیتالی شدن، به سیگنال فرکانس پایین تبدیل می شود، که در واقع وجود ندارد. در شکل 5 موج سینوسی با فرکانس بالا قرمز یک سیگنال واقعی است. سینوسی آبی با فرکانس پایین سیگنال ساختگی است که به دلیل این واقعیت است که در طول زمان نمونه برداری بیش از نیمی از یک دوره سیگنال فرکانس بالا زمان لازم برای عبور دارد.


برنج. 11. ظهور یک سیگنال فرکانس پایین کاذب با نرخ نمونه برداری ناکافی بالا

برای جلوگیری از اثر aliasing، یک فیلتر ضد آلیاسینگ ویژه در جلوی ADC قرار می گیرد - یک فیلتر پایین گذر (LPF) که فرکانس های زیر نصف فرکانس نمونه برداری ADC را عبور می دهد و فرکانس های بالاتر را قطع می کند.

برای محاسبه طیف یک سیگنال از نمونه های گسسته آن، تبدیل فوریه گسسته (DFT) استفاده می شود. اجازه دهید یک بار دیگر توجه کنیم که طیف یک سیگنال گسسته "طبق تعریف" توسط فرکانس Fmax محدود می شود که کمتر از نصف فرکانس نمونه برداری Fd است. بنابراین، طیف یک سیگنال گسسته را می توان با مجموع تعداد محدودی از هارمونیک ها نشان داد، برخلاف مجموع نامتناهی سری فوریه یک سیگنال پیوسته، که طیف آن می تواند نامحدود باشد. طبق قضیه کوتلنیکوف، حداکثر فرکانس یک هارمونیک باید به گونه ای باشد که حداقل دو نمونه را به خود اختصاص دهد، بنابراین تعداد هارمونیک ها برابر با نصف تعداد نمونه های یک سیگنال گسسته است. یعنی اگر N نمونه در نمونه وجود داشته باشد، تعداد هارمونیک های طیف برابر با N/2 خواهد بود.

اکنون تبدیل فوریه گسسته (DFT) را در نظر می گیریم.

مقایسه با سری فوریه

می بینیم که آنها بر هم منطبق هستند، با این تفاوت که زمان در DFT ماهیت گسسته دارد و تعداد هارمونیک ها با N/2 محدود می شود - نصف تعداد نمونه ها.

فرمول‌های DFT در متغیرهای عدد صحیح بدون بعد k, s نوشته می‌شوند که k تعداد نمونه‌های سیگنال و s تعداد اجزای طیفی است.
مقدار s تعداد نوسانات هارمونیک کامل را در دوره T (مدت اندازه گیری سیگنال) نشان می دهد. تبدیل فوریه گسسته برای یافتن دامنه ها و فازهای هارمونیک ها با استفاده از روش عددی استفاده می شود. "روی کامپیوتر"

بازگشت به نتایج به دست آمده در ابتدا. همانطور که در بالا ذکر شد، هنگام گسترش یک تابع غیر تناوبی (سیگنال ما) به یک سری فوریه، سری فوریه حاصل در واقع با یک تابع تناوبی با دوره T مطابقت دارد (شکل 12).


شکل 12 تابع تناوبی f(x) با دوره T0، با دوره اندازه گیری T>T0

همانطور که در شکل 12 مشاهده می شود، تابع f(x) تناوبی با دوره T0 است. اما با توجه به اینکه مدت زمان نمونه اندازه گیری T با دوره تابع T0 منطبق نیست، تابع به دست آمده به عنوان سری فوریه در نقطه T دارای ناپیوستگی است. در نتیجه طیف این تابع شامل خواهد شد. تعداد زیادی هارمونیک با فرکانس بالا اگر مدت زمان نمونه اندازه گیری T با دوره تابع T0 منطبق باشد، طیف به دست آمده پس از تبدیل فوریه فقط شامل اولین هارمونیک (سینوسوئید با دوره ای برابر با مدت زمان نمونه برداری) خواهد بود، زیرا تابع f(x) سینوسی است.

به عبارت دیگر، برنامه DFT "نمی داند" که سیگنال ما "قطعه ای از یک سینوسی" است، اما سعی می کند یک تابع تناوبی را به شکل یک سری نشان دهد که به دلیل ناهماهنگی تک تک قطعات دارای ناپیوستگی است. یک سینوسی

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

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


شکل 13 مثالی از عملکرد و طیف سیگنال خطای سینماتیکی گیربکس

با مدت زمان کوتاه تر، تصویر "بدتر" به نظر می رسد:


شکل 14 مثالی از عملکرد و طیف سیگنال ارتعاش روتور

در عمل، درک این که "مولفه های واقعی" کجا هستند و "مصنوعات" ناشی از دوره های غیر چندگانه اجزا و مدت زمان نمونه گیری سیگنال یا "پرش و شکست" در شکل سیگنال کجا هستند، می تواند دشوار باشد. . البته، کلمات "مؤلفه های واقعی" و "مصنوعات" به دلیلی در گیومه قرار می گیرند. وجود هارمونیک های زیاد در نمودار طیف به این معنی نیست که سیگنال ما واقعاً از آنها تشکیل شده است. این مانند تصور این است که عدد 7 از اعداد 3 و 4 "شامل" است. عدد 7 را می توان به عنوان مجموع اعداد 3 و 4 نشان داد - این درست است.

بنابراین سیگنال ما... یا حتی نه "سیگنال ما"، بلکه یک تابع تناوبی که با تکرار سیگنال ما (نمونه برداری) تشکیل شده است را می توان به صورت مجموع هارمونیک ها (امواج سینوسی) با دامنه ها و فازهای معین نشان داد. اما در بسیاری از مواردی که برای تمرین مهم هستند (شکل های بالا را ببینید)، در واقع می توان هارمونیک های به دست آمده در طیف را با فرآیندهای واقعی که طبیعت چرخه ای دارند و سهم قابل توجهی در شکل سیگنال دارند، مرتبط کرد.

برخی از نتایج

1. یک سیگنال اندازه گیری شده واقعی با مدت زمان T ثانیه، دیجیتالی شده توسط یک ADC، یعنی با مجموعه ای از نمونه های گسسته (N قطعه) نشان داده شده است، دارای یک طیف غیر تناوبی گسسته است که با مجموعه ای از هارمونیک ها نمایش داده می شود (N/ 2 عدد).

2. سیگنال با مجموعه ای از مقادیر واقعی و طیف آن با مجموعه ای از مقادیر واقعی نمایش داده می شود. فرکانس های هارمونیک مثبت هستند. این واقعیت که برای ریاضیدانان راحت‌تر است که طیف را به شکل پیچیده با استفاده از فرکانس‌های منفی نشان دهند، به این معنا نیست که «این درست است» و «این باید همیشه انجام شود».

3. سیگنال اندازه گیری شده در یک بازه زمانی T فقط در یک بازه زمانی T تعیین می شود. آنچه قبل از شروع اندازه گیری سیگنال اتفاق افتاده است، و آنچه پس از آن اتفاق خواهد افتاد، برای علم ناشناخته است. و در مورد ما، جالب نیست. DFT یک سیگنال با زمان محدود، طیف "واقعی" آن را می دهد، به این معنا که، تحت شرایط خاص، به فرد اجازه می دهد دامنه و فرکانس اجزای آن را محاسبه کند.

مواد مورد استفاده و سایر مواد مفید.

یک نشانگر LCD کاراکتری دو خطی به عنوان دستگاه نمایشگر استفاده می شود. نکته اصلی در اجرای این پروژه سخت افزار نیست، بلکه نرم افزار، به طور دقیق تر پیاده سازی تبدیل فوریه گسسته (DFT) بر روی یک میکروکنترلر 8 بیتی است. فوراً باید توجه داشت که نویسنده در این زمینه متخصص نیست و بنابراین با مبانی شروع کرده است - با تبدیل فوریه گسسته ساده. الگوریتم تبدیل فوریه سریع نه تنها سریع است، بلکه بسیار پیچیده است.

تبدیل فوریه گسسته (در ادبیات انگلیسی DFT، تبدیل فوریه گسسته) یکی از تبدیل های فوریه است که به طور گسترده در الگوریتم های پردازش سیگنال دیجیتال استفاده می شود (اصلاحات آن در فشرده سازی صدا در MP3، فشرده سازی تصویر در JPEG و غیره) و همچنین در حوزه های دیگر مربوط به تجزیه و تحلیل فرکانس ها در یک سیگنال گسسته (به عنوان مثال، آنالوگ دیجیتالی شده). تبدیل فوریه گسسته به یک تابع گسسته به عنوان ورودی نیاز دارد. چنین توابعی اغلب با نمونه برداری (نمونه گیری مقادیر از توابع پیوسته) ایجاد می شوند.

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

قسمت دیجیتال توسط یک میکروکنترلر و یک نشانگر LCD متصل به آن تشکیل می شود. کلاک میکروکنترلر از تشدید کننده کوارتز 16 مگاهرتز، ولتاژ تغذیه +5 ولت به عنوان ولتاژ مرجع برای ADC میکروکنترلر استفاده می شود.
گذرگاه داده نشانگر LCD به پورت C میکروکنترلر (خطوط ورودی/خروجی PC0-PC3) و باس کنترل به پورت D (PD5, PD6) میکروکنترلر متصل است. نشانگر در حالت 4 بیتی کار می کند. یک مقاومت متغیر با مقدار اسمی 4.7 کیلو اهم برای تنظیم کنتراست استفاده می شود. برای کار با نشانگر، نمادهای سفارشی برای نمایش 8 ستون افقی تحلیلگر ایجاد شدند؛ این نمادهای سفارشی تمام 64 بایت رم نشانگر LCD را اشغال می کنند.

میکروکنترلر از یک تشدید کننده کوارتز خارجی 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 است :)
  • "ما باید زاویه (درجه ها) را محاسبه کنیم" آیا کسی می تواند با جزئیات بیشتری به ما بگوید که مقادیر این جداول چگونه محاسبه می شوند؟
  • با جدول سینوس ها و کسینوس ها همه چیز مشخص است. مشخص نیست که مقادیر جدول درجه_نگاهی چگونه محاسبه می شوند؟

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

من یک آنالایزر طیف صوتی کوچک (0 تا 10 کیلوهرتز) از یک LCD 16x2 و یک میکروکنترلر ATmega32 ساختم. من با DFT های ساده (تبدیل فوریه گسسته) شروع کردم. FFT (تبدیل فوریه سریع) فقط در سرعت بیشتر و الگوریتم کمی پیچیده تر با DFT متفاوت است ، من از آن استفاده نکردم ، شاید بعداً آن را اضافه کنم.

DFT در مقایسه با FFT کند است. آنالایزر طیف ال سی دی من به سرعت بالایی که FFT می تواند ارائه دهد نیاز ندارد و اگر تصویر روی صفحه با سرعتی در حدود 30 فریم در ثانیه تغییر کند، این برای تجسم طیف صوتی بیش از اندازه کافی است. اما من در حال حاضر می توانم به حدود 100 فریم در ثانیه برسم، با این حال، نرخ تازه سازی بیش از حد بالا برای LCD توصیه نمی شود. صدای نمونه برداری شده در 20 کیلوهرتز، 32 نقطه DFT تولید می کند. از آنجایی که نتیجه تبدیل متقارن است، من فقط باید از 16 نتیجه اول استفاده کنم. بر این اساس، حداکثر فرکانس 10 کیلوهرتز است. بنابراین، 10 کیلوهرتز / 16 = 625 هرتز.

من سعی می کردم سرعت محاسبه DFT را افزایش دهم. اگر نقطه N DFT وجود داشته باشد، باید سینوس و کسینوس (N^2)/2 را پیدا کنیم. برای DFT 32 نقطه ای، باید سینوس و کسینوس 512 را پیدا کنیم. قبل از پیدا کردن سینوس و کسینوس، ما باید زاویه (درجه) را پیدا کنیم که مقداری از زمان CPU را اشغال می کند. برای این کار جداول سینوس و کسینوس درست کردم. من متغیرهای سینوس و کسینوس 16 بیتی را با ضرب مقادیر سینوس و کسینوس در 10000 ساختم. بعد از تبدیل، باید هر نتیجه را بر 10000 تقسیم کنم. اکنون می توانم 120 DFT 32 نقطه ای در ثانیه محاسبه کنم که بیشتر از برای یک تحلیلگر طیف کافی است.

نمایش دادن

من از کاراکترهای LCD سفارشی بارگذاری شده در 64 بایت حافظه LCD داخلی استفاده کردم. من ویدیویی را به صورت آنلاین دیدم که در آن یک LCD 16x2 به عنوان نمایشگر آنالایزر طیف استفاده می شود و از این ایده استفاده کردم.

ورودی صدا

یکی از مهمترین بخش های یک آنالایزر طیف، دریافت سیگنال از یک میکروفون الکترت است. باید توجه ویژه ای به توسعه شود پیش تقویت کنندهبرای میکروفون ما باید سطح صفر را در ورودی ADC و حداکثر سطح را برابر با نصف ولتاژ تغذیه قرار دهیم، یعنی. 2.5 ولت می توان آن را با ولتاژ 2.5- تا 2.5+ تامین کرد. پیش تقویت کننده باید طوری پیکربندی شود که از این محدودیت ها تجاوز نکند. من از یک آپ امپ LM324 به عنوان پیش تقویت کننده میکروفون استفاده کردم.

فهرست عناصر رادیویی

تعیین تایپ کنید فرقه تعداد توجه داشته باشیدخرید کنیددفترچه یادداشت من
نمایش دادن
MK AVR 8 بیتی

ATmega32

1 به دفترچه یادداشت
خازن22 pF2 به دفترچه یادداشت
خازن0.1 µF1 به دفترچه یادداشت
خازن الکترولیتی100μF1 به دفترچه یادداشت
مقاومت

100 اهم

1 به دفترچه یادداشت
مقاومت تریمر4.7 کیلو اهم1 به دفترچه یادداشت
تشدید کننده کوارتز16 مگاهرتز1 به دفترچه یادداشت
صفحه نمایش ال سی دی16x21 به دفترچه یادداشت
واحد قدرت5 V1 به دفترچه یادداشت
ورودی صدا
U1 تقویت کننده عملیاتی

LM324

1 به دفترچه یادداشت
C1 خازن1 µF1 به دفترچه یادداشت
C8 خازن0.01 µF1 به دفترچه یادداشت
R1 مقاومت

220 کیلو اهم

1 به دفترچه یادداشت
R2، R3 مقاومت

10 کیلو اهم

2 به دفترچه یادداشت
R4، R9 مقاومت

1 کیلو اهم

2 به دفترچه یادداشت
R5 مقاومت

پردازنده‌های تخصصی زیادی برای پردازش سیگنال دیجیتال (DSP) وجود دارد، مانند DSP از سری TMS320 تگزاس اینسترومنت، که هم هسته‌های عدد صحیح ساده و هم هیولاهایی مانند زیرخانواده خانواده C6000 را شامل می‌شود که داده‌های ممیز شناور را پردازش می‌کند. یک سری کامل ADSP از دستگاه های آنالوگ وجود دارد (که شامل BlackFin کم و بیش جهانی است)، همچنین تعداد بیشتری نیز وجود دارد. راه حل های سادهاز میکروچیپ - dsPIC.

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

امسال سال 2000 نیست، راه‌حل‌های تک‌تراشه‌ای مبتنی بر هسته‌های ARM7/Cortex-M3 با کارایی بالا وجود دارد که قیمت آن‌ها به میزان قابل‌توجهی کاهش یافته است؛ آنها 32 بیتی هستند، دارای اجرای سخت‌افزاری از یک عملیات ضرب 32 بیتی هستند (به علاوه ، تقریباً یک عملیات ضرب-انباشت 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 بیتی شد. علاوه بر این، در تمام داده‌های آزمایشی ظاهر نشد، بنابراین تا زمانی که پیدا شد باعث سردرد شد.

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

در اینجا یک طرح از مدار ورودی است:


اشکال زدایی نرم افزار در مراحل زیر انجام شد:

  1. اشکال زدایی تمام لوازم جانبی لازم: ADC، DAC، تایمر، نشانگر LED.
  2. تست با دیجیتالی شدن سیگنال: داده ها را با سرعت مورد نیاز دیجیتالی می کنم و در بافر قرار می دهم، سپس داده ها را از بافر استخراج می کنم و سیگنال را پخش می کنم. آن ها تغییر سیگنال ساده در زمان، بدون هیچ تغییری. در این مرحله مکانیسم کار با 2 بافر لازم برای کار بیشتر مورد آزمایش قرار می گیرد.
  3. به نسخه پیشینتبدیل فوریه مستقیم و معکوس اضافه می شود. این تست در نهایت عملکرد صحیح کد FFT را تأیید می کند و همچنین بررسی می کند که آیا کد با عملکرد موجود مطابقت دارد.
  4. پس از این، اسکلت اصلی اپلیکیشن انجام شد، می توانید به سراغ کاربردهای عملی بروید.

مشکل پس از اضافه کردن FFT به کد ایجاد شد: نویز و سوت های اضافی در سیگنال ظاهر شد. به طور کلی این رفتار برای من بسیار عجیب به نظر می رسید، زیرا ... بدون تبدیل، سیگنال عبوری از مسیر دیجیتال کاملاً تمیز باقی می ماند. دلیل اول برای این: پس از مدار آنالوگ، دامنه سیگنال در ADC کامل نبود (0-3.3V)، بلکه فقط در 0.5-2V در حداکثر حجم پخش کننده بود، دوم: نویز بسیار قوی به دلیل عدد صحیح محاسبات (+-1 واحد، که معلوم شد برای ایجاد تداخل شنیداری کافی است).

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

کاربرد 1: تغییر صدای سیگنال

برد دارای پتانسیومتر ( مقاومت متغیر، می توان از آن برای کنترل استفاده کرد. در این مورد، طیف سیگنال را به سمت بالا و پایین تنظیم می کند، به اندازه ای که ترکیبات مورد علاقه شما را «تبدیل» کند.

در اینجا چیزی است که در حوزه فرکانس اتفاق می افتد:


در این مورد، نتیجه تبدیل در 2 بافر قرار می گیرد. یک بافر قسمت واقعی و دیگری قسمت خیالی است. معنای فیزیکی اعداد به دست آمده در آنها: قسمت واقعی حاوی مقادیر هارمونیک ها است، بخش خیالی شامل تغییر فاز برای این هارمونیک ها است. علاوه بر این، همانطور که می بینید، سیگنال اولیه با N-value توصیف می شود و پس از تبدیل، مقدار 2N به دست می آید. مقدار اطلاعات تغییر نمی کند و افزایش 2 برابری در مقدار اطلاعات به دلیل این واقعیت است که داده های بافر دارای افزونگی در قالب تکرار مقادیر هستند.




بالا