Обсуждаем контроллеры компании Atmel.
Ответить

Re: FFT на Си для AVR

Ср май 03, 2017 21:15:41

Я - логарифм. Причём совмещая операцию извлечения корня из суммы квадратов Re и Im на последнем этапе и логарифмизации результата в одну операцию логарифмизации, в этом случае корень и вычислять не нужно, т.к. log(sqrt(R²+I²)) = 0.5*log(R²+I²).

Re: FFT на Си для AVR

Чт май 04, 2017 06:23:27

Прошу пояснить, что такое нормализация и какую цель она преследует.
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?

Re: FFT на Си для AVR

Чт май 04, 2017 07:57:28

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

Re: FFT на Си для AVR

Чт май 04, 2017 10:43:45

Вывод в логарифмической шкале интересен, если речь идёт от звуке (в контексте AVR это обычно так и есть). Поскольку у человека шкала слуха логарифмическая, то и результат более оправданно будет выглядеть в этом случае.
Скажем, такой набор мощности звука:
Код:
P,  2P,  4P,  8P,  16P,  32P,  64P,  128P

будет воспринимать линейно. И имеет смысл на мощности 16P зажигать именно 5 светодиодов из 8, а не один, как было бы при линейной шкале (16P - как раз одна восьмая из 128P).

Re: FFT на Си для AVR

Пт май 05, 2017 20:41:21

Используете ли Вы усреднение результатов ? Например высчитать 2-3 выборки БФП, а на дисплей вывести средний результат?

Re: FFT на Си для AVR

Пт май 05, 2017 22:01:56

Нет. Жалко времени на доп. расчёты. Но поскольку лишнее мельтешение тоже видеть не хочется, применяется другой подход. Значения спектра выводятся в виде столбиков на экран и запоминаются. При следующем показе новых данных, если новый столбик выше предыдущего, он отображается как есть, а если ниже - рисуется старый, уменьшенный на 1. Получается быстрое нарастание, но медленный спад, что выглядит приятно для глаза: http://wiselord.github.io/avr/ampcontrol/

Re: FFT на Си для AVR

Ср дек 20, 2017 21:57:28

Всем добрый вечер подскажите допустим имеем микрофон подключённый к ацп атмеги +лсд . Как можно определить пик частоты ?
Хочется чет наподобие спектрального анализатора .
Вложения
t.JPG
(55.05 KiB) Скачиваний: 479

Re: FFT на Си для AVR

Чт дек 21, 2017 06:55:31

Q-ti писал(а):Хочется чет наподобие спектрального анализатора

http://elm-chan.org/works/akilcd/report_e.html

Re: FFT на Си для AVR

Пт дек 22, 2017 18:29:34

Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .

Re: FFT на Си для AVR

Пт дек 22, 2017 18:37:48

Q-ti писал(а):Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму
вам хочется, чтобы кто-то за вас сделал то, что вам хочется?

у вас есть библиотека FFT, которая выдает массив амплитуд частот. неужели вы сами не можете перебрать этот массив и найти в нем наибольшее значение?

Re: FFT на Си для AVR

Пт дек 22, 2017 18:58:21

Делать за меня ничего не надо просто прошу подсказать по какой формуле высчитать частоту ?

Re: FFT на Си для AVR

Пт дек 22, 2017 20:30:56

Да вы хоть почитайте про библиотеку и вообще принцип FFT! каждая частота в массиве после FFT имеет фиксированное значение, зависящее от общего количества полос (а оно в свою очередь зависит от размера буфера семплов) и частоты семплирования. Например, при частоте семплирования 32 кГц и размере буфера в 128 семплов вы получите значения амплитуд 64 частот, первая будет иметь частоту 0 Гц (т.е. это будет постоянная составляющая) вторая 250 Гц, третья 500 Гц и так далее с шагом 250 Гц, последняя 64-я будет, как вы можете догадаться 15750 Гц.

Re: FFT на Си для AVR

Сб сен 17, 2022 13:52:50

Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги328, точнее таймера для измерения сигнала в 100Гц к примеру. Т.е. период 10000uS хочу произвести 32 измерения равно 312,5 uS - дискретность 3,2kHz. АЦП будет 10bit 125kHz = (11,5+2)/0,125+(4/16MHz) =108.25uS на 1 преобразование АЦП, т.е. убираемся в 312,5uS аж 2 целых два раза. Правильно ли я иду?
И второй вопрос, люди вот все делают для N выборок так:
Код:
for (int k = 0; k < 1024; k++)
            {
                for (int n = 0; n < 1024; n++)
                {
                    x_real[k] += x_n[n] * Math.Cos( (-2) * Math.PI * k * n / 1024 );
                    x_imag[k] += x_n[n] * Math.Sin( (-2) * Math.PI * k * n / 1024);
                }
                x_Ampl[k] = Math.Sqrt( x_real[k] * x_real[k] + x_imag[k] * x_imag[k] );   
            }

а для одной выборки получатся следующее?:
Код:
for (int n = 0; n < 1024; n++)
                {
                    x_real[1] += x_n[n] * Math.Cos( (-2) * Math.PI * 1 * n / 1024 );
                    x_imag[1] += x_n[n] * Math.Sin( (-2) * Math.PI * 1 * n / 1024);
                }
                x_Ampl[1] = Math.Sqrt( x_real[1] * x_real[1] + x_imag[1] * x_imag[1] );

и можно ли ограничиться одной выборкой(семплом),а не 32?

Re: FFT на Си для AVR

Сб сен 17, 2022 16:08:40

БПФ на восьмибитке, не умеющей флоаты?
Мде...

Re: FFT на Си для AVR

