Страница 8 из 10
Re: FFT на Си для AVR
Добавлено: Ср май 03, 2017 21:15:41
WiseLord
Я - логарифм. Причём
совмещая операцию извлечения корня из суммы квадратов Re и Im на последнем этапе и логарифмизации результата в одну операцию логарифмизации, в этом случае корень и вычислять не нужно, т.к. log(sqrt(R²+I²)) = 0.5*log(R²+I²).
Re: FFT на Си для AVR
Добавлено: Чт май 04, 2017 06:23:27
ARV
Прошу пояснить, что такое нормализация и какую цель она преследует.
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?
Re: FFT на Си для AVR
Добавлено: Чт май 04, 2017 07:57:28
NebelWefer
я в целом имел в виду вывод конечного результата на дисплей/матрицу. Сам в данный момент просто принял некое значение за максимум (20 светодиодов), а получаемые значения отображаю пропорционально, получается линейная шкала. Но встречал в разных проектах и логарифмическую, поэтому и спросил
Re: FFT на Си для AVR
Добавлено: Чт май 04, 2017 10:43:45
WiseLord
Вывод в логарифмической шкале интересен, если речь идёт от звуке (в контексте AVR это обычно так и есть). Поскольку у человека шкала слуха логарифмическая, то и результат более оправданно будет выглядеть в этом случае.
Скажем, такой набор мощности звука:
будет воспринимать линейно. И имеет смысл на мощности 16P зажигать именно 5 светодиодов из 8, а не один, как было бы при линейной шкале (16P - как раз одна восьмая из 128P).
Re: FFT на Си для AVR
Добавлено: Пт май 05, 2017 20:41:21
NebelWefer
Используете ли Вы усреднение результатов ? Например высчитать 2-3 выборки БФП, а на дисплей вывести средний результат?
Re: FFT на Си для AVR
Добавлено: Пт май 05, 2017 22:01:56
WiseLord
Нет. Жалко времени на доп. расчёты. Но поскольку лишнее мельтешение тоже видеть не хочется, применяется другой подход. Значения спектра выводятся в виде столбиков на экран и запоминаются. При следующем показе новых данных, если новый столбик выше предыдущего, он отображается как есть, а если ниже - рисуется старый, уменьшенный на 1. Получается быстрое нарастание, но медленный спад, что выглядит приятно для глаза:
http://wiselord.github.io/avr/ampcontrol/
Re: FFT на Си для AVR
Добавлено: Ср дек 20, 2017 21:57:28
Q-ti
Всем добрый вечер подскажите допустим имеем микрофон подключённый к ацп атмеги +лсд . Как можно определить пик частоты ?
Хочется чет наподобие спектрального анализатора .
Re: FFT на Си для AVR
Добавлено: Чт дек 21, 2017 06:55:31
ARV
Q-ti писал(а):Хочется чет наподобие спектрального анализатора
http://elm-chan.org/works/akilcd/report_e.html
Re: FFT на Си для AVR
Добавлено: Пт дек 22, 2017 18:29:34
Q-ti
Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .
Re: FFT на Си для AVR
Добавлено: Пт дек 22, 2017 18:37:48
ARV
Q-ti писал(а):Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму
вам хочется, чтобы кто-то за вас сделал то, что вам хочется?
у вас есть библиотека FFT, которая выдает массив амплитуд частот. неужели вы сами не можете перебрать этот массив и найти в нем наибольшее значение?
Re: FFT на Си для AVR
Добавлено: Пт дек 22, 2017 18:58:21
Q-ti
Делать за меня ничего не надо просто прошу подсказать по какой формуле высчитать частоту ?
Re: FFT на Си для AVR
Добавлено: Пт дек 22, 2017 20:30:56
ARV
Да вы хоть почитайте про библиотеку и вообще принцип FFT! каждая частота в массиве после FFT имеет фиксированное значение, зависящее от общего количества полос (а оно в свою очередь зависит от размера буфера семплов) и частоты семплирования. Например, при частоте семплирования 32 кГц и размере буфера в 128 семплов вы получите значения амплитуд 64 частот, первая будет иметь частоту 0 Гц (т.е. это будет постоянная составляющая) вторая 250 Гц, третья 500 Гц и так далее с шагом 250 Гц, последняя 64-я будет, как вы можете догадаться 15750 Гц.
Re: FFT на Си для AVR
Добавлено: Сб сен 17, 2022 13:52:50
kote52
Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги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
Eddy_Em
БПФ на восьмибитке, не умеющей флоаты?
Мде...
Re: FFT на Си для AVR
Добавлено: Сб сен 17, 2022 17:32:54
С.Н.
[uquote="kote52",url="/forum/viewtopic.php?p=4290388#p4290388"]Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги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] );
}
[/uquote]
Слушайте, это же дичь какая-то в формулах.
Первое - массивы с реальными и мнимыми частями СПМ наверное следует обнулить перед накоплением в цикле по к. Иначе там датчик случайных чисел получиться.
Второе - под знаком тригонометрической функции должно быть вот так (если говорить про ДПФ или БПФ).
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
kote52
[uquote="С.Н.",url="/forum/viewtopic.php?p=4290482#p4290482"]Второе - под знаком тригонометрической функции должно быть вот так (если говорить про ДПФ или БПФ).
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]) умножить на величину интервала дискретизации. Обычно это не делают, но про него следует помнить.
Вы расскажите что хотите - может подскажу.
Если речь идет про "изучение", то микроконтроллер этой архитектуры вообще не для этого.[/uquote]
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
С.Н.
[uquote="kote52",url="/forum/viewtopic.php?p=4290500#p4290500"]по поводу примера формул, почему k=0..N/2 и n=0..N-1? где можно об этом прочитать и аргуметировать[/uquote]
Это называется основы ЦОС (Цифровая обработка сигналов).
1. Частота Найквиста (её же определяет теорема Котельникова) - Спектр, сигнала подлежащего преобразованию АЦП должен быть ограничен половиной его частоты дискретизации, ИНАЧЕ наложения спектральных линий друг на друга.
2. k=0..N/2 - это следствие функций синус и косинус. Считать можно, но можно просто взять их отраженную копию относительно точки k=N/2.
И прошу прощения - память моя подвела (этой темой 17 лет не занимался плотно), 1/1024 (исходя из N=1024) должно быть под синусом и косинусом.
Это все можно прочитать в любом букваре по ЦОС. Классика Марпл–мл. С.Л. Цифровой спектральный анализ и его приложения.
Re: FFT на Си для AVR
Добавлено: Сб сен 17, 2022 19:15:39
Eddy_Em
kote52, ну так лучше на ПК и проверять все, а когда уж заработает — переносить код на МК. Только МК, умеющий флоаты и имеющий математический сопроцессор, стоит ой как дорого. Иначе придется искать реализацию простого БПФ в целых числах. Но для спектрального анализа нет смысла БПФ применять: ведь фаза нам не нужна, соответственно, не нужны и комплексные числа. Для этого сгодится ДКП, а косинусы можно таблично вычислять.
Re: FFT на Си для AVR
Добавлено: Сб сен 17, 2022 19:19:51
ARV
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4290438#p4290438"]БПФ на восьмибитке, не умеющей флоаты?
Мде...[/uquote]
да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!
Re: FFT на Си для AVR
Добавлено: Сб сен 17, 2022 19:25:16
С.Н.
Все эти преобразование можно на любом камне считать - они же не потоковые (не реал тайм). Тем более Вы на Си пишете и уж как нибудь float там будет работать. Мой опыт показывает, что само по себе ДПФ нужно лишь как обучалка. В приложениях или уж БПФ или ряд Фурье (гармоники).