[uquote="TripleKill",url="/forum/viewtopic.php?p=3900419#p3900419"]Компилятор, конечно, использует возможности контроллера в части вычисления квадратного корня, но все равно достаточно долго. Один из вариантов, не относящихся чисто к математике - это затабулировать синусы и косинусы[/uquote]
Это "шуткатакой"?
Вы всерьез считаете синусы-косинусы аналитически? Милостивый государь, забудьте как дурной сон аналитические выражения ДПФ из учебника, патамушта при реализации в реальной программе нужно понимать откуда и как процессор извлекает данные и куда он их потом размещает. Нужно понимать размерность операндов и результата, чтобы потом не искать ресурсы на простейшие вычисления.
Итак.
1. Расчет фильтров ДПФ лучше (и нужно) осуществлять в формате fixed-point.
2. Коэффициенты ДПФ (те самые синусы и косинусы) должны быть константами во флеше.
3. Извлечение корня придется написать самому, иначе компилятор потребует флоаты. Тем более, что извлечение целочисленного корня совсем не ресурсоемкая функция. Могу предложить метод последовательных приближений, когда число итераций будет равно разрядности результата. Метод дает максимально точный результат ограниченный только заданной разрядностью.
4. К сожалению, АРМы не имеют trueDSP инструкций, поэтому адресация операндов при накоплении произведений потребует отдельных инструкций цикла.
Полоса 125 Гц потребует накопления массива сигнала в течении 8 мс. То есть с учетом частоты Найквиста и возможностей реализации антиалиасинга это будет не менее 4096 отсчетов.
Добавлено after 14 minutes 45 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=3900427#p3900427"]а не БПФ[/uquote]
Автор темы ни словом не заикнулся про БПФ. Разговор шел о ДПФ.
Добавлено after 19 minutes 27 seconds:
[uquote="TripleKill",url="/forum/viewtopic.php?p=3900419#p3900419"]Для заданной частоты вычисляется номер гармоники, и далее только для этой гармоники производится сложение с накоплением.[/uquote]
А вот тут есть некоторая проблема.
Дело в том, что фильтр ДПФ можно вычислять только один, если частота дискретизации сигнала кратна центральной частоте фильтра. Это значит, что все будет совсем просто, если частота сигнала будет известна ДО ТОГО, как будет запущено накопление массива. Так можно запустить преобразование на х4 или х8 частоте сигнала (фильтра) и вся "таблица" синусов-косинусов станет предельно примитивной. Для х4 эта таблица будет иметь всего 4 значения для каждой функции. Например в формате int16_t - cos = {0x7FFF, 0, 0x8000, 0}. Это и есть fixed-point: 0x7FFF = 0,9999695 0x8000 = -1
Добавлено after 16 minutes 33 seconds:
[uquote="TripleKill",url="/forum/viewtopic.php?p=3900419#p3900419"]В текущем варианте она так и вычисляется.[/uquote]
Только что заметил. Корень квадратный из суммы квадратов Real и Imaginary - это У ВАС вычисление амплитуды В ОДНОМ фильтре. Чтобы найти амплитуду сигнала попавшего между фильтрами, нужно сложить квадраты амплитуд ДВУХ фильтров и только потом извлечь корень.