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

Rion

Участник
  • Постов

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

607 просмотров профиля
  1. Проблем с памятью или кешем нет - в МК есть место, где можно хранить сигнал и коэффициенты. Поэтому для меня в предпоследнюю очередь играет роль то, сколько программа потребует места для выполнения и для хранения данных. Важнее - скорость и точность. Насколько я понял, в фильтре Фарроу присутствует кусочно-полиномиальная интерполяция. Так тогда можно обойтись и без фильтра, а напрямую посчитать кусочно-полиномиальную интерполяцию для моего случая. Хотя, есть подозрения, что придется накладывать оконную функцию, чтобы не появились новые спектральные составляющие и не исчезли старые. Но, по сути, если интерполяция достаточно точная - этого произойти не должно. К тому же и до интерполяции и после неё в получившихся отсчетах всё равно будет содержаться 10 периодов сигнала.
  2. Подытожим. Если уж очень хочется делать через интерполяцию - то предпочтительно сплайнами, можно попробовать Лагранжа. Применить "Герцеля" для расчета 50 гармоник - как сказали выше, "Герцль"не зависит от числа входных отсчетов, ведь всё равно в них укладывается четное число периодов. Еще один способ (или метод) - реализовать на МК фильтр Фарроу - это случаем не полифазный ли фильтр? Если, как утверждают, "Герцль" справляется с плавающим числом входных отсчетов, то справится ли фильтр. Уважаемые, я ничего не упустил?
  3. Как раз таки ГОСТ и требует измерение 50 гармоник сетевой частоты и от ГОСТа никуда не уйти. ГОСТ 30804.4.7-2013. Интерполяция сплайном, по крайней мере как показывает моделирование в MathCad, не очень сильно искажает исходный сигнал. Порядка 0,5 В. Герцелем вычислять все 50 гармоник? При условии, что количество отсчетов всегда плавает. Можно ли будет уложиться хотя бы в 5-7 мс? На CORTEX-M4F, 120 МГц.
  4. Всё как раз и сводится к тому, каким именно способом интерполировать. Или посмотреть в сторону полифазного фильтра, но, если честно, я про него не читал и, пока что плохо представляю как его можно реализовать. Если говорить более общо, то меня интересовало то, каким способом сейчас делают интерполяцию применительно к моему случаю (задаче). Будь частота микроконтроллера выше и составляла хотя бы 200 МГц, то можно смело делать сплайн, лишь оптимизировав код под конкретный процессор и используя все его (микроконтроллера) функции и ресурсы, и не бояться, что пока будет обрабатываться сигнал мы не успеем провести другие измерения и какие-то другие действия. Естественно, можно взять и сплайн, но может быть есть другие способы интерполяции, не менее эффективные и точные, если кто-то занимался подобными вещами на практике.
  5. Поправьте меня, если я не прав. Все операции передискретизации и преобразование Фурье делается на микроконтроллере, CORTEX-M4F. Вы предлагаете исходные отсчеты с АЦП (а их от 1380 до 1900 ), приходящие на МК сначала интерполировать в N раз, а потом провести децимацию (отбросить каждый M отсчет) - это, как я понимаю и есть интерполирующий фильтр. А интерполяцию делать Sinc-функцией. Но ведь таким же образом можно сделать и сплайн-интерполяцию, подозреваю, что и примерно с такой же скоростью. Да, интерполяция Sinc-функцией очень точна, но вместе с тем делается гораздо дольше. Линейная интерполяция не обеспечит необходимой точности, заданной ГОСТ - уже моделировал в MathCAD - расхождения очень большие.
  6. Да, всё именно так. Я немного ступил и задал неверные начальные данные, из-за этого обсуждение свернуло немного в другую сторону. То, что Вы описали - именно это мне и надо получить. В ходе обсуждения и было предложено делать интерполяцию, чтобы получить фиксированные 1024 отсчета и как-то решить проблему с плавающими входными отсчетами. Мне как раз и хотелось узнать - какую интерполяцию применяют в данном случае? Точно не линейная - точность требуемую по ГОСТ не обеспечим. Сплайнами? Точность первоклассная, а вот ресурсов требует наравне с БПФ (примерно 70, а то и все 90 процентов). Делать сначала интерполяцию, а потом децимацию лишено всякого смысла. Спасибо! :)
  7. Как раз на 10 периодах и получается максимум до 50 гармоники - я это уже моделировал и код писал в IAR - всё работает, БПФ на 1024 считает четко, погрешность очень маленькая и как раз до 50 гармоники. Ведь частота сети плавает, хоть это и считается медленно меняющимся параметром, в связи с чем меняется и количество отсчетов на 10 периодов (Почему именно 10? ГОСТ 30804.4.30 - 2013). 1600 отсчетов - идеализированный случай. Будь частота 48, отсчетов будет уже 1667 на 10 периодов. К чему я это - получить 1024 из плавающих 1600 - сможет ли Герцель с таким справиться? И уложиться в 2.5 - 3 мс.
  8. Тогда совсем глупый вопрос: И всё это дело можно организовать программным образом на микроконтроллере? Если да, можете подсказать пару методов или алгоритмов. Пожалуйста.
  9. Поправьте меня, если я что-то не правильно говорю: Полифазный фильтр действует примерно так: Сначала мы увеличиваем частоту дискретизации в М раз - т.е. интерполируем сигнал. Затем прореживаем до нужного нам количества отсчетов, т.е. откидываем ненужные, т.е. производим децимацию сигнала? Не искажается ли спектр после отбрасывания отсчетов?
  10. Да, но если добивать нулями, то сильно искажается спектр и тогда оценить уровень гармоник не представляется возможным. К тому же БПФ на 2048 точек уже становится слишком ресурсоемким, даже на Cortex-M4F. Но за идею спасибо. 1. Ибо БПФ согласно ГОСТ нужно считать именно на 10 периодах. На самом деле не БПФ, а гармоники нужно считать на 10 периодах, поэтому такое условие. 2. Вот и получается, что необходима передискретизация с 1600 отсчетов на 1024 отсчета. 3. Вот как раз и цель интерполяции - пункт 2. 4. А погрешность - согласен, можно легко промодилеровать. Вот мне и хотелось узнать как это делается сейчас и какие есть варианты решения проблемы. Если немного уйти от темы, то в общем случае на вход АЦП идет ослабленный сигнал электрической сети. АЦП на 8 кГц, как я уже говорил. Данные с АЦП приходят в микроконтроллер. И задача стоит в том, чтобы оценить уровень гармоник вплоть до 50. И вот одно из решение: Так как частота сети плавает, то применить интерполяцию и получить 1024 отсчета и далее БПФ и вот они гармоники.
  11. Столкнулся с такой задачей: Есть АЦП с частотой дискретизации 8 кГц - задан жестко. Есть микроконтроллер, работающий на частоте 120 МГц - тоже задан жестко. Частота сигнала - частота сети 50 Гц. Т.е. после АЦП на микроконтроллер идут 160 отсчетов на 1 период сигнала. Далее на 10 периодах применяется БПФ на 1024 отсчета (тут БПФ не рассматривается, уже реализовано). Собственно в чем весь вопрос: Какой именно вид интерполяции применить лучше всего (есть линейная, квадратичная, кубическими сплайнами, полиномы Лагранжа и прочее)? Ведь необходимо из 1600 отсчетов сделать 1024 - по-любому необходима интерполяция. И еще необходимо обеспечить точность - в идеале около 1%. И еще один момент - всё это делается на микроконтроллере, т.е. потом все эти алгоритмы будут преобразованы в код на C++.
×
×
  • Создать...