Сб сен 17, 2022 17:32:54

Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги328, точнее таймера для измерения сигнала в 100Гц к примеру. Т.е. период 10000uS хочу произвести 32 измерения равно 312,5 uS - дискретность 3,2kHz. АЦП будет 10bit 125kHz = (11,5+2)/0,125+(4/16MHz) =108.25uS на 1 преобразование АЦП, т.е. убираемся в 312,5uS аж 2 целых два раза. Правильно ли я иду?
И второй вопрос, люди вот все делают для N выборок так:
Код:
for (int k = 0; k < 1024; k++)
            {
                for (int n = 0; n < 1024; n++)
                {
                    x_real[k] += x_n[n] * Math.Cos( (-2) * Math.PI * k * n / 1024 );
                    x_imag[k] += x_n[n] * Math.Sin( (-2) * Math.PI * k * n / 1024);
                }
                x_Ampl[k] = Math.Sqrt( x_real[k] * x_real[k] + x_imag[k] * x_imag[k] );   
            }


Слушайте, это же дичь какая-то в формулах.
Первое - массивы с реальными и мнимыми частями СПМ наверное следует обнулить перед накоплением в цикле по к. Иначе там датчик случайных чисел получиться.
Второе - под знаком тригонометрической функции должно быть вот так (если говорить про ДПФ или БПФ).

x_real[k] += x_n[n] * Math.Cos( 2* Math.PI * k * n);
x_imag[k] += x_n[n] * Math.Sin( 2 * Math.PI * k * n);
n=0..N-1
k=0..N/2
x_real симметричен относительно точки k=N/2, x_imag антисимметричен относительно точки k=N/2 - их можно не считать, но помнить про них, если потом потребуется обратная операция.
В математическом смысле, следовало бы еще результат (x_Ampl[k]) умножить на величину интервала дискретизации. Обычно это не делают, но про него следует помнить.
Вы расскажите что хотите - может подскажу.
Если речь идет про "изучение", то микроконтроллер этой архитектуры вообще не для этого.

Re: FFT на Си для AVR

Сб сен 17, 2022 18:26:33

Второе - под знаком тригонометрической функции должно быть вот так (если говорить про ДПФ или БПФ).

x_real[k] += x_n[n] * Math.Cos( 2* Math.PI * k * n);
x_imag[k] += x_n[n] * Math.Sin( 2 * Math.PI * k * n);
n=0..N-1
k=0..N/2
x_real симметричен относительно точки k=N/2, x_imag антисимметричен относительно точки k=N/2 - их можно не считать, но помнить про них, если потом потребуется обратная операция.
В математическом смысле, следовало бы еще результат (x_Ampl[k]) умножить на величину интервала дискретизации. Обычно это не делают, но про него следует помнить.
Вы расскажите что хотите - может подскажу.
Если речь идет про "изучение", то микроконтроллер этой архитектуры вообще не для этого.

Eddy_Em и C.H. да я понимаю что АВР-ка не подходит для данного изучения, но пока тренируюсь на ней... Хочу понять как считать Real и Imag, и уже из них угол Fi = arctg(Re/Im) и амплитуду A = sqrt(Re^2 + Im^2), в дальнейшем уже на STM32 уже понять как измеряется емкость и.т.п. У меня нет какого то проекта и STM32 я только начинаю изучать. Поэтому пока позвучал немного теории и вот первое с чем столкнулся изложил выше.
C.H. по поводу примера формул, почему k=0..N/2 и n=0..N-1? где можно об этом прочитать и аргуметировать

Re: FFT на Си для AVR

Сб сен 17, 2022 19:09:40

по поводу примера формул, почему k=0..N/2 и n=0..N-1? где можно об этом прочитать и аргуметировать

Это называется основы ЦОС (Цифровая обработка сигналов).
1. Частота Найквиста (её же определяет теорема Котельникова) - Спектр, сигнала подлежащего преобразованию АЦП должен быть ограничен половиной его частоты дискретизации, ИНАЧЕ наложения спектральных линий друг на друга.
2. k=0..N/2 - это следствие функций синус и косинус. Считать можно, но можно просто взять их отраженную копию относительно точки k=N/2.

И прошу прощения - память моя подвела (этой темой 17 лет не занимался плотно), 1/1024 (исходя из N=1024) должно быть под синусом и косинусом.

Это все можно прочитать в любом букваре по ЦОС. Классика Марпл–мл. С.Л. Цифровой спектральный анализ и его приложения.
Последний раз редактировалось С.Н. Сб сен 17, 2022 19:16:30, всего редактировалось 1 раз.

Re: FFT на Си для AVR

Сб сен 17, 2022 19:15:39

kote52, ну так лучше на ПК и проверять все, а когда уж заработает — переносить код на МК. Только МК, умеющий флоаты и имеющий математический сопроцессор, стоит ой как дорого. Иначе придется искать реализацию простого БПФ в целых числах. Но для спектрального анализа нет смысла БПФ применять: ведь фаза нам не нужна, соответственно, не нужны и комплексные числа. Для этого сгодится ДКП, а косинусы можно таблично вычислять.

Re: FFT на Си для AVR

Сб сен 17, 2022 19:19:51

БПФ на восьмибитке, не умеющей флоаты?
Мде...

да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!

Re: FFT на Си для AVR

Сб сен 17, 2022 19:25:16

Все эти преобразование можно на любом камне считать - они же не потоковые (не реал тайм). Тем более Вы на Си пишете и уж как нибудь float там будет работать. Мой опыт показывает, что само по себе ДПФ нужно лишь как обучалка. В приложениях или уж БПФ или ряд Фурье (гармоники).
Ответить