SigmaDSP, ADAU1761 - Tips and tricks

digital signal processing
Post Reply
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

ADAU1761 достаточно интересный DSP который программируется визуально с помощью среды SigmaStudio. Задумывалось по крайней мере именно так - снизить порог вхождения в программирование DSP. Но результат оказался несколько иной - ввиду откровенно хреновой документации и множества багов программирование превращается в квест.
В этом топике я буду постить всякие нюансы использования ADAU1761.
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

Конвертирование плавающей точки в формат 5.23

Формат данных 5.23 хотя и описан в документации, но кода для преобразования в/из плавающей точки я так и не нашел. AD предлагают это сделать самостоятельно. У меня получился такой код

Code: Select all

#define SIGMASTUDIOTYPE_FIXPOINT_CONVERT(value)     (int32_t((value) * (int32_t(1) << 23)) & 0xFFFFFFF)

float CONVERT_523_TO_FLOAT(int32_t value) {
    return float(int32_t((value & 0x8000000) ? (value | 0xF0000000) : value)) / (int32_t(1) << 23);
}
SIGMASTUDIOTYPE_FIXPOINT_CONVERT преобразует плавающее в целое формата 5.23. Соответственно CONVERT_523_TO_FLOAT выполняет обратное преобразование

Блок деления

В среде есть блок деления. Так вот - никогда, НИКОГДА его не используйте так как реализован он через жопу :) А именно деление вычисляется следующим образом x/y = x*(1/y). Для этого вначале находится обратное значение для y а потом выполняется умножение. Все бы ничего, но в случае если y < 1/15 то вычисление 1/y приводит к переполнению и результат деления получается некоректный.
Проблема описана тут https://ez.analog.com/dsp/sigmadsp/f/q- ... sion-block
Там же есть пример как обойти это ограничение реализовав итерационный алогритм деления

Блок Counter

Есть такой блок который реализует счетчик с ручным сбросом.
2012.11.01_14.10.30.jpg
2012.11.01_14.10.30.jpg (22.89 KiB) Viewed 9310 times
Я долго ломал голову как же мне из контроллера сделать ему reset. Оказывается необходимо установить, а потом сбросить соответствующий регистр. Причем устанавливать его надо в 1 записанную в формате 5.23.

Code: Select all

  SIGMA_WRITE_REGISTER_UINT32(MOD_COUNT1_ALG0_COUNTALG1RESET_ADDR,0x00800000);
  SIGMA_WRITE_REGISTER_UINT32(MOD_COUNT1_ALG0_COUNTALG1RESET_ADDR,0x0);
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

ADAU тактируется внешним клоком, причем диапазон тактирования очень широк. Но настройка PLL тактирования в IDE не совсем очевидна
adau_pll.png
adau_pll.png (41.31 KiB) Viewed 8911 times
Прописываем в поле MCLK Input частоту внешнего тактового генератора. В поле VCO Output вписываем Master clock freq. На скриншоте она равна 1024 * Fs = 1024 * 48000 = 49.152MHz. После этого жмем кнопку Load Parameters. Будут рассчитаны делители N/M/R. Если выдает ошибку то это говорит о том, что для данного внешнего клока параметры рассчитать невозможно - изменяем Input Clock Divider. В случае клока 26MHz установлен делитель на 2
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

Если вы такой умный что решили почитать документацию по сигмастудии, то аналоговые девицы быстро остудят ваш пыл и заставят себя почувствовать форменным идиотом. Как говорил К. Прутков - "не верь глазам своим". Именно этим лозунгом судя по всему разработчики и пользовались во всю.

Берем достаточно незатейливый блок генератора синусоидального сигнала. Называется он Tone
sinewave014.jpg
sinewave014.jpg (2.42 KiB) Viewed 8864 times
Теперь надо правильно задать частоту. Смотрим документацию:
Frequency - This sets the frequency of the sine tone. Its value is stored as a fixed point 5.23 number, equal to Frequency / (Sample Rate * 0.5).
Ну логично - частота задается в долях от половины семпл рейта. Точно так же она задается и для блоков генераторов управляемых напряжением и все работает - проверял. Меня немного смутило что по умолчанию частота равна 500, ну да фиг с ним - документация ж говорит что надо по другому. Прописал частоту в долях от семплрейт - нихрена не работает. А все потому что ... частота задется задается в герцах!!! Что и было выяснено опытным путем.

Но ошибка не только в документации. В 2019 году в Q&A задали вопрос по установке частоты для Tone и там точно так же напписано что
The frequency parameter can be calculated like this: Param = 2 * f / fs. For example, f = 100 Hz, fs = 48K, then Param = 2 * 100 / 48000 = 0.0041667 Not surprisingly, this is also the "voltage" you'd apply to a VCO input to get 100 Hz. out.
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

