FFT на Си для AVR
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: FFT на Си для AVR
Я - логарифм. Причём совмещая операцию извлечения корня из суммы квадратов Re и Im на последнем этапе и логарифмизации результата в одну операцию логарифмизации, в этом случае корень и вычислять не нужно, т.к. log(sqrt(R²+I²)) = 0.5*log(R²+I²).
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: FFT на Си для AVR
Прошу пояснить, что такое нормализация и какую цель она преследует.
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
NebelWefer
- Грызет канифоль
- Сообщения: 274
- Зарегистрирован: Чт апр 16, 2009 14:23:59
Re: FFT на Си для AVR
я в целом имел в виду вывод конечного результата на дисплей/матрицу. Сам в данный момент просто принял некое значение за максимум (20 светодиодов), а получаемые значения отображаю пропорционально, получается линейная шкала. Но встречал в разных проектах и логарифмическую, поэтому и спросил
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: FFT на Си для AVR
Вывод в логарифмической шкале интересен, если речь идёт от звуке (в контексте AVR это обычно так и есть). Поскольку у человека шкала слуха логарифмическая, то и результат более оправданно будет выглядеть в этом случае.
Скажем, такой набор мощности звука:
будет воспринимать линейно. И имеет смысл на мощности 16P зажигать именно 5 светодиодов из 8, а не один, как было бы при линейной шкале (16P - как раз одна восьмая из 128P).
Скажем, такой набор мощности звука:
Код: Выделить всё
P, 2P, 4P, 8P, 16P, 32P, 64P, 128Pбудет воспринимать линейно. И имеет смысл на мощности 16P зажигать именно 5 светодиодов из 8, а не один, как было бы при линейной шкале (16P - как раз одна восьмая из 128P).
-
NebelWefer
- Грызет канифоль
- Сообщения: 274
- Зарегистрирован: Чт апр 16, 2009 14:23:59
Re: FFT на Си для AVR
Используете ли Вы усреднение результатов ? Например высчитать 2-3 выборки БФП, а на дисплей вывести средний результат?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: FFT на Си для AVR
Нет. Жалко времени на доп. расчёты. Но поскольку лишнее мельтешение тоже видеть не хочется, применяется другой подход. Значения спектра выводятся в виде столбиков на экран и запоминаются. При следующем показе новых данных, если новый столбик выше предыдущего, он отображается как есть, а если ниже - рисуется старый, уменьшенный на 1. Получается быстрое нарастание, но медленный спад, что выглядит приятно для глаза: http://wiselord.github.io/avr/ampcontrol/
Re: FFT на Си для AVR
Всем добрый вечер подскажите допустим имеем микрофон подключённый к ацп атмеги +лсд . Как можно определить пик частоты ?
Хочется чет наподобие спектрального анализатора .
Хочется чет наподобие спектрального анализатора .
- Вложения
-
- t.JPG
- (55.05 КБ) 509 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: FFT на Си для AVR
Q-ti писал(а):Хочется чет наподобие спектрального анализатора
http://elm-chan.org/works/akilcd/report_e.html
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: FFT на Си для AVR
Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: FFT на Си для AVR
вам хочется, чтобы кто-то за вас сделал то, что вам хочется?Q-ti писал(а):Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму
у вас есть библиотека FFT, которая выдает массив амплитуд частот. неужели вы сами не можете перебрать этот массив и найти в нем наибольшее значение?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: FFT на Си для AVR
Делать за меня ничего не надо просто прошу подсказать по какой формуле высчитать частоту ?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: FFT на Си для AVR
Да вы хоть почитайте про библиотеку и вообще принцип FFT! каждая частота в массиве после FFT имеет фиксированное значение, зависящее от общего количества полос (а оно в свою очередь зависит от размера буфера семплов) и частоты семплирования. Например, при частоте семплирования 32 кГц и размере буфера в 128 семплов вы получите значения амплитуд 64 частот, первая будет иметь частоту 0 Гц (т.е. это будет постоянная составляющая) вторая 250 Гц, третья 500 Гц и так далее с шагом 250 Гц, последняя 64-я будет, как вы можете догадаться 15750 Гц.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: FFT на Си для AVR
Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги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 выборок так:
а для одной выборки получатся следующее?:
и можно ли ограничиться одной выборкой(семплом),а не 32?
И второй вопрос, люди вот все делают для 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] );- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: FFT на Си для AVR
БПФ на восьмибитке, не умеющей флоаты?
Мде...
Мде...
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: FFT на Си для AVR
[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 выборок так:[/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]) умножить на величину интервала дискретизации. Обычно это не делают, но про него следует помнить.
Вы расскажите что хотите - может подскажу.
Если речь идет про "изучение", то микроконтроллер этой архитектуры вообще не для этого.
И второй вопрос, люди вот все делают для 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]) умножить на величину интервала дискретизации. Обычно это не делают, но про него следует помнить.
Вы расскажите что хотите - может подскажу.
Если речь идет про "изучение", то микроконтроллер этой архитектуры вообще не для этого.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Re: FFT на Си для AVR
[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? где можно об этом прочитать и аргуметировать
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? где можно об этом прочитать и аргуметировать
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: FFT на Си для AVR
[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) должно быть под синусом и косинусом.
Это все можно прочитать в любом букваре по ЦОС. Классика Марпл–мл. С.Л. Цифровой спектральный анализ и его приложения.
Это называется основы ЦОС (Цифровая обработка сигналов).
1. Частота Найквиста (её же определяет теорема Котельникова) - Спектр, сигнала подлежащего преобразованию АЦП должен быть ограничен половиной его частоты дискретизации, ИНАЧЕ наложения спектральных линий друг на друга.
2. k=0..N/2 - это следствие функций синус и косинус. Считать можно, но можно просто взять их отраженную копию относительно точки k=N/2.
И прошу прощения - память моя подвела (этой темой 17 лет не занимался плотно), 1/1024 (исходя из N=1024) должно быть под синусом и косинусом.
Это все можно прочитать в любом букваре по ЦОС. Классика Марпл–мл. С.Л. Цифровой спектральный анализ и его приложения.
Последний раз редактировалось С.Н. Сб сен 17, 2022 19:16:30, всего редактировалось 1 раз.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: FFT на Си для AVR
kote52, ну так лучше на ПК и проверять все, а когда уж заработает — переносить код на МК. Только МК, умеющий флоаты и имеющий математический сопроцессор, стоит ой как дорого. Иначе придется искать реализацию простого БПФ в целых числах. Но для спектрального анализа нет смысла БПФ применять: ведь фаза нам не нужна, соответственно, не нужны и комплексные числа. Для этого сгодится ДКП, а косинусы можно таблично вычислять.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: FFT на Си для AVR
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4290438#p4290438"]БПФ на восьмибитке, не умеющей флоаты?
Мде...[/uquote]
да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!
Мде...[/uquote]
да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: FFT на Си для AVR
Все эти преобразование можно на любом камне считать - они же не потоковые (не реал тайм). Тем более Вы на Си пишете и уж как нибудь float там будет работать. Мой опыт показывает, что само по себе ДПФ нужно лишь как обучалка. В приложениях или уж БПФ или ряд Фурье (гармоники).
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"