Так и есть. С фиксированной точкой и двойное использование FIR на общий сумматор для получения рекурсии. Ни кто не говорил, что будет просто.
Поэтому DSP ядро и не используется. dsPIC33 - это типичный VLIW Гарвард. А это означает, что быстродействие математики обработки сигналов достигается длинными инструкциями, которые за 1 машинный цикл выполняют до семи разных математических операций. Возьмем к примеру mac в максимально длинной версии:
Код:
mac W4*W5, A, [W8]+=2, W4, [W10]+=2, W5, [W13]
1. W4 умножается на W5 2. результат п.1 суммируется с содержимым аккумулятора А 3. по указателю в W8 загружается W4 4. по указателю в W10 загружается W5 5. инкрементируется указатель в W8 6. инкрементируется указатель в W10 7. содержимое аккумулятора с округлением загружается по указателю в W13 То есть наблюдается типичная обработка в FIR, где всего одна инструкция будет повторена на всю длину массива посредством помещения ее под инструкциями повтора do или repeat. При включении модульной адресации можно применять оконную функцию произвольной формы для кольцевого массива накопления. IIR тут ни ухом, ни рылом. Так же есть DSP инструкции, позволяющие без повторов максимально компактно реализовать комплексную "бабочку" БПФ за 22 машинных цикла с учетом загрузки-выгрузки.
Честно сказать, не вижу каких-то принципиальных ограничений, не позволяющих реализовать IIR на dsPIC. Для простоты можно считать, что я просто ничего не понимаю и поэтому не вижу проблемы. Цель состоит в том, чтобы интересно провести время.
Честно сказать, не вижу каких-то принципиальных ограничений, не позволяющих реализовать IIR на dsPIC.
Реализовать можно. В этом никто не сомневался. Выигрыша никакого не будет против НЕиспользования DSP ядра. Еще раз, дело не в умножении-сложении одной инструкцией. Такая mac - это не DSP. Накладные расходы связанные с ненативностью 40-разрядного аккумулятора в 16-разрядной архитектуре приведут к бессмысленности ее использования. Но если вы желаете просто поиграть в DSP - это можно, конечно. Основной расход времени придется на многократные загрузки/выгрузки тела фильтра в/из аккумулятора. Потому что в отличии от FIR, в IIR аккумулятор подлежит сохранению между выборками. А аккумуляторов всего два.
Но если вы желаете просто поиграть в DSP - это можно, конечно.
Да, просто хочу разобраться. Функция ведь есть. Кстати, под XC16 подобная функция тоже есть. В библиотеке smps_control_library есть похожие функции реализации регуляторов 2p2z, 3p3z, 4p4z. Значит не все так плохо. Возможно многое зависит от порядка фильтра. Для первого порядка можно обойтись без DSP, а для порядков >=2 лучше DSP (это пока догадки).
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Я посмотрел библиотеку. Сложно сказать про выигрыш. Линейный неповторяемый код. Попробуйте - расскажете. Может я и не прав. Нужно сравнить FIR и IIR c примерно одинаковой крутизной спада АЧХ в части скорости вычисления одной выходной точки сигнала.
Заголовок сообщения: Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3
Добавлено: Пн май 05, 2025 23:20:56
Родился
Зарегистрирован: Ср мар 26, 2014 16:20:34 Сообщений: 18
Рейтинг сообщения:0
Да, разумеется. Как разберусь с функцией то отчитаюсь о результатах.
Добавлено after 3 hours 33 minutes 53 seconds: Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC33) 1. Как выделить место для массива переменных? Например, мне нужно организовать два буфера длиной по 16 байт (8 слов по 2 байта). Один для ввода - input, другой для вывода - output. 2. Как вышеуказанные массивы разместить по определенному адресу? 3. Как разместить константу по определенному адресу?
1. Синтаксис ниже. Указывается количество байт. В данном случае - 128.
Код:
arrayData: .space 128
2. Не нужно ничего размещать "по определенному адресу" за крайне редкими и очень специфическими исключениями. Адрес выделенного пространства в ОЗУ - имя этого пространства. Линкер все за вас сделает. Однако вы сами должны определить требуемый сегмент памяти. Для чего в секции выделения памяти есть определение сегмента:
Напомню, что только сегмент near может содержать переменные, которые доступны в прямой адресации, когда адрес операнда в ОЗУ находится в самой инструкции. Например dec2 var.
3. Константы во флеше так же размещаются в произвольном месте и доступ к ним производится по имени. Размер и формат константы вы указываете в начале каждой строки: .pbyte .pword .fixed .float .double и так далее... Пример:
Использовать выделенные константы можно в любом месте кода - до и после выделения. Линкер вставит константы в той последовательности кода, в котором эти константы размещены в тексте исходника. Применять директиву .org для фиксации положения кода во флеше конечно можно, но очень не рекомендуется из-за особенностей работы линкера. Синтаксис использования констант зависит от способа доступа к флешу как к данным. Тут могут быть специфические нюансы семейств МК. Типичный PSV доступ выглядит так (копирование таблицы во флеше в буфер таблицы в ОЗУ для ускорения доступа):
Время доступа к флешу как к данным зависит от семейства и чем быстрее МК, тем больше латентность этого доступа. Поэтому и было сделано копирование в примере. Напомню, что самые супер-пупер технологии флеша обеспечивают скорость доступа не выше 40 MIPS, поэтому инструкции прозрачно кэшируются, а доступ к данным во флеше приводит к "пузырькам" в конвейере.
Добрый день! Можете объяснить насчет бага в моделях dsPIC33CH? Пока не могу понять в каких случаях у меня могут возникнуть проблемы (решаемые или вовсе не решаемые). Errata для моделей МК с размером программной памяти более 128 кБ короче.
1. The FLIM instruction may incorrectly limit the data range when operating on signed operands of different sign values. If the operands are either all negative or all positive, the limit is correct. 2. The ECCSTATH/L registers cannot be read when an ECC error happens. The ECC Double-Bit Error (ECCDBE) trap and ECC Single Bit Error (ECCSBE) interrupt will work correctly, but the ECCSTATH/ECCSTATL registers will always read as zero. 3. In the ECCSTATH register, the SECSYNDx bits cannot be read when an ECC error happens. 4. When operating on signed operands of different sign values, the output for MAXAB, MINAB and MINZAB instructions may be incorrect. If the operands are either all negative or all positive, the output is correct. 5. When using the signed 32-by-16-bit division instruction, div.sd, the Overflow bit is not getting set when an overflow occurs.
Пока не могу понять в каких случаях у меня могут возникнуть проблемы
Чрезвычайно странный вопрос. 1. Никто кроме вас не знает характер решаемых вами задач. 2. Не известно никому кроме вас на каком языке вы пишите код. 3 Практически все выпускаемые в настоящее время МК такого уровня сложности имеют достаточно обширные эрраты, в которых имеются и баги ядра. Все перечисленные пункты эрраты обсуждаемого семейства МК не имеют фатального характера и не мешают использовать чипы с учетом этих багов.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения