Например TDA7294

Форум РадиоКот • Просмотр темы - FFT на Си для AVR
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 20:20:22

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 200 ]    , , , , 5, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Чт мар 26, 2015 20:50:55 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
Вроде как всё правильно сделал, но в Протеусе не хочет работать...


Я правильно понимаю, что в прошивке вы, как и следует, не использовали вещественных чисел и тригонометрических функций, а сделали на фиксированной точке и с предрассчитанными массивами? Вещественные вычисления на AVR работают ОЧЕНЬ медленно по причине отсутствия математического сопроцессора. Тот пример на Lua, что я приводил выше, хорош в основном для демонстрационных целей. Для реальной работы его надо адаптировать.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 09:28:08 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Добрый день!
Рад, что тема движется... :)
Вот как раз сейчас хотел спросить у Вас каким образом вот здесь
были посчитаны коэффициенты для частоты 150Гц?
Опять заблудился... :)


А сам код такой:
Код:
//Программа инициализации АЦП
  void adc_init()
{
   ADMUX = (1<<REFS0); //выбираем источник питания АЦП 5v
   ADMUX |= (0<<MUX0);
   ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADATE)|(1<<ADIE); //включаем АЦП с делителем = Fcpu/16
   ADCSRA |= (1<<ADSC);
 
}
//


Ну и обработка прерывания:
Код:
 ISR(ADC_vect) //подпрограмма обработки прерывания от АЦП
{
 //cli();
 PORTD = 1;
 buffer[i] = (ADCL + (ADCH<<8))-512;
 i++;
 count++;
 if(count == BUF_SIZE) {cli(); i=0; count=0;}

   PORTD = 0;

}


PORTD... - это просто для теста, чтоб импульсы видеть, когда программа в прерывания заходит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 12:35:39 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Не совсем понял, про какие коэффициенты вы говорите. Ну а код просто настраивает АЦП и заполняет массив. Обработки сигнала в приведенных фрагментах нет.

Кстати, запись

Код:
buffer[i] = (ADCL + (ADCH<<8))-512;


не особо хороша. Дело в том, что в Си не определен порядок вычисления операндов выражения, в то время как ADCL и ADCH требуют совершенно определенного порядка доступа (даташит, стр. 258):

Цитата:
When an ADC conversion is complete, the result is found in these two registers.
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.
The ADLAR bit in ADMUX, and the MUXn bits in ADMUX affect the way the result is read from
the registers. If ADLAR is set, the result is left adjusted. If ADLAR is cleared (default), the result
is right adjusted.


В записи, конечно, расставлены скобки, и скорее всего все будет работать как ожидается. Но в таких принципиальных моментах писать все в одну строчку не стоит. Я бы даже не полагался на автоматическое расширение типа (на это автор кода полагается при сдвиге).

То есть, я бы написал как-то так:

Код:
int16_t tmp;

...

tmp=ADCL;
tmp|=((uint16_t)ADCH)<<8;
tmp-=512;

buffer[i]=tmp;

...

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 13:28:25 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
YS писал(а):
То есть, я бы написал как-то так:
Код:
int16_t tmp;

...

tmp=ADCL;
tmp|=((uint16_t)ADCH)<<8;
tmp-=512;

buffer[i]=tmp;
а почему бы не делать ПРАВИЛЬНО? вы пользуетесь WinAVR (или AVR-GCC), так почему не пользоваться для получения значения АЦП предопределенной переменной ADC? в CodeVision для аналогичных целей используется ADCW.
к чему морочить себе голову с доступом к половинкам регистра АЦП, если компилятор готов все сделать за вас?
Код:
int tmp = ADC - 512;

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 14:41:36 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
YS писал(а):
Не совсем понял, про какие коэффициенты вы говорите.


Да вот тут он пишет:

Цитата:
Например имеем 512 отсчетов АЦП нужно посчитать мнимую и действительную части для 150Гц при частоте дискретизации 19200 Гц:


во вложении картинка с коэффициентами...

