Теперь очень не удобно вычислять промежуточное значение в звене 2-го порядка:
wk = (sk*x(n) - a1*w1 - a2*w2) * 2^-14;
Получается, что два младших бита находятся в младшем слове аппаратного умножителя, а остальные в старшем. Контроллер - MSP430. Его аппаратный умножитель сдвигать результат не умеет.
Можно как-то сделать так, чтоб результат весь находился в старшем слове?
Это МАТЛАБовский код:
Код
Nsamp = 15000;
Fsamp = 1500;
freq = 5;
t = 0:(1/Fsamp):10;
t(end) = [];
x = sin (2*pi*freq*t) * 2048 + 2048;
sk = 15045;
a1 = -2639;
a2 = -13707;
b0 = 16384;
b1 = 0;
b2 = -16384;
for n = 1:Nsamp
wk = (sk*x(n) - a1*w1 - a2*w2) * 2^-14;
y(n) = (b0*wk + b1*w1 + b2*w2) * 2^-14;
w2 = w1; w1 = wk;
end
Fsamp = 1500;
freq = 5;
t = 0:(1/Fsamp):10;
t(end) = [];
x = sin (2*pi*freq*t) * 2048 + 2048;
sk = 15045;
a1 = -2639;
a2 = -13707;
b0 = 16384;
b1 = 0;
b2 = -16384;
for n = 1:Nsamp
wk = (sk*x(n) - a1*w1 - a2*w2) * 2^-14;
y(n) = (b0*wk + b1*w1 + b2*w2) * 2^-14;
w2 = w1; w1 = wk;
end