Если у вас возникнет желание сделать перестраиваемый 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