Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Cortex-M7 кол-во циклов на инструкцию
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Шаманъ
Приветствую всех!

А есть ли какой-нить инструмент, или хотя бы таблица по теме? Понимаю, что там конвейер со всеми делами, но как-то же нужно в этом всем ориентироваться?

Например у DSP56300 можно скормить ассемблеру опцию и он в листинге дает кол-во циклов отдельной колонкой (учитывая конвееризацию и показывая возникающие простои конвейера).
Obam
В TechRefMan-е на M7 раздела "Instruction Timing" нет, но есть в DDI0337E (для М3) и фраза "Table 18-1 shows the Thumb-2 subset supported in the ARMv7-M architecture." обнадёживает. В общем, гл. 18.
=SSN=
Цитата(Шаманъ @ Apr 28 2017, 11:04) *
А есть ли какой-нить инструмент, или хотя бы таблица по теме? Понимаю, что там конвейер со всеми делами, но как-то же нужно в этом всем ориентироваться?

Wiki:
Цитата
Key features of the Cortex-M7 core are:
  • ARMv7E-M architecture.
  • 6-stage pipeline with branch speculation.
  • Instruction sets:
    • Thumb-1 (entire).
    • Thumb-2 (entire).
    • 32-bit hardware integer multiply with 32-bit or 64-bit result, signed or unsigned, add or subtract after the multiply.
    • 32-bit hardware integer divide (2-12 cycles).
    • Saturation arithmetic support.
    • DSP extension: Single cycle 16/32-bit MAC, single cycle dual 16-bit MAC, 8/16-bit SIMD arithmetic.
  • 1 to 240 interrupts, plus NMI.
  • 12 cycle interrupt latency.
  • Integrated sleep modes.
Шаманъ
Цитата(Obam @ Apr 28 2017, 11:45) *
но есть в DDI0337E (для М3) и фраза "Table 18-1 shows the Thumb-2 subset supported in the ARMv7-M architecture

Так для М4 на сайте АРМ были тоже, но М7 по идее несколько иной "зверь".

Цитата(=SSN= @ Apr 28 2017, 11:59) *

Это очень уж лаконично sm.gif

Похоже придется смотреть через DWT на реальном процессоре, неудобно однако...
jcxz
Цитата(Шаманъ @ Apr 28 2017, 12:36) *
Похоже придется смотреть через DWT на реальном процессоре, неудобно однако...

...если этот DWT в реальном процессоре есть rolleyes.gif
Obam
Цитата(Шаманъ @ Apr 28 2017, 14:36) *
Так для М4 на сайте АРМ были тоже, но М7 по идее несколько иной "зверь".

