реклама на сайте
подробности

 
 
> НЧ спектроанализатор на ATMega8, FFT или?...
Kuznec9999
сообщение May 14 2008, 13:08
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157



Здравствуйте. Проблема заключается в следующем. Имеем ATMega8 и звуковой сигнал. Подаём звук на вход АЦП... Необходимо реализовать расщепление сигнала по N (5-10) частотным полосам и в восьмибитном представлении получить N ячеек с амплитудами каждой полосы (т.е организовать программно блок фильтров для спектроанализатора). Думаю надо делать FFT? Как это можно сделать, и где про это можно почитать? Только желательно, чтобы это было без супервысшей математики smile.gif. Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
defunct
сообщение May 14 2008, 13:42
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Вот пример функции, скачал когда-то с wiki, немного подправил входные параметры, ссылку сейчас не вспомню.
Это конечно не самый быстрый вариант. Для AVR надо будет переделать под целочисленные вычисления:

CODE
void FFT( float *dOut, int *dIn )
{
#define nn FFT_RESOLUTION

int i, j, n, m, mmax, istep;
float tempr, tempi, wtemp, theta, wpr, wpi, wr, wi;

int isign = -1;
float data[nn*2 + 1]; // originally there was +128, wtf is 128 for?

j = 0;
for (i = 0; i < nn; i++)
{
j = (i << 1);
data[ j ] = 0;
data[ j + 1 ] = dIn[i];
}

n = nn << 1;
j = 1;
i = 1;
while (i < n)
{
if (j > i)
{
tempr = data[i]; data[i] = data[j]; data[j] = tempr;
tempr = data[i+1]; data[i+1] = data[j+1]; data[j+1] = tempr;
}
m = n >> 1;
while ((m >= 2) && (j > m))
{
j = j - m;
m = m >> 1;
}
j = j + m;
i = i + 2;
}
mmax = 2;
while (n > mmax)
{
istep = 2 * mmax;
theta = 2.0* M_PI / (isign * mmax);
wtemp = sin(0.5 * theta);
wpr = -2.0 * wtemp * wtemp;
wpi = sin(theta);
wr = 1.0;
wi = 0.0;
m = 1;
while (m < mmax)
{
i = m;
while (i < n)
{
j = i + mmax;
tempr = wr * data[j] - wi * data[j+1];
tempi = wr * data[j+1] + wi * data[j];
data[j] = data[i] - tempr;
data[j+1] = data[i+1] - tempi;
data[i] = data[i] + tempr;
data[i+1] = data[i+1] + tempi;
i = i + istep;
}
wtemp = wr;
wr = wtemp * wpr - wi * wpi + wr;
wi = wi * wpr + wtemp * wpi + wi;
m = m + 2;
}
mmax = istep;
}

for (i = 0; i < (nn / 2); i++)
{
dOut[i] = sqrt( data[i*2] * data[i*2] + data[i*2+1] * data[i*2+1] );
}

#undef nn
}
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 13:51
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157



Спасибо большое за код, но, боюсь, я его не осилю. К сожалению, с СИ я на "вы"... Что ж, придётся учить C, т.к писать на ассемблере подобные вещи, чуствую, практически нецелесообразно.

Сообщение отредактировал Kuznec9999 - May 14 2008, 13:52
Go to the top of the page
 
+Quote Post
GDI
сообщение May 14 2008, 13:58
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Вот тут я давал исходник 64 точечного фурье для АВР на асме, можете попробовать.

Именно на асме такие вещи и надо писать.. smile.gif хотя лично я с асмом на "вы"


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 14 2008, 15:26
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Все как всегда уже придумано до нас...
http://elm-chan.org/works/akilcd/report_e.html
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение May 15 2008, 16:28
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Есть application note AVR223 - Digital Filters with AVR. Можно его почитать, а потом сделать 5 ... 10 цифровых фильтров.


--------------------
ASB
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016