Перейти к содержанию
    

Есть необходимость оценить производительность STM32F429 для оцифровки аналогового сигнала 400Гц. Измерение нужно производить до 40 гармоники, то есть, полоса оцифровываемых частот от 0 до 16кГц.

Как правильно оценить статические (объем требуемой памяти Flash, RAM) и динамические (частота МК, либо, что более корректно - максимальное время расчета FFT до обслуживания следующего накопленного сигнала).

До этого не писал FFT для МК, хотя и представляю как оно приблизительно работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если грубо, то ~100 тактов на отсчёт. причем c FPU вроде даже быстрее чем целочисленный.

то есть при 100кГц АЦП надо 5-10МГц.

память зависит от длины выборки.

и для 40 гармоник можно вообще Герцелем посчитать, ему вообще память не нужна, даже под буфер, и не особо медленнее получится, в несколько раз всего.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте стандартную библиотеку CMSIS DSP Lib.

Например на stm32f373 я использовал комплексное БПФ на 4096 точек

(правда на фиксированной точке int16_t ввиду ограничения ОЗУ),

все вычисления выполнялись менее чем за 10 мс.

А по объему ОЗУ, все просто, например

для комплексного БПФ c типом данных float и длиной 1024,

получаем 2 * 4 * 1024 = 8192 байта.

Изменено пользователем ivan24190

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть некоторый диссонанс в мозгу :laughing:

Итак, есть сигнал с основной частотой 400Гц. Измерять требуется до 40-й гармоники. Итого полоса измеряемого сигнала 400Гц*40 = 16кГц.

Я хочу получить набор дискретных спектральных составляющих с частотным разрешением в 1Гц. Таким образом, время накопления сигнала должно быть равно 1с (ведь частотное разрешение зависит только от времени накопления (так ли это?)).

Количество точек (элементов в результирующем массиве спектральных составляющих (амплитуда, фаза)) равно (полоса частот/частотное разрешение) 16кГц/1Гц = 16000 точек. Действительное значение длины БПФ будет 16384 точки (согласно фундаментальным особенностям механизма БПФ), но сейчас опустим этот момент.

 

А вот теперь у меня непонимание: допустим я (согласно теореме Котельникова) семплирую сигнал с частотой 16кГц*2 = 32кГц, то количество отсчетов для 16000-точечного БПФ составляет 32000. Тут все ясно. Но ведь семплировать желательно с более высокой частотой, нежели Fsignal*2. Допустим, буду семплировать с частотой Fsignal*8. Соответственно, за 1с накопления у меня в буфере будет 16кГц*8 = 128000 выборок сигнала. И вот как мне их подавать на вход 16000-точечного БПФ? Ведь для 16000-точечного БПФ по определению требуется лишь 32000 отсчетов сигнала? Куда остальные (128000 - 32000) выборки девать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь семплировать желательно с более высокой частотой, нежели Fsignal*2

Куда остальные (128000 - 32000) выборки девать?

Вот здесь Вы сами себе противоречите. Зачем более высотая частота выборки? Если хотите спектр точнее 1 Гц - делаете более длинный FFT. Во всех остальных случаях - это лишние данные. Заниматься дополнительным усреднением перед FFT - занятие неблагодарное и приводящее к интересным артефактам. Если хотите получить более высокую точность по амплитуде спектра - не увеличивайте частоту, а сделайте больше выборок и считайте спектр с перекрытием - это позволит не пропустить изменения сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И желательно померять время на БПФ (целый и плавающий) на 32000 точек.

Для начала можно готовыми функциями из CMSIS DSP.

Если будет < 1 сек - поставите в церкве свечку (ну или что-то другое).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CMSIS DSP Lib не поддерживает БПФ больше 4096 точек.

Поэтому придется искать обходные пути.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем более высокая частота выборки?

Известно, зачем. Чтобы упростить аналоговый фильтр на входе АЦП.

 

Заниматься дополнительным усреднением перед FFT - занятие неблагодарное и приводящее к интересным артефактам.