В TRM на M4 тоже нет таймингов
Ну сами уж "supported in the ARMv7-M architecture" подчеркните (:
DDI0403E.b применИм к M7? Всё…

Не знаю, пользуетесь ли IAR-ом, там есть
Нажмите для просмотра прикрепленного файла
jcxz
Цитата(Obam @ Apr 28 2017, 13:00) *
Ну сами уж "supported in the ARMv7-M architecture" подчеркните (:
DDI0403E.b применИм к M7? Всё…

И что?
Открываем ARM Cortex-M4 Technical Reference Manual, читаем "The DWT, if present, contains counters for:".
May be present, or may be don't. Применимо к M7?
Всё.... laughing.gif
Шаманъ
Цитата(jcxz @ Apr 28 2017, 13:41) *
...если этот DWT в реальном процессоре есть rolleyes.gif

В том, который могу попытать есть sm.gif

Цитата(Obam @ Apr 28 2017, 14:00) *
В TRM на M4 тоже нет таймингов

Я ж писал, что не в TRM, а не сайте АРМ - вот http://infocenter.arm.com/help/index.jsp?t...b/CHDIJAFG.html sm.gif

Цитата
Ну сами уж "supported in the ARMv7-M architecture" подчеркните (:
DDI0403E.b применИм к M7? Всё…

Как по мне, то эта фраза не гарантирует, что тайминги одинаковые. Да и не понятно какие инструкции в М7 могут быть выполнены параллельно.

Цитата
Не знаю, пользуетесь ли IAR-ом, там есть

Не, у меня все инструменты бесплатные sm.gif - MS VS Code + GCC + GDB + OpenOCD, но доступ к DWT получить не должно быть проблемой.
Obam
Цитата(Шаманъ @ Apr 28 2017, 15:47) *
Я ж писал, что не в TRM, а не сайте АРМ - вот http://infocenter.arm.com/help/index.jsp?t...b/CHDIJAFG.html sm.gif

Поправка: действительно, в DDI0439B есть только про LDR\STR и "This section describes how best to pair instructions to achieve more reductions in timing." (: Эт раз.
Два: в DDI0337E (для M3) глава про тайминги есть, а в DDI0337H уже такой подробной нет, аналогично DDI0439B (п.3.3 Instruction set summary)

Процы сложнее - дока кУцее и кУцее…

Цитата
Как по мне, то эта фраза не гарантирует, что тайминги одинаковые. Да и не понятно какие инструкции в М7 могут быть выполнены параллельно.


Ну те что "Parallel arithmetic"

Цитата
Не, у меня все инструменты бесплатные sm.gif

Я тоже не внук рокфеллера…

PS: заинтересовали. Качнул DDI0489D M7 TRM r1p1 - гениальный документ! Вот ВЕСЬ раздел
2.3 Instruction set summary
The processor implements the ARMv7-M instruction set and features provided by the
ARMv7E-M architecture profile. For more information about the ARMv7-M instructions, see
the ARM®v7-M Architecture Reference Manual. ФСЁ!

Так что, фраза гарантирует (;
scifi
Цитата(Шаманъ @ Apr 28 2017, 13:36) *
Похоже придется смотреть через DWT на реальном процессоре, неудобно однако...

Разрешите поинтересоваться, зачем? Я ещё могу понять, когда измеряется время выполнения участка кода, если уж очень сильно куда-то спешим и не успеваем. Но отдельные инструкции, Холмс? laughing.gif

Цитата(Шаманъ @ Apr 28 2017, 14:47) *
Как по мне, то эта фраза не гарантирует, что тайминги одинаковые. Да и не понятно какие инструкции в М7 могут быть выполнены параллельно.

Точно помню, что есть отличия между M3 и M4. Но там мелочь какая-то была, грубо говоря, 99% одинаково.
Шаманъ
Цитата(scifi @ Apr 28 2017, 16:14) *
Разрешите поинтересоваться, зачем? Я ещё могу понять, когда измеряется время выполнения участка кода, если уж очень сильно куда-то спешим и не успеваем. Но отдельные инструкции, Холмс? laughing.gif

Вы не поняли. Если бы у меня такой инструмент, как в ассемблере DSP56300, то я бы позанимался оптимизацией просто используя его (там и отдельные инструкции и общее кол-во тактов видно). Была бы бумажка-табличка, то для начала заглянул бы в нее, а так остается DWT, но естественно не для отдельных инструкций - конечная цель оптимизация нескольких критических кусков выполняющих DSP обработку.

Сваял тестовый проект, через DWT все отлично видится в gdb. Вопрос наверное можно закрыть.
romas2010
По хорошему надо бы ввести в архитектуру банки регистров, как в MIPS...тогда бы переключение контекста в многозадачности свелось бы к простому переключению нужного банка...все остальное-игрулечки-бирюлечки
jcxz
Цитата(romas2010 @ Apr 28 2017, 16:51) *
По хорошему надо бы ввести в архитектуру банки регистров, как в MIPS...тогда бы переключение контекста в многозадачности свелось бы к простому переключению нужного банка

Банки регистров есть в классических ARM, например ARM7, ARM9.
Только это никак не помогает переключению задач, а наоборот - переключение гораздо сложнее.
Или Вы хотите количество банков по количеству задач? beer.gif
Шаманъ
Народ, а есть ли какие-нить вменяемые benchmarks по части DSP фильтров/функций для Cortex-M7 на которые стоит ориентироваться? А то что-то везде одна реклама, как все хорошо, а хотелось бы конкретики типа столько-то тактов на 1tap FIR фильтра.
jcxz
Цитата(Шаманъ @ Apr 28 2017, 13:47) *
В том, который могу попытать есть sm.gif

Везёт Вам. У меня вот CM4, а в нём нету даже bitband crying.gif
Obam
Цитата(jcxz @ Apr 29 2017, 00:03) *
Везёт Вам. У меня вот CM4, а в нём нету даже bitband crying.gif

И кто ж (в смысле производитель) это так зажмотился?
jcxz
Цитата(Obam @ Apr 29 2017, 12:05) *
И кто ж (в смысле производитель) это так зажмотился?

Infineon семейство XMC4000
adnega
Цитата(Obam @ Apr 29 2017, 13:05) *
И кто ж (в смысле производитель) это так зажмотился?

В некоторых STM32 он пропал для GPIO, что заставило разочароваться и перестать использовать эту технологию.
К тому же там есть некоторые подводные камни (работа с DMA, неявное чтение-модификация-запись).
jcxz
Цитата(adnega @ Apr 29 2017, 12:34) *
В некоторых STM32 он пропал для GPIO, что заставило разочароваться и перестать использовать эту технологию.

Для GPIO STM32 он не особо нужен - там есть свои возможности.
Obam
Цитата(adnega @ Apr 29 2017, 14:34) *
В некоторых STM32 он пропал для GPIO, что заставило разочароваться и перестать использовать эту технологию.
К тому же там есть некоторые подводные камни (работа с DMA, неявное чтение-модификация-запись).

А в каком проце заявленный непрерывным мегабайт бит-бенда периферии имеет дырку? Ds-ов много, искать долго, не сочтите за труд подсказать...
adnega
Цитата(Obam @ Apr 29 2017, 17:39) *
А в каком проце заявленный непрерывным мегабайт бит-бенда периферии имеет дырку? Ds-ов много, искать долго, не сочтите за труд подсказать...

Например, в "RM0316 STM32F302xx, STM32F303xx and STM32F313xx advanced ARM-based 32-bit MCUs".
Для GPIO выделена память, начиная с 0x4800_0000.
jcxz
Цитата(Obam @ Apr 29 2017, 16:39) *
А в каком проце заявленный непрерывным мегабайт бит-бенда периферии имеет дырку?

Что за дырка?
В некоторых МК часть периферии находится в области алиаса bitband периферии, а часть - вне этого диапазона.
Obam
Цитата(jcxz @ Apr 30 2017, 00:30) *
Что за дырка?
В некоторых МК часть периферии находится в области алиаса bitband периферии, а часть - вне этого диапазона.

Не дырка... ну не возможно объём всех ds знать. Считал (и опыт применявшихся кортексов М это подтверждал) что мегабайта на всю периферию "за глаза", а оказывается "чудики" чудят иногда, не соблюдая единообразие (;
ViKo
Обычно было 2 bitband зоны - для переменных в ОЗУ и для периферийных битов. И не более.
adnega
Цитата(Obam @ Apr 30 2017, 11:07) *
а оказывается "чудики" чудят иногда

А толку от этого bit-band? Все равно только ядро может им пользоваться.
И уж если ногодрыжить, то иметь GPIO на шине AHB будет повыгоднее, чем на APB (APB2 у STM32F1xx).
Возможно, за счет отказа от bit-band для GPIO удастся сэкономить какие-нить такты синхронизации шин,
но в дебрях я не силен.
Obam
Код кроме ядра некому исполнять (; и наличие возможности лучше её отсутствия.
Стандартизация ещё никогда в production не вредила. "Сказал командир (читай - ARM) - "хорёк", значит ни каких сусликов."

В конце-концов, могли бы этот "периферийский" мегабайт бит-бэнда и на AHB отобразить... а может и не могли...
jcxz
Цитата(ViKo @ Apr 30 2017, 10:39) *
Обычно было 2 bitband зоны - для переменных в ОЗУ и для периферийных битов. И не более.

Да. И я, например, на практике пользуюсь только первым и то - очень мало. Так что ничего страшного в его отсутствии.
На Infineon-е просто заменил все такие места на LDREX/STREX и всё.
Шаманъ
Сваял ASRC, получилось примерно 4 такта на тап или 256тактов на один стерео сэмпл. До нормального DSP процессора далеко, но как для MCU вроде нормально.

DWT помог с оптимизацией - удобный инструмент, особенно если тестовый пример грузить прямо в ОЗУ.
scifi
Цитата(Шаманъ @ May 1 2017, 06:48) *
DWT помог с оптимизацией - удобный инструмент, особенно если тестовый пример грузить прямо в ОЗУ.

Если посмотреть на структуру шинного коммутатора STM32F7, там ОЗУ сильно разное бывает. Я так понял, быстрее всего код выполняется из ITCM RAM.
Шаманъ
Цитата(scifi @ May 1 2017, 10:12) *
Если посмотреть на структуру шинного коммутатора STM32F7, там ОЗУ сильно разное бывает.

Не столько само ОЗУ разное (если мы про внутренние ITCM/DTCM/SRAM1/SRAM2), сколько его подключение, что в конечном итоге вместе с особенностями программы по части использования этих шин другими мастерами влияет на скорость работы.

Цитата
Я так понял, быстрее всего код выполняется из ITCM RAM.

Да, я в нее и грузил код, данные в DTCM. В реальном проекте код будет в ITCM или Flash памяти (посмотрю что будет с быстродействием), а данные в DTCM/Flash или DTCM/SRAM1, определюсь после тестирования.
ig_z
QUOTE (Шаманъ @ May 1 2017, 06:48) *
Сваял ASRC, получилось примерно 4 такта на тап или 256тактов на один стерео сэмпл. До нормального DSP


Полуофф. А зачем вам ASRC, вы же вроде юсб интерфейс ваяете? Там есть асинхронная синхронизация, даже в видовс нормально работает
Genadi Zawidowski
У меня перенос части кода в itcm дал устойчивый прирост быстродействия этой части на 5..10 процентов. А вот с dtcm ощущение, что не работает write back cache, то есть получил почти двухкратное замедление. Асинхронная синхронизация - это когда через выделенный ендпоинт передается желаемый сэмплрэйт? Во первых, расход ендпоинтов. Во вторых, как схема с обратной счязьюг должна быть пред расположена к возбудам. Хотелось бы минимизировать вносимые искажения, собственный ресэмплинг решает задачу. Отвечаю за Шаманъ, так как дел юлаю устройство аналогичного назначения.
Шаманъ
Цитата(ig_z @ May 1 2017, 18:08) *
А зачем вам ASRC, вы же вроде юсб интерфейс ваяете? Там есть асинхронная синхронизация, даже в видовс нормально работает

Геннадий уже ответил. Асинхронная синхронизация, сведется к какому-нить ASRC алгоритму с неконтролируемыми (с моей стороны) параметрами, только на стороне Windows. Когда ASRC делаю я сам, то я контролирую все параметры сам. К тому же у меня ситуация немного усугубляется тем, что обработка производися отдельным DSP со своим клоком.

Цитата(Genadi Zawidowski @ May 1 2017, 19:51) *
А вот с dtcm ощущение, что не работает write back cache, то есть получил почти двухкратное замедление.

DTCM некэшируемая память, но очень быстрая, и помнится по 64битной шине к ядру подключена. У меня в разных экспериментах DTCM была самая быстрая. Я кстати кэш и для SRAM1 отключил, получил прирост проиводительности, но это обусловлено особенностями использования SRAM1 у меня и вполне ожидаемо/объяснимо.
ig_z
QUOTE (Genadi Zawidowski @ May 1 2017, 19:51) *
Асинхронная синхронизация - это когда через выделенный ендпоинт передается желаемый сэмплрэйт? Во первых, расход ендпоинтов. Во вторых, как схема с обратной счязьюг должна быть пред расположена к возбудам. Хотелось бы минимизировать вносимые искажения, собственный ресэмплинг решает задачу.



QUOTE (Шаманъ @ May 1 2017, 22:02) *
Асинхронная синхронизация, сведется к какому-нить ASRC алгоритму с неконтролируемыми (с моей стороны) параметрами, только на стороне Windows. Когда ASRC делаю я сам, то я контролирую все параметры сам.


Это конечно злостный оффтоп, обсуждать синхронизацию в этом топике. Может модераторы создадут отдельную тему?
Я постоянно слышу мнение о наличии ресемплинга в юсб аудио хостах, но ни разу не смог получить объективного подтверждения этих слухов. Во всех моих тестах, при работающей асинхронной синхронизации кол-во пришедших и ушедших отсчетов в лупбеке всегда совпадало, что на девайсе, что на хосте а также между IN и OUT. Такой необычный ресемплер в виндовзе и маке, что не оставляет никаких следов своей работы. По моему на вегалабе продают асинхронные юсб устройства с возможностью тестирования бит-перфекта. Закольцовывают цифровую часть и считают црц. С ресемплером, где бы он ни находился, тест не сработал бы.
Я подозреваю, что эти слухи исходят от одного мега юсб гуру и я помню один топик здесь на эту тему, переросший в холивар и убитый модератором.
Поэтому, если у вас есть пример, как воспроизвести работу ресемплера, например в виндовс, буду очень благодарен за описание.
Геннадий, я не очень понял фразу о возбудах. Могли бы вы объяснить подробнее?
По поводу ендпоинтов, вы скорее всего правы, виндовс требует выделенного фидбек ендпоинта для работы експлисит режима. Но оба ваших устройства содержат только IN-ы, а как ведет себя в этом случае вин драйвер я не знаю. В лин и мак поддерживается неявная синхронизация, и фидбек ендпоинт просто не нужен.
Genadi Zawidowski
Цитата
Поэтому, если у вас есть пример, как воспроизвести работу ресемплера, например в виндовс, буду очень благодарен за описание.
Геннадий, я не очень понял фразу о возбудах. Могли бы вы объяснить подробнее?

Я про колебания sample rate - оно ведь будет подправляться с запасом? или нет? неизвестно. Процесс будет колеательный... а мне не хотелось бы. Или хоть управлять процессом.

Вот дескрипторы моих вариантов аудиоустройств.
Простая тестовая программа, которая читает через mmXXX функции аудиоданные и заворачивает их назад в устройство. Сэмплрейт выставлен номинальный для карты. Все равно, монотонное нарастание очереди/периодическая недостача данных для "воспроизведения" в аудиодеавайсе есть. Кстати, работать оно должно и в случае отсутствия потока в хост.
В дебри вегалаба не вникал, у меня просто отладочная печать состояния очередей буферов в usb device. В статистике работы ресэмплера получаю правдоподобные цифры (порядок совпадает с ожидаемым). У меня ресэмплер простой, выкинуть/добавить отсчет.
Исходник ресэмплера тут https://188.134.5.254/browser/hfreceiver/tr.../buffers.c#L773 сторка 773.

upd: если lin и mac при работе в два направления будут синхронизировать - то я просто за... а что делать если только OUT направление активно? И над всем этим решающий голос нехватки ендпоинтов.
Шаманъ
Цитата(ig_z @ May 1 2017, 23:00) *
Я постоянно слышу мнение о наличии ресемплинга в юсб аудио хостах, но ни разу не смог получить объективного подтверждения этих слухов.

А как без него? Имею наглядный пример - карта E-MU 0202 судя по спектрограммам (на них это очень хорошо видно) периодически выкидываются/добавляются сэмплы. На слух не слышно, но очень хорошо видно. Где это происходит - в карте/ее драйверах/виндоусских драйверах непонятно, но видно, что происходит. Поскольку мой девайс может выводить данные не только "для послушать", то есть необходимость гарантировать неразрывность сигнала и маленький (очень маленький) уровень возникающих искажений.

С собственным ASRC я получаю гарантированный результат, заплатить за это 3% производительности и 32кБ памяти я готов sm.gif.

Цитата(Genadi Zawidowski @ May 1 2017, 23:26) *
И над всем этим решающий голос нехватки ендпоинтов.

Да, это тоже важный момент. Мне бы к используемым 5in и 3out EP еще 4 in добавить sm.gif
jcxz
Цитата(Genadi Zawidowski @ May 1 2017, 22:26) *
Я про колебания sample rate - оно ведь будет подправляться с запасом? или нет? неизвестно. Процесс будет колеательный... а мне не хотелось бы. Или хоть управлять процессом.

Встряну в тред, хоть у меня и не совсем такая ситуация, но тема интересна wink.gif
Как я понял - у Вас аудиоустройство, принимающее поток сэмплов с USB-хоста и выводящее данные на ЦАП?
Тактирование ЦАП делаете от своего кварца или от потока данных?
Просто насколько я помню - один из стандартных вариантов синхронизации аудиопотока принимаемого с USB и выводимого на аудио-ЦАП - это использовать генератор, подсинхронизируемый данными от USB-хоста. Например: от SOF-маркеров. Дальше - умножитель частоты.
Этот способ вроде описан как один из способов синхронизации в описании USB-стандарта для аудио (хотя не уверен - читал давно).
У меня тоже аудиоустройство, принимающее поток сэмплов и выводящее его на ЦАП. Только сэмплы принимаются не из USB. Но проблема синхронизации есть (как есть в любом устройстве, где есть поток сэмплов между двумя точками с разными не связанными источниками тактирования.
Я сделал ресэмплер с кусочно-линейной аппроксимацией, которому на вход задаётся требуемый коэфф. ресэмплинга - здесь всё очень просто. Сложнее как раз с вычислением этого коэфф. Он у меня вычисляется как произведение двух сомножителей:
а) фиксированного, рассчитываемого при старте, исходя из частоты входящих сэмплов и частоты тактирования ЦАП;
б) переменного, который вычисляется исходя из уровня заполненности кольцевого буфера сэмплов.
Колебаний и возбуждений никаких нет.

И почему Вы сделали выкидывание/добавление сэмплов, когда кусочно-линейная аппроксимация лучше и совсем несложна?
Шаманъ
Цитата(jcxz @ May 2 2017, 15:29) *
Как я понял - у Вас аудиоустройство, принимающее поток сэмплов с USB-хоста и выводящее данные на ЦАП?

Не совсем - принимается по USB потом отдается DSP процессору по I2S.

Цитата
Тактирование ЦАП делаете от своего кварца или от потока данных?

DSP процессор работает от своего клока, который не перестраиваемый.

Цитата
Я сделал ресэмплер с кусочно-линейной аппроксимацией, которому на вход задаётся требуемый коэфф. ресэмплинга - здесь всё очень просто. Сложнее как раз с вычислением этого коэфф. Он у меня вычисляется как произведение двух сомножителей:
а) фиксированного, рассчитываемого при старте, исходя из частоты входящих сэмплов и частоты тактирования ЦАП;
б) переменного, который вычисляется исходя из уровня заполненности кольцевого буфера сэмплов.
Колебаний и возбуждений никаких нет.

У меня делается Upsampling очень высоко, а потом линейная интерполяция и обратно вниз. В принципе можно сделать небольшой Upsampling (раз в 16) и потом полиномиальную интерполяцию - результат очень схожий. Первый вариант оказалось удобнее реализовать и он побыстрее будет.

По поводу вычисления коэффициента - у меня тоже был вначале вопрос, но сегодня поэкспериментировал, вроде все просто получается. Измеряю период SOF пакетов и период синхронизации фреймов I2S относительно клока управляющего процессора (216МГц), потом усредняю. Получается очень неплохо и вычисляется быстро.

Цитата
И почему Вы сделали выкидывание/добавление сэмплов, когда кусочно-линейная аппроксимация лучше и совсем несложна?

Дочитал до этого и понял, что вопрос не ко мне rolleyes.gif , но раз уже ответил, то пусть будет laughing.gif
KnightIgor
Цитата(ig_z @ May 1 2017, 21:00) *
Это конечно злостный оффтоп, обсуждать синхронизацию в этом топике. Может модераторы создадут отдельную тему?
Я постоянно слышу мнение о наличии ресемплинга в юсб аудио хостах, но ни разу не смог получить объективного подтверждения этих слухов.

У меня есть USB Audio устройство на F103 с последующим Class D усилителем TAS5715. Как известно, F103 не может обеспечить точные частоты I2S. В моем случае для 44.1kHz я получаю по документации и факту 43.269kHz. Путем кольцевого буфера с контролем наполнения и feedback endpoint, без ресамплинга в процессоре, я запрашиваю у хоста (win10) фактически требуемую частоту потока.

Как там windows чего перекодирует и пересчитывает, не знаю. Факт есть - все работает прилично, но... с заметным на слух(!) замедлением музыкального произведения на, как очевидно, -1.88%. Под заметностью на слух имеется ввиду, что если непостредственно после прослушивания произведения через "мое" устройство, послушать его через колонки от PC, то разница в темпе слышна. Может какой крутой дирижер и без последующего сравнения заметит: читал как-то, что виртуозы дирижерского искусства при записи оркестра в студии произведения часовой длины делают ошибку всего в 2-3 секунды от дубля к дублю.
jcxz
Цитата(Шаманъ @ May 2 2017, 14:45) *
DSP процессор работает от своего клока, который не перестраиваемый.

Я это и имел в виду.

Цитата(Шаманъ @ May 2 2017, 14:45) *
У меня делается Upsampling очень высоко, а потом линейная интерполяция и обратно вниз.

Когда у меня был проект на DSP, то и я так делал: wink.gif
N-кратное добавление отсчётов, затем - ФНЧ, затем - децимация вниз.

Цитата(Шаманъ @ May 2 2017, 14:45) *
Измеряю период SOF пакетов и период синхронизации фреймов I2S относительно клока управляющего процессора (216МГц), потом усредняю. Получается очень неплохо и вычисляется быстро.

Так ведь период измерения небольшой и отношение частоты SOF или I2S к 216МГц - небольшое, так что если частоты отличаются незначительно (из-за погрешности кварцев), то будут получаться всё время константные результаты, с редкими биениями на +-1 ?
Или Вы интегрируете по нескольким измерениям?

Цитата(Шаманъ @ May 2 2017, 14:45) *
Дочитал до этого и понял, что вопрос не ко мне rolleyes.gif , но раз уже ответил, то пусть будет laughing.gif

Не страшно, Ваше мнение тоже интересно wink.gif
Genadi Zawidowski
Цитата
И почему Вы сделали выкидывание/добавление сэмплов, когда кусочно-линейная аппроксимация лучше и совсем несложна?

Прекрасно!
Есть код, в котором этот алгоритм применен?
Шаманъ
Цитата(jcxz @ May 2 2017, 16:44) *
Так ведь период измерения небольшой и отношение частоты SOF или I2S к 216МГц - небольшое, так что если частоты отличаются незначительно (из-за погрешности кварцев), то будут получаться всё время константные результаты, с редкими биениями на +-1 ?

Ну как сказать небольшой - за 1мс можно посчитать 216000тактов, т.е. не вдаваясь в нюансы получается дискретность измерения 1/216000 = 5ppm. Как бы и не плохо, тем более джиттер при таком "программном замере" из-за разных факторов получается прилично больше (порядка +-100тактов).

Более правильный/точный метод это задействовать таймер TIM2, но руки пока не еще дошли - надо кое-какие нюансы самого ASRC допилить sm.gif.

Цитата
Или Вы интегрируете по нескольким измерениям?

Использую простой ФНЧ первого порядка. Его основная задача уменьшить джиттер, поскольку плавают измерения (получается 216048+-100 тактов, надо переходить на аппаратный замер таймером). Вот картинка - довольно наглядно все демонстрирует:

Нажмите для просмотра прикрепленного файла

Цитата(Genadi Zawidowski @ May 3 2017, 01:09) *
Есть код, в котором этот алгоритм применен?

Я на cqham о подобном говорил. При достаточно большом соотношении частоты дискретизации и максимальной частоты сигнала получается более-менее. Алгоритм очень простой - соедините отсчеты линиями, теперь у Вас есть значения сигнала в произвольной точки времени (что собственно для ASRC и нужно) sm.gif "Возня" с более сложными алгоритмами фактически сводится к более точной интерполяции сигнала между отсчетами.

Кода нет, я этот вариант только покрутил в Матлабе и отказался, т.к. при моих соотношениях частоты дискретизации и сигнала (12кГц:3.5кГц) он дает очень много искажений.
Genadi Zawidowski
Можно ли наплевать на спектральные "прострелы" из-за вставления/убирания сэмпла при соотношении частоты сигнала 3.5 кГц и дискретизации 48 кГц?
Шаманъ
Цитата(Genadi Zawidowski @ May 3 2017, 10:42) *
Можно ли наплевать на спектральные "прострелы" из-за вставления/убирания сэмпла при соотношении частоты сигнала 3.5 кГц и дискретизации 48 кГц?

Как по мне, то выглядит не очень - здесь отклонение частоты максимальное для USB FS sad.gif :
Нажмите для просмотра прикрепленного файла
А здесь отклонение частоты максимальное для USB HS:
Нажмите для просмотра прикрепленного файла
jcxz
Цитата(Genadi Zawidowski @ May 3 2017, 00:09) *
Есть код, в котором этот алгоритм применен?

Да код там простейший:
CODE
#define DAC_FS 68000 //[Hz] желаемая частота квантования ЦАП (<=реальной)
#define DAC_DIV (TimerAPBCLK(nTIM_dac, H) / DAC_FS)
#define DAC_FS_REAL divCeil(TimerAPBCLK(nTIM_dac, H), DAC_DIV) //[Hz] реальная частота квантования ЦАП (>=DAC_FS) [Hz]
#define DS_FACTOR 3 //показатель макс.даунсэмплинга
#define DS_MAX ((1 << DS_FACTOR) - 1) //макс.даунсэмплинг (макс.возможное отношение частоты сэмплирования mp3-потока к DAC_FS_REAL)
static u32 rsmplX; //текущая фаза ресэмплинга; целая часть - старшие DS_FACTOR бит
static u32 rsmplFix; //отношение частоты сэмплирования mp3 к частоте DAC_FS_REAL; целая часть - старшие DS_FACTOR бит
static u32 rsmplVar; //произведение rsmplFix и переменного коэфф.ресэмплинга, вычисляемого от уровня заполненности inbuf.ring; формат аналогичен rsmplFix
static u16 rsmplBSiz; //кол-во пар (левый/правый) сэмплов в rsmplBuf

static void ReSmpl()
{
CPU_SR_ALLOCATE();
uint i0, i1, n, n1 = rsmplBSiz;
//n1 - число сэмплов во вх.буфере
s16 *psr = &rsmplBuf[0]; //указатель поток вх.сэмплов (сэмплы хранятся парами 16-битных значений для левого/правого канала)
while (1) {
i1 = sbufW; //индекс записи в кольцевой буфер вых.сэмплов
if ((int)(n = (i0 = sbufE) - i1 - 1) < 0) {
n = ncell(smplBuf.data) - i1;
if (!i0) n--;
}
//здесь n - число сэмплов ЦАП, которое можно записать в вых.буфер
if (!n) { //нет места для записи в smplBuf.data
if (afaza == AFAZA_BREAK) return;
ENTR_CRT_SECTION();
if (afaza == AFAZA_PREBUF) {
i0 = ibufR;
if ((int)(n = ibufW - i0) < 0) n += sizeof(inbuf.ring);
if (n >= prebufPorog || aoutOn == OTYP_MEM) {
afaza = AFAZA_PLAY;
EXIT_CRT_SECTION();
TaskChangePrio(PRIO_TASK_AOUT_LOW, PRIO_TASK_AOUT_HIGH);
} else EXIT_CRT_SECTION();
} else EXIT_CRT_SECTION();
MboxPend(mboxOut, ms2tkt(20));
continue;
}
u32 *psw = &smplBuf.data[i1]; //указатель на формируемый поток вых.сэмплов
u32 c, c0, c1, ca = rsmplX;
do { //здесь собственно - сам цикл ресэмплинга входных отсчётов в выходные
n1 -= c = (ca += rsmplVar) >> 32 - DS_FACTOR;
psr += c * 2;
ca -= c << 32 - DS_FACTOR;
c = ca >> 16 - DS_FACTOR;
c0 = (psr[2] * (s32)c + psr[0] * (s32)(B16 - c) >> 16) * mp3Volume; //здесь собственно вычисление очередного вых. сэмпла для левого канала (а может правого? wink.gif
c1 = (psr[3] * (s32)c + psr[1] * (s32)(B16 - c) >> 16) * mp3Volume; //здесь для другого канала
*psw++ = (c0 + B23 >> 8 & 0xFFF0) | (c1 + B23 >> 12 << 20); //объединяем и преобразуем в формат 2-канального ЦАП STM32F429
} while (--n && n1 > DS_MAX);
rsmplX = ca;
i1 = psw - &smplBuf.data[0];
if (i1 >= ncell(smplBuf.data)) i1 = 0;
sbufW = i1;
if (n1 <= DS_MAX) break;
}
rsmplBSiz = n1;
memmove(&rsmplBuf[0], psr, n1 + 1 << 2);
}

DAC_FS - можно задать любым какое нравится и поддерживает ЦАП, но желательно близким к частоте вх.потока и если ниже частоты вх.потока, то не более чем в DS_MAX раз;
rsmplFix - у меня вычисляется для каждого вх. MP3-фрейма - из него берётся samplerate этого фрейма и получаем значение фиксированного коэфф. ресэмплинга для данного MP3-фрейма;
rsmplVar - вычисляется непрерывно - это произведение rsmplFix на коэфф. заполненности основного кольцевого буфера mp3-потока; за счёт этого выполняется согласование скоростей вх.потока (определяемого генератором передатчика) и вых. потока (определяемого тактовой ЦАП); зависимость коэфф. заполненности кольц.буфера - нелинейная.

Цитата(Шаманъ @ May 3 2017, 09:01) *
Более правильный/точный метод это задействовать таймер TIM2, но руки пока не еще дошли - надо кое-какие нюансы самого ASRC допилить sm.gif.
Использую простой ФНЧ первого порядка. Его основная задача уменьшить джиттер, поскольку плавают измерения (получается 216048+-100 тактов, надо переходить на аппаратный замер таймером).

Имхо - у SOF-фреймов от хоста тоже может быть джиттер. Так что аппаратным или не аппаратным таймером мерять - всё равно значения будут дёргаться - так как погрешность возникает не у Вас. Всё равно придётся усреднять или ФНЧ.

Цитата(Шаманъ @ May 3 2017, 09:01) *
Алгоритм очень простой - соедините отсчеты линиями, теперь у Вас есть значения сигнала в произвольной точки времени (что собственно для ASRC и нужно) sm.gif "Возня" с более сложными алгоритмами фактически сводится к более точной интерполяции сигнала между отсчетами.
Кода нет, я этот вариант только покрутил в Матлабе и отказался, т.к. при моих соотношениях частоты дискретизации и сигнала (12кГц:3.5кГц) он дает очень много искажений.

Приведённый мной код должен нормально работать при соотношениях вх./вых. частот сэмплирования (коэфф.ресэмплинга) в диапазоне менее: 0.5<K<2.
Он конечно будет работать и за пределами этого диапазона, но тогда часть сэмплов будет просто выкидываться (не учитываться в вых.сигнале). Чтобы убрать этот недостаток надо по идее поток вх.сэмплов предварительно прогнать через ФНЧ (а для случая K<=0.5 - предварительно добавить сэмплов в поток так, чтобы стало K>0.5 и потом прогнать через ФНЧ). Но я уже не стал этим заморачиваться, так как и такое качество меня уже устроило rolleyes.gif
Шаманъ
Цитата(Genadi Zawidowski @ May 3 2017, 10:42) *
Можно ли наплевать на спектральные "прострелы" из-за вставления/убирания сэмпла при соотношении частоты сигнала 3.5 кГц и дискретизации 48 кГц?

Извиняюсь, прочитал невнимательно, а разговор был про линейную интерполяцию...

Если просто выкидывать, то оно щелкать будет. Вот файл - 10 секунд, 3.5кГц сигнал, 48кГц оцифровка, каждый 24000й сэмпл удален, что соответствует разнице частот 41ppm.
Шаманъ
Цитата(jcxz @ May 3 2017, 11:50) *
Имхо - у SOF-фреймов от хоста тоже может быть джиттер. Так что аппаратным или не аппаратным таймером мерять - всё равно значения будут дёргаться - так как погрешность возникает не у Вас. Всё равно придётся усреднять или ФНЧ.

Да это понятно, но избавиться от дополнительного джиттера (связанного с вызовами прерываний) все же стоит. Переделал на таймер. Не очень удобно оно в STM32 сделано, ну да ладно. С ФНЧ с постоянной времени 0.2с получается теперь так:
Нажмите для просмотра прикрепленного файла
В цифрах в среднем джиттер меньше где-то в 1.5..2раза и не зависит от того, что делает девайс - с таймером однозначно лучше.

Теперь осталось прикрутить часть со стороны DSP процессора и потом устроить "наведение порядка". Эх, зря я не предусмотрел подачу MCLK на SAI интерфейс от DSP процессора, придется костыли изобретать rolleyes.gif ...
jcxz
Цитата(Шаманъ @ May 3 2017, 13:56) *
Теперь осталось прикрутить часть со стороны DSP процессора и потом устроить "наведение порядка". Эх, зря я не предусмотрел подачу MCLK на SAI интерфейс от DSP процессора, придется костыли изобретать rolleyes.gif ...

А что-ж Вы ресэмплинг не на DSP делаете? Имхо - он гораздо лучше для этого приспособлен.
Шаманъ
Цитата(jcxz @ May 3 2017, 15:13) *
А что-ж Вы ресэмплинг не на DSP делаете? Имхо - он гораздо лучше для этого приспособлен.

Приспособлен он пожалуй получше, но скормить ему клок от USB проблематично. К тому же тогда нужно обеспечить синхронную работу SAI и USB интерфейсов, плюс SAI интерфейс должен работать независимо от наличия USB подключения. Так, как сейчас выходит гибче, проще и удобнее. Несколько процентов от производительности STMа вполне можно потратить на ASRC.
jcxz
Цитата(Шаманъ @ May 3 2017, 14:38) *
Приспособлен он пожалуй получше, но скормить ему клок от USB проблематично.

А зачем? Сделать как у меня: отдавать поток сэмплов как есть, а в DSP делать ресэмплинг на коэфф. равный произведению постоянной и переменной части; переменную часть вычислять от уровня заполненности буфера принимаемых DSP сэмплов; постоянная Вам известна.
Тогда и мерить/усреднять ничего не надо - это всё будет делать кольцевой буфер принимаемых сэмплов в DSP.
Хотя конечно этот буфер будет вносить некоторую задержку в сигнал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.