Не пойму по какой формуле он всё это считал?...
То, что потом всё умножается на 127 - это понятно..
А как изначально?...
Пробовал повторить этот расчёт - ничего не получается... :(


Вложения:
12analizator_3.gif [12.21 KiB]
Скачиваний: 1649
Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 15:03:44 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
во вложении картинка с коэффициентами...


Дык это просто синус и косинус.

Помните я писал

Код:
while k<1000 do
   s_re=s_re+math.cos(2*math.pi*REL_FREQ*(k/1000))*signal[k];
   s_im=s_im+math.sin(2*math.pi*REL_FREQ*(k/1000))*signal[k];
   k=k+1;
end;


Вот он, если переносить на мой пример, заранее посчитал N значений

Код:
math.cos(2*math.pi*REL_FREQ*(k/N))


и

Код:
math.sin(2*math.pi*REL_FREQ*(k/N))


Ну и округлил/нормировал, разумеется.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 15:27:27 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Код:
math.cos(2*math.pi*REL_FREQ*(k/N))


Пробовал таким образом - ничего не получается...
Не сходится с его таблицей... :(

К примеру 8-е значение в таблице косинусов - 117, а у меня получается с округлением - 65... :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 15:52:36 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
К примеру 8-е значение в таблице косинусов - 117, а у меня получается с округлением - 65...


Так абсолютные значения зависят от нормировки. Главное - вид функции. Постройте его массив, ваш массив, и сравните.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 16:39:09 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
YS писал(а):
Цитата:
К примеру 8-е значение в таблице косинусов - 117, а у меня получается с округлением - 65...


Так абсолютные значения зависят от нормировки. Главное - вид функции. Постройте его массив, ваш массив, и сравните.


Всё равно не пойму почему не сходятся результаты... )
Видимо, не мой день... )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 17:20:04 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Ткните просто меня носом, как он вычислил эти коэффициенты?...
Хожу вокруг да около и ничего не понимаю....
Автор пишет, что вычислял коэфф. для частоты 150Гц при частоте дискретизации 19200...
Как всё это связать, чтоб получилось вычислить то же самое?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 17:33:11 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18494
Рейтинг сообщения: 0
Чисто интуитивно как то так - 19200 / 150 - число отсчетов, теперь укладываем в них полный период синуса/косинуса - оно ?

в excel =ОКРУГЛ(COS(1/( 19200 / 150 )*8*360*3,14/180)*127;4)

8й отсчет в последовательности из 128

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Пт мар 27, 2015 19:54:35 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 1
Цитата:
а почему бы не делать ПРАВИЛЬНО? вы пользуетесь WinAVR (или AVR-GCC), так почему не пользоваться для получения значения АЦП предопределенной переменной ADC?


В дидактических целях. Кроме AVR и AVR-GCC существуют и другие контроллеры и компиляторы, и там тоже бывают подобные требования, но не всегда определены соответствующие "прямые" возможности. Ну а в данном конкретном случае, конечно, можно и так.

Цитата:
Ткните просто меня носом, как он вычислил эти коэффициенты?...


Ох. Ну окей, я написал сходу и "влоб":

Код:
SAMPLING_FREQ_HZ   = 19200;
SINE_FREQ_HZ       = 150;
SAMPLES_NO         = 128;

timestep = 1/SAMPLING_FREQ_HZ;
sine_table = {};
k=0;

while k<SAMPLES_NO do

   ph=2*math.pi*SINE_FREQ_HZ*k*timestep;
   sine_table[k+1]=math.floor(127*math.sin(ph));
   k=k+1;

end;

k=0;
while k<SAMPLES_NO do
   io.write(sine_table[k+1] .. ",");

   if ((k+1)%16)==0 then
      print("");
   end;

   k=k+1;
end;


Результат:

Код:
0,6,12,18,24,30,36,42,48,54,59,65,70,75,80,85,
89,94,98,102,105,108,112,114,117,119,121,123,124,125,126,126,
127,126,126,125,124,123,121,119,117,114,112,108,105,102,98,94,
89,85,80,75,70,65,59,54,48,42,36,30,24,18,12,6,
0,-7,-13,-19,-25,-31,-37,-43,-49,-55,-60,-66,-71,-76,-81,-86,
-90,-95,-99,-103,-106,-109,-113,-115,-118,-120,-122,-124,-125,-126,-127,-127,
-127,-127,-127,-126,-125,-124,-122,-120,-118,-115,-113,-109,-106,-103,-99,-95,
-90,-86,-81,-76,-71,-66,-60,-55,-49,-43,-37,-31,-25,-19,-13,-7


Сравним:

Изображение

Как я уже говорил, это просто массив синуса, без всяких изысков. Надеюсь, разница в единицы (ошибка округления) вас не смущает? :)

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Сб мар 28, 2015 06:47:48 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Доброе утро всем!

Вчера не смог уже ответить - уснул за столом... :)

YS, спасибо за очередную подсказку (точнее ликбез)! :)

Но у меня опять ничего не выходит... :(

Считал просто на калькуляторе:

ph = 6.28 * 150 * 8 * 0.000052 = 0.391872;
sine_table[k+1] = 127 * cos(0.391872) = 126.99; - даже близко ничего похожего... :( :( :(

Что я не так делаю?
Не могу понять... :dont_know:

Дело в вычислении косинуса на калькуляторе...
В этом моменте я делаю что-то не так!...

Пересчитал на этом калькуляторе - всё правильно!...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Сб мар 28, 2015 08:44:06 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
нашёл причину...
Угол на калькуляторе не поставил в радианы... :oops: :oops: :oops:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Сб мар 28, 2015 12:42:00 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Ага, бывает. :)

Только один вопрос - а зачем считать таблицу синуса на калькуляторе? :) Для этого, как вы видите, очень хорошо пригодны скриптовые языки. Очевидно, если мою программу сверху совсем немного доработать, можно получить на выходе готовую таблицу любого размера, причем уже в виде корректного массива, записанного по правилам Си или любого другого языка.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Сб мар 28, 2015 13:41:10 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
YS писал(а):
Ага, бывает. :)

Только один вопрос - а зачем считать таблицу синуса на калькуляторе? :) Для этого, как вы видите, очень хорошо пригодны скриптовые языки. Очевидно, если мою программу сверху совсем немного доработать, можно получить на выходе готовую таблицу любого размера, причем уже в виде корректного массива, записанного по правилам Си или любого другого языка.


Да нет, я не собирался вычислять всю таблицу на калькуляторе... :)
Просто, когда мне нужно разобраться в сути дела я делаю выборочные вычисления по шагам...

Поэтому взял табличное значение, просто на выбор 8-е и попытался его получить так как описано у автора...
Ну и забуксовал из-за этих градусов/радианов... :)

На данный момент вычислил таблицы для частоты 1000Гц, подключил отдельным файлом в программу, скорректировал последнюю и теперь вижу как это работает а Протеусе...
Протеус для таких вещей конечно же не есть хорошо, но то, что он показывает на данном этапе мне достаточно...
Далее нужно спаять платку (прошлый раз сделать это на работе не получилось :( ) и доводить всё это до ума.

Вот... как-то так... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Вс мар 29, 2015 06:31:43 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Добрый день!

В общем, в Протеусе нарисовал вот такую схемку:

Изображение

С генератора подаю сигнал, а на выходе ЦАП получаю аналоговый уровень...
В общем, для теста вполне достаточно...
Сейчас паяю платку... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Вс мар 29, 2015 10:23:38 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1244
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
INA, поскольку мне больше нечего сказать по существу, кроме того, что я рад, что у вас, как я понял, все работает, можно я немного поработаю за модераторов, пока они вас сами не нашли? :)

Дело в том, что правила форума запрещают цитировать сообщение полностью, равно как и создавать подряд несколько сообщений одному автору. За это модераторы могут обратить свое око на вас (забанить, скорее всего, не забанят, но предупреждение вынесут). :wink: Картинок более 800 пикселей в ширину вы пока не выкладывали, но знайте, что это тоже частая ошибка - пару раз и я попадался на этом. :)

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Вс мар 29, 2015 16:18:46 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Добрый вечер!

Да нет, конечно!
Как я могу быть против, если судя по надписи над аватаром,
я "Первый раз сказал Мяу!"... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FFT на Си для AVR
СообщениеДобавлено: Вс апр 05, 2015 06:46:01 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн мар 23, 2015 17:18:47
Сообщений: 27
Рейтинг сообщения: 0
Добрый день всем!

В общем, разобрался я со своей задачей.
Спасибо большое всем за помощь в понимании не понимаемого... :)
Персональное спасибо YS за спокойный и вразумительный ликбез!... :) :beer:

Чтобы как-то закрепить информацию и увидеть как всё это работает в реальности,
собрал на Меге32 небольшой 5-ти полосный анализатор спектра...
Собрал его на китайской дырявой платке, но тем не менее всё работает как положено...
Чему, естественно безмерно рад!... :)
Записал видео его работы, но файл большой и здесь выложить не получится, однако если кому-нибудь будет интересно, могу скинуть на какой-нибудь файлообменник...
Ещё раз спасибо всем!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 200 ]    , , , , 5, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y