00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "dsp.h"
00049
00050 #if defined(FORCE_ALL_GENERICS) || \
00051 defined(FORCE_GENERIC_FILT16_LPFIRDESIGN) || \
00052 !defined(TARGET_SPECIFIC_FILT16_LPFIRDESIGN)
00053
00054 #ifndef Max
00055 # define Max(a, b) (((a) > (b)) ? (a) : (b))
00056 #endif
00057
00058 #define DSP16_MUL_TO_DSP32(num1, num2) \
00059 ((DSP32_QB > DSP16_QB*2)? \
00060 ((((S32) (num1)) * ((S32) (num2))) << (DSP32_QB - DSP16_QB*2)) \
00061 :((((S32) (num1)) * ((S32) (num2))) >> (DSP16_QB*2 - DSP32_QB)))
00062
00063 #define DSP32_DIV_TO_DSP16(num1, num2) \
00064 ((DSP32_QB > DSP16_QB*2)? \
00065 (((num1) >> (DSP32_QB - DSP16_QB*2)) / ((S32) (num2))) \
00066 :(((num1) << (DSP16_QB*2 - DSP32_QB)) / ((S32) (num2))))
00067
00068 void dsp16_filt_lpfirdesign(dsp16_t *c, int fc, int fs, int order, dsp16_win_fct_t dsp16_win_fct, dsp_filt_design_options_t options)
00069 {
00070 S32 n_fc;
00071 S32 s32_temp1;
00072 S32 s32_temp2;
00073 dsp16_t dsp16_temp;
00074 int num, i;
00075 dsp32_t dsp32_temp;
00076 dsp16_t norm;
00077
00078 if (!order)
00079 return;
00080
00081 n_fc = (((S32) fc) << (DSP16_QB + 1)) / fs;
00082 num = order / 2 + 1;
00083
00084 if (options == DSP_FILT_DESIGN_OPTIONS_NORMALIZE)
00085 {
00086
00087 c[0] = (n_fc / 2);
00088
00089 for(i=1; i<order; i++)
00090 {
00091 s32_temp1 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, (double) i + 1.) / num;
00092 s32_temp2 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, CST_PI * ((double) i + 1.)) / num;
00093 s32_temp2 >>= 1;
00094 dsp32_temp = dsp32_op_sin(DSP16_MUL_TO_DSP32(s32_temp1, n_fc));
00095 dsp16_temp = DSP32_DIV_TO_DSP16(dsp32_temp, s32_temp2);
00096 c[i] = dsp16_temp;
00097 }
00098
00099 norm = dsp16_op_abs(dsp16_vect_max(c, order));
00100 norm = Max(norm, dsp16_op_abs(dsp16_vect_min(c, order)));
00101
00102
00103 if (dsp16_win_fct)
00104 dsp16_win_fct(c, order);
00105 else
00106 {
00107 for(i=0; i<order; i++)
00108 c[i] = DSP16_Q(1.);
00109 }
00110
00111 c[0] = dsp16_op_div(dsp16_op_mul(c[0], n_fc), norm);
00112 for(i=1; i<order; i++)
00113 {
00114 s32_temp1 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, (double) i + 1.) / num;
00115 s32_temp2 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, CST_PI * ((double) i + 1.));
00116 s32_temp2 = (((S64) s32_temp2) * norm) >> DSP16_QB;
00117 s32_temp2 = s32_temp2 / num + 1;
00118 dsp32_temp = dsp32_op_sin(DSP16_MUL_TO_DSP32(s32_temp1, n_fc));
00119 dsp16_temp = DSP32_DIV_TO_DSP16(dsp32_temp, s32_temp2);
00120 c[i] = dsp16_op_mul(c[i], dsp16_temp);
00121 }
00122 }
00123 else
00124 {
00125
00126 if (dsp16_win_fct)
00127 dsp16_win_fct(c, order);
00128 else
00129 {
00130 for(i=0; i<order; i++)
00131 c[i] = DSP16_Q(1.);
00132 }
00133 c[0] = dsp16_op_mul(c[0], n_fc);
00134 for(i=1; i<order; i++)
00135 {
00136 s32_temp1 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, (double) i + 1.) / num;
00137 s32_temp2 = (S32) DSP_Q(32 - DSP16_QB, DSP16_QB, CST_PI * ((double) i + 1.)) / num;
00138 dsp32_temp = dsp32_op_sin(DSP16_MUL_TO_DSP32(s32_temp1, n_fc));
00139 dsp16_temp = DSP32_DIV_TO_DSP16(dsp32_temp, s32_temp2);
00140 c[i] = dsp16_op_mul(c[i], dsp16_temp);
00141 }
00142 }
00143 }
00144
00145 #endif