Вполне благодарное занятие. У него есть даже специальное название - децимация.

 

Полифазный цифровой ФНЧ достаточно высокого порядка в котором делают децимацию, вместе с дешевым аналоговым ФНЧ низкого порядка на входе АЦП, позволяет в итоге получить более качественный и дешевый фильтр на входе БПФ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем более высотая частота выборки? Если хотите спектр точнее 1 Гц - делаете более длинный FFT.

чтобы иметь 1Гц разрешения спектра надо накопить 1с данных. а если в данных интересна частота 16кГц, то чтобы её нормально оцифровать и не городить очень страшные аналоговые фильтры перед АЦП, частоту АЦП придётся хотя бы раз в 5 задрать.

но сотня кГц и 1с == 100к отсчётов, можно уже легко в количество доступной памяти в МК для FFT упереться.

но если нужны именно определённые гармоники, а не весь спектр с разрешением 1Гц, то можно сначала автокорреляцией точно найти частоту основной гармоники, или вообще держать через цифровой ФАПЧ основную гармонику, а потом считать обычное небыстрое преобразование Фурье но только на заданных сорока частотах. получится немного медленнее чем через FFT, но зато и памяти для этого не надо совсем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чтобы иметь 1Гц разрешения спектра надо накопить 1с данных. а если в данных интересна частота 16кГц, то чтобы её нормально оцифровать и не городить очень страшные аналоговые фильтры перед АЦП, частоту АЦП придётся хотя бы раз в 5 задрать.

но сотня кГц и 1с == 100к отсчётов, можно уже легко в количество доступной памяти в МК для FFT упереться.

но если нужны именно определённые гармоники, а не весь спектр с разрешением 1Гц, то можно сначала автокорреляцией точно найти частоту основной гармоники, или вообще держать через цифровой ФАПЧ основную гармонику, а потом считать обычное небыстрое преобразование Фурье но только на заданных сорока частотах. получится немного медленнее чем через FFT, но зато и памяти для этого не надо совсем.

 

Вот я о том же говорю, допустим я получил эти 100к осчетов, поставлю внешнюю SDRAM и сохраню туда. Но дальше что мне с ними делать? Ведь По расчетам FFT 16к получилось, а точек оцифровали аж 100к. Для 16к FFT надо 32к отсчетов. А у меня 100к - оверсемплинг получился. Что, децимацию делать (прореживать выборки)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ведь По расчетам FFT 16к получилось, а точек оцифровали аж 100к. Для 16к FFT надо 32к отсчетов.

Значит считать надо спектр не до 16к, а до соответственно в 3 раза больше, лишнее потом откинете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но дальше что мне с ними делать? Ведь По расчетам FFT 16к получилось, а точек оцифровали аж 100к.

по каким расчётам?

если нужно разрешение 1Гц значит время накопления (неважно на какой частоте) должно быть 1с.

хотите нормально увидеть гармоники на 16кГц и чтобы aliasing не мешал, цифруйте хотя бы с 100кГц.

100кГц * 1с = 100к отсчётов, соответственно и Фурье надо делать такой же длины.

если с частотой 100кГц набрать только 16к точек (за 160мс) и сделать по ним Фурье, разрешение по частоте будет 6Гц.

если набрать 1с с частотой выборок 16к и сделать Фурье от этих 16к точек, будет разрешение 1Гц, но частоты до 8кГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну да, так я и понял. Спасибо.

И, думаю, последний вопрос: в тех же STM32 есть DSP-ядро, которое может помочь в расчете FFT. Те примеры, которые выпустила сама STMicroelectronics, если мне не изменят память, до 4096 FFT.

Возможно ли как-то объединить FFT 4096 для, скажем, кратного увеличения длины FFT, например, для FFT 16384?

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что, децимацию делать (прореживать выборки)?

Да, именно так. После децимации у вас останется 32768 вещественных(!) семпла. Делаете БПФ от 16384 комплексных(!) семплов и находите нужные вам частоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...