Курю я тут потихонечку ЦОС, в частности пытаюсь сделать CIC decimator. В теории я подкован плохо, стараюсь понять на практике. Готового кода на си не нашёл, накидал максимально в лоб со схемы. Но результаты на выходе получаются странные. Обычный двуполярный синус от -1 до 1 почему-то оказывается полностью сдвинут в положительную область, а амплитуда получается точно обратно пропорциональна частоте. Хотя АЧХ на низких частотах должна быть более-менее горизонтальной, а у меня как будто растет в бесконечность. Вот код, может есть какой-то очевидный косяк, который я в упор не замечаю. Или я что-то не понимаю в теории. Z^-1 это же просто предыдущее значение, там же нет никаких делений?
Код: Выделить всё
void cicDecimation(double *in, double *out, int n)
{
const int R=8;
const int N=2;
int i;
double acc1=0,acc2=0;
double cc1=0,cc2=0;
double iz1=0,iz2=0;
double cz1=0,cz2=0;
for(i=0;i<n;i++)
{
acc1=in[i]+iz1;
iz1=acc1;
acc2=acc1+iz2;
iz2=acc2;
if(i%R==0)
{
cc1=acc2-cz1;
cz1=acc2;
cc2=cc1-cz2;
cz2=cc2;
out[i/R]=cc2;
}
}
}