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

Интерполяция на микроконтроллере

Столкнулся с такой задачей: Есть АЦП с частотой дискретизации 8 кГц - задан жестко. Есть микроконтроллер, работающий на частоте 120 МГц - тоже задан жестко. Частота сигнала - частота сети 50 Гц. Т.е. после АЦП на микроконтроллер идут 160 отсчетов на 1 период сигнала. Далее на 10 периодах применяется БПФ на 1024 отсчета (тут БПФ не рассматривается, уже реализовано).

 

Собственно в чем весь вопрос: Какой именно вид интерполяции применить лучше всего (есть линейная, квадратичная, кубическими сплайнами, полиномы Лагранжа и прочее)? Ведь необходимо из 1600 отсчетов сделать 1024 - по-любому необходима интерполяция. И еще необходимо обеспечить точность - в идеале около 1%.

 

И еще один момент - всё это делается на микроконтроллере, т.е. потом все эти алгоритмы будут преобразованы в код на C++.

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


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

Ведь необходимо из 1600 отсчетов сделать 1024 - по-любому необходима интерполяция.

Нет такой необходимости.

 

Берёте 1600 отсчетов, умножаете их на оконную функцию (исходя из N = 1600). Дополняете массив нулями до размера 2048. Дальше БПФ.

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


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

Гость TSerg

1. Зачем Вам интерполяция на 10 периодах? Делайте на одном.

2. Почему нужно переходить от 160 отсчетов к 128 (к примеру)?

3. Цель интерполяции?

5. Погрешности по видам интерполяции считаются или моделируются - это не большая сложность.

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


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

Собственно в чем весь вопрос: Какой именно вид интерполяции применить лучше всего (есть линейная, квадратичная, кубическими сплайнами, полиномы Лагранжа и прочее)? Ведь необходимо из 1600 отсчетов сделать 1024 - по-любому необходима интерполяция. И еще необходимо обеспечить точность - в идеале около 1%.

Всегда думал, что интерполяция - это вычисление новых отсчетов, но преобразование 1600 в 1024 отсчета - это вроде как уменьшение числа отсчетов, разве нет? Тогда это уже не интерполяция, а децимация.

Изменено пользователем sqrt(2)

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


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

Всегда думал, что интерполяция - это вычисление новых отсчетов, но преобразование 1600 в 1024 отсчета - это вроде как уменьшение числа отсчетов, разве нет? Тогда это уже не интерполяция, а децимация.

В данном случае топикстартер желает изменить частоту дискретизации. Для этого потребуется и то и другое.

Тоже не вижу необходимости. Делать БПФ по 1024 отсчетам. А что частоты не "круглые" получаются, так не великая беда. Может, результаты интерполировать, чтобы красивые графики рисовать?

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


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

Нет такой необходимости.

 

Берёте 1600 отсчетов, умножаете их на оконную функцию (исходя из N = 1600). Дополняете массив нулями до размера 2048. Дальше БПФ.

 

 

Да, но если добивать нулями, то сильно искажается спектр и тогда оценить уровень гармоник не представляется возможным. К тому же БПФ на 2048 точек уже становится слишком ресурсоемким, даже на Cortex-M4F. Но за идею спасибо.

 

1. Зачем Вам интерполяция на 10 периодах? Делайте на одном.

2. Почему нужно переходить от 160 отсчетов к 128 (к примеру)?

3. Цель интерполяции?

5. Погрешности по видам интерполяции считаются или моделируются - это не большая сложность.

 

 

1. Ибо БПФ согласно ГОСТ нужно считать именно на 10 периодах. На самом деле не БПФ, а гармоники нужно считать на 10 периодах, поэтому такое условие.

2. Вот и получается, что необходима передискретизация с 1600 отсчетов на 1024 отсчета.

3. Вот как раз и цель интерполяции - пункт 2.

4. А погрешность - согласен, можно легко промодилеровать.

 

Вот мне и хотелось узнать как это делается сейчас и какие есть варианты решения проблемы.

 

В данном случае топикстартер желает изменить частоту дискретизации. Для этого потребуется и то и другое.

Тоже не вижу необходимости. Делать БПФ по 1024 отсчетам. А что частоты не "круглые" получаются, так не великая беда. Может, результаты интерполировать, чтобы красивые графики рисовать?

 

 

Если немного уйти от темы, то в общем случае на вход АЦП идет ослабленный сигнал электрической сети. АЦП на 8 кГц, как я уже говорил. Данные с АЦП приходят в микроконтроллер. И задача стоит в том, чтобы оценить уровень гармоник вплоть до 50. И вот одно из решение: Так как частота сети плавает, то применить интерполяцию и получить 1024 отсчета и далее БПФ и вот они гармоники.

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


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

Поправьте меня, если я что-то не правильно говорю:

 

Полифазный фильтр действует примерно так:

 

Сначала мы увеличиваем частоту дискретизации в М раз - т.е. интерполируем сигнал.

Затем прореживаем до нужного нам количества отсчетов, т.е. откидываем ненужные, т.е. производим децимацию сигнала?

 

Не искажается ли спектр после отбрасывания отсчетов?

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


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

Поправьте меня, если я что-то не правильно говорю:

 

Полифазный фильтр действует примерно так:

 

Сначала мы увеличиваем частоту дискретизации в М раз - т.е. интерполируем сигнал.

Затем прореживаем до нужного нам количества отсчетов, т.е. откидываем ненужные, т.е. производим децимацию сигнала?

 

Не искажается ли спектр после отбрасывания отсчетов?

Конечно искажается. Чтобы этих искажений не было в итоговом сигнале в полифазном фильтре (неожиданно) есть фильтр, который защищает от наложений.

Изменено пользователем sqrt(2)

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


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

