Прикидывал по сигма-дельта модуляторам на досуге.
Зачем это все? Считаем еще раз.
Пусть тактовая частота процессора 72МГц. Для удобства заводим ШИМ 8 бит. Период его будет 280кГц. На прерывание от переполнения вешаем следующую процедуру:
{
static int i1; //первый интегратор
static int i2; //второй интегратор
extern volatile int sample; //Входной семпл
int s=i2&0xFF0000; //Псевдовыход ШИМ'а
i2+=i1-s; //Обновление второго интегратора
i1+=sample-s; //Обновление первого интегратора
PWM=s>>16; //Выдача нового значения ШИМ, возможно тут надо перейти из signed в unsigned
}
На вход (т.е. в переменную sample) кормим 24хбитные значения семплов.
Этот код - сигма-дельта второго порядка, для него характерен спад шума со скоростью 12дБ/октава, т.е. для верхней частоты, скажем в 20кГц шум будет снижен на 12*log2(280кГц/20кГц)=46дБ.
Ну и сам ШИМ, т.к. он 8 бит, имеет шум квантования -6*8=-48дБ. Итого, на частоте 20кГц шумы квантования не превысят -48-46дБ=-92дБ, что соответствует АЦП в 15 бит.
Осталось только отфильтровать до вменяемых значений собственно ШИМ (если это актуально). Скажем так, LPF четвертого порядка будет вполне адекватен.