FIRフィルタのプログラムで浮動小数点演算を使わずに実装
したいのですが、普通係数hnは浮動小数点ですよね。
入力のadは24ビットで係数hnを32768倍して固定小数点にして
最後に32768で割ろうとしたのですが、hn[k] * xn[k]の部分で
オーバーフローの可能性がでてきます。
回避するよいやり方はないでしょうか?

#define ORDER_2 50
static double xn[ORDER+1];
long firFilter(long ad)
{
long yn, acc;
int k;

xn[0] = ad;

acc = 0.0;
for (k = 0; k <= ORDER; k++) /* multiply and accumulate */
acc = acc + hn[k] * xn[k];
yn = acc;
for (k = ORDER; k > 0; k--) /* shift input samples */
xn[k] = xn[k-1];
return yn; /* output */
}