Конечно искажается. Чтобы этих искажений не было в итоговом сигнале в полифазном фильтре (неожиданно) есть фильтр, который защищает от наложений.

 

Тогда совсем глупый вопрос: И всё это дело можно организовать программным образом на микроконтроллере? Если да, можете подсказать пару методов или алгоритмов. Пожалуйста.

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


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

Столкнулся с такой задачей: Есть АЦП с частотой дискретизации 8 кГц - задан жестко. Есть микроконтроллер, работающий на частоте 120 МГц - тоже задан жестко. Частота сигнала - частота сети 50 Гц. Т.е. после АЦП на микроконтроллер идут 160 отсчетов на 1 период сигнала. Далее на 10 периодах применяется БПФ на 1024 отсчета (тут БПФ не рассматривается, уже реализовано).

 

Собственно в чем весь вопрос: Какой именно вид интерполяции применить лучше всего (есть линейная, квадратичная, кубическими сплайнами, полиномы Лагранжа и прочее)? Ведь необходимо из 1600 отсчетов сделать 1024 - по-любому необходима интерполяция. И еще необходимо обеспечить точность - в идеале около 1%.

лагранжем проще по сравнению с кубическими сплайнами, не надо по всем данным от начала до конца бегать туда/сюда чтобы граничные условия выполнить, можно на лету делать.

http://ru.dsplib.org/content/resampling_lagrange.html

но для 1% при 160 точках на период и линейная интерполяция возможно вполне сгодится, хотя для 20й гармоники останется только 8 точек на период что уже маловато будет.

 

ну и добивание сигнала нулями спектр вообще-то не портит, от того что 0 умножают на синус/косинус и интегрируют результат не меняется.

сетка частот съедет, но и так у вас 8кГц и 1024 отчёта = 7.8125Гц в 50Гц не особо попадают.

https://electronix.ru/forum/index.php?s=&am...t&p=1452224

если не хочется делать по 2048 точкам, берите 6 периодов и добивайте нулями до 1024.

 

про БПФ: вместо всего спектра и 1024 отсчётов, если нужны только гармоники 50Гц, то ДПФ только для этих нескольких частот может оказаться быстрее.

БПФ грубо говоря 100 тактов на отсчёт - 100 000 тактов для вычисления спектра. + оконная функция + передискретизация, но это мелочи по сравнению с самим БПФ, ещё %10 сверху.

а ДПФ, особенно если Герцелем без тригонометрии - несколько тактов на отсчёт. до ~20 гармоник выигрыша от БПФ нет, плюс считать можно налету без буферизации данных вообще.

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


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

Тогда совсем глупый вопрос: И всё это дело можно организовать программным образом на микроконтроллере? Если да, можете подсказать пару методов или алгоритмов. Пожалуйста.

Можно. Сам правда не делал (в смысле на МК не делал). Точно есть в Лайонсе и что-то было в книге Айчифер, Джервис "Цифровая обработка сигналов: практический подход".

Изменено пользователем sqrt(2)

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


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

про БПФ: вместо всего спектра и 1024 отсчётов, если нужны только гармоники 50Гц, то ДПФ только для этих нескольких частот может оказаться быстрее.

БПФ грубо говоря 100 тактов на отсчёт - 100 000 тактов для вычисления спектра. + оконная функция + передискретизация, но это мелочи по сравнению с самим БПФ, ещё %10 сверху.

а ДПФ, особенно если Герцелем без тригонометрии - несколько тактов на отсчёт. до ~20 гармоник выигрыша от БПФ нет, плюс считать можно налету без буферизации данных вообще.

 

Как раз на 10 периодах и получается максимум до 50 гармоники - я это уже моделировал и код писал в IAR - всё работает, БПФ на 1024 считает четко, погрешность очень маленькая и как раз до 50 гармоники.

 

Ведь частота сети плавает, хоть это и считается медленно меняющимся параметром, в связи с чем меняется и количество отсчетов на 10 периодов (Почему именно 10? ГОСТ 30804.4.30 - 2013). 1600 отсчетов - идеализированный случай. Будь частота 48, отсчетов будет уже 1667 на 10 периодов. К чему я это - получить 1024 из плавающих 1600 - сможет ли Герцель с таким справиться? И уложиться в 2.5 - 3 мс.

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


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

Как раз на 10 периодах и получается максимум до 50 гармоники

сверху гармоники ограничены частотой дисктеризации, а не временем измерения.

и еще раз, 8кГц и 1024 точки даёт разрешение по частоте 7.8125 Гц, что в 50Гц нацело не очень попадает и для первых гармоник, значительную часть от 1% ошибки можно в это месте легко собрать.

 

К чему я это - получить 1024 из плавающих 1600 - сможет ли Герцель с таким справиться? И уложиться в 2.5 - 3 мс.

Герцель ничего не интерполирует, это и есть дискретное (обычное, не быстрое) преборазование Фурье (F(w)=\int{f(t)*cos[sin](wt)dt}), где вычисление тригонометрии(sin/cos) заменено цифровым осциллятором (одно умножение и сложение), но его, в отличии от БПФ который даёт весь спектр сразу, не обязательно считать для всех 1024 частот, можно посчитать только на тех 50ти частотах которые интересны, ну и длина выборки любая, степенью 2 не ограничена.

 

10 периодов это 200мс, а вычислить надо за 3мс?

120МГц и 3мс это 360000 тактов, или 350 тактов на отсчёт для 1024 точек.

или 7 тактов на отсчёт если считать для 50 частот.

Герцелю надо умножение, пару сложений, на отсчёт для одной частоты, в семь тактов если и уложится, то на пределе.

так что для 50 и больше частот БПФ, который выдаёт спектр целиком будет пожалуй побыстрее.

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


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

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

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

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

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

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

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

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

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

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