FFT на Си для AVR
Я - логарифм. Причём совмещая операцию извлечения корня из суммы квадратов Re и Im на последнем этапе и логарифмизации результата в одну операцию логарифмизации, в этом случае корень и вычислять не нужно, т.к. log(sqrt(R²+I²)) = 0.5*log(R²+I²).
- Реклама
Прошу пояснить, что такое нормализация и какую цель она преследует.
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?
Я как-то традиционно после FFT корень из суммы квадратов Re и Im гармоник вычислял и все. А логарифм... зачем? В чем смысл?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 274
- Зарегистрирован: Чт апр 16, 2009 14:23:59
я в целом имел в виду вывод конечного результата на дисплей/матрицу. Сам в данный момент просто принял некое значение за максимум (20 светодиодов), а получаемые значения отображаю пропорционально, получается линейная шкала. Но встречал в разных проектах и логарифмическую, поэтому и спросил
Вывод в логарифмической шкале интересен, если речь идёт от звуке (в контексте AVR это обычно так и есть). Поскольку у человека шкала слуха логарифмическая, то и результат более оправданно будет выглядеть в этом случае.
Скажем, такой набор мощности звука:
будет воспринимать линейно. И имеет смысл на мощности 16P зажигать именно 5 светодиодов из 8, а не один, как было бы при линейной шкале (16P - как раз одна восьмая из 128P).
Скажем, такой набор мощности звука:
Код: Выделить всё
P, 2P, 4P, 8P, 16P, 32P, 64P, 128P- Сообщения: 274
- Зарегистрирован: Чт апр 16, 2009 14:23:59
Используете ли Вы усреднение результатов ? Например высчитать 2-3 выборки БФП, а на дисплей вывести средний результат?
- Реклама
Нет. Жалко времени на доп. расчёты. Но поскольку лишнее мельтешение тоже видеть не хочется, применяется другой подход. Значения спектра выводятся в виде столбиков на экран и запоминаются. При следующем показе новых данных, если новый столбик выше предыдущего, он отображается как есть, а если ниже - рисуется старый, уменьшенный на 1. Получается быстрое нарастание, но медленный спад, что выглядит приятно для глаза: http://wiselord.github.io/avr/ampcontrol/
Всем добрый вечер подскажите допустим имеем микрофон подключённый к ацп атмеги +лсд . Как можно определить пик частоты ?
Хочется чет наподобие спектрального анализатора .
Хочется чет наподобие спектрального анализатора .
- Вложения
-
- t.JPG
- (55.05 КБ) 513 скачиваний
http://elm-chan.org/works/akilcd/report_e.htmlQ-ti писал(а):Хочется чет наподобие спектрального анализатора
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму .
вам хочется, чтобы кто-то за вас сделал то, что вам хочется?Q-ti писал(а):Спасибо видел но немного не то , хотелось бы выводить только цифры , пиковую частоту в Гц .
Я так понимаю это то что мне нужно но по какой формуле высчитать эту частоту не пойму
у вас есть библиотека FFT, которая выдает массив амплитуд частот. неужели вы сами не можете перебрать этот массив и найти в нем наибольшее значение?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Делать за меня ничего не надо просто прошу подсказать по какой формуле высчитать частоту ?
Да вы хоть почитайте про библиотеку и вообще принцип FFT! каждая частота в массиве после FFT имеет фиксированное значение, зависящее от общего количества полос (а оно в свою очередь зависит от размера буфера семплов) и частоты семплирования. Например, при частоте семплирования 32 кГц и размере буфера в 128 семплов вы получите значения амплитуд 64 частот, первая будет иметь частоту 0 Гц (т.е. это будет постоянная составляющая) вторая 250 Гц, третья 500 Гц и так далее с шагом 250 Гц, последняя 64-я будет, как вы можете догадаться 15750 Гц.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 120
- Зарегистрирован: Пт мар 19, 2021 08:58:45
Мужики пытаюсь въехать в ДПФ. поэтому подниму эту тему, она как раз подходит. У меня вопрос по поводу настройки периферии атмеги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] );- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
[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 (МПСЗ)"
- Сообщения: 120
- Зарегистрирован: Пт мар 19, 2021 08:58:45
[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? где можно об этом прочитать и аргуметировать
[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 (МПСЗ)"
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
kote52, ну так лучше на ПК и проверять все, а когда уж заработает — переносить код на МК. Только МК, умеющий флоаты и имеющий математический сопроцессор, стоит ой как дорого. Иначе придется искать реализацию простого БПФ в целых числах. Но для спектрального анализа нет смысла БПФ применять: ведь фаза нам не нужна, соответственно, не нужны и комплексные числа. Для этого сгодится ДКП, а косинусы можно таблично вычислять.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4290438#p4290438"]БПФ на восьмибитке, не умеющей флоаты?
Мде...[/uquote]
да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!
Мде...[/uquote]
да ты задрал уже со своими дебильными замечаниями! хоть что-то в мире, кроме собственного я, ты уважаешь?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Все эти преобразование можно на любом камне считать - они же не потоковые (не реал тайм). Тем более Вы на Си пишете и уж как нибудь float там будет работать. Мой опыт показывает, что само по себе ДПФ нужно лишь как обучалка. В приложениях или уж БПФ или ряд Фурье (гармоники).
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"