Если у вас возникнет желание сделать перестраиваемый notch-фильтр то вас могут ожидать некоторые сюрпризы. Например то, что коэффициенты A1 и A2 хранятся в параметрах с отрицательным знаком. Тоесть если вы в редакторе SigmaDSP пропишите A1=1, то в случае если нужно загрузить этот параметр внешним контроллером надо загружать не 1, а -1. А параметры B0/B1/B2 загружаются без инверсии.
Уже после того как я прошелся по этим граблям я нашел на форуме упоминание об этом.

Так же вы хрен найдете в документации формулы для рассчета IIR коэффициентов notch-фильтра. На форуме техподдержки отыскался пост где есть экселовская таблица.

Более сложные IIR фильтры удобно считать в Iowa Hills IIR Filter Designer. В IIR фильтре можно загружать коэффициенты из текстового файла. Формат такой - по одному коэффициенту на строчку, порядок b0,b1,b2,a1,a2 (a0 всегода 1). Десятичная точка всегда точка а не запятая! Иначе IDE падает с ошибкой.

При загрузке значений надо учитывать порядок следования байт. В ADAU1761 он big endian - первым идет самый старший байт. А в атмеге - less endian. Как следствие массовая загрузка регистров возможна, но их надо подготовить с реверсированием байт в словах.

Про загрузку тоже отдельная история. Safeload может загрузить не более 5 слов. Если у вас перестраиваемые фильтры высокого порядка (чебышев например) то надо останавливать DSP или отключать выход, грузить параметры и потом его заново стартовать. При таком подходе артефакты есть но они минимальны.

Еще любимый глюк SigmaDSP - самопроизвольно сбрасывать некоторые регистры. В частности регистр sample rate, dsp enable и dsp run :) Как следствие после загрузки программы нифига не работает. Поэтому загрузка должна выглядеть примерно так:

Code: Select all

  default_download_IC_1();
  SIGMA_WRITE_REGISTER_BYTE(REG_SAMPLE_RATE_SETTING_IC_1_ADDR,1); // set samplerate to 48kHz
  SIGMA_WRITE_REGISTER_BYTE(REG_DSP_ENABLE_REGISTER_IC_1_ADDR,1); // enable dsp
  SIGMA_WRITE_REGISTER_BYTE(REG_DSP_RUN_REGISTER_IC_1_ADDR,1); // run dsp
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

Блок регулирования уровня с плавным нарастанием/спадом (slew). Выглядит вот так:
sw_slew.png
sw_slew.png (2.21 KiB) Viewed 8510 times
Традиционно вы не найдете в документации никакой информации как связанно время нарастания/спада с параметром slew. Информация нашлась на форуме:
- Rise and fall times were identical
- Increasing the slew number by 1 doubles the slew time (a power-of-2 relationship)
- The slew numbers useful in typical applications range from about 8 to 15
Таблица соответствия параметра времени нарастания/спада
sw_slew_rate.png
sw_slew_rate.png (9.49 KiB) Viewed 8510 times
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

Чебышев тип II сделан в адау не для людей :) Вместо того чтобы задавать частоту среза по уровню 3дб там задается частота максимального подавления ближайщая к частоте среза. Например если фильтр 14го порядка с подавлением 80дб то чтобы получить частоту среза по уровню 3дб равную 3кГц в адау надо в блок фильтра прописать частоту 3.78кГц :)
Математика пересчета достаточно простая и есть в википедии
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: SigmaDSP, ADAU1761 - Tips and tricks

Post by UR5FFR »

В сигмастудии есть полезная тулза которая генерирует массивы коэффициентов для простых фильтров. Казалось бы проще некуда - генерируем и загружаем. Но беда в том, что коэффициенты студия генерирует в порядке B0B1B2A0A1, а для ADAU1761 коэффициенты фильтра в памяти идут в другой последовательности - A0A1B0B1B2. Естественно что при неправильном порядке коэффициентов фильтр не работает. Решение - или руками правим сгенерированные коэффициенты, или пишем код который меняет их порядок на лету при загрузке.

А над следующим глюком я рыдал до слез. Есть среди блоков дженерик фильтр 1го порядка. Выглядит вот так
gen1storder.png
gen1storder.png (5.69 KiB) Viewed 7993 times
Вот вы как думаете - какой тип фильтра изображен на скриншоте? Логично предположить что ФНЧ. Ставим стимул и пробу, строим график - таки да, ФНЧ.
gen1storder_graph.png
А вот хренушки :) Студия генерирует коэффициенты с точностью до наоборот. Если вы заказывали ФНЧ - вам сгенерится в результате ФВЧ. А если вам нужен был ФВЧ. то будет сгенерирован ФНЧ. Милая такая фича из-за которой я потратил лишние 15 минут.
Post Reply