00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "mlpdsp.h"
00024 #include "mlp.h"
00025
00026 static void ff_mlp_filter_channel(int32_t *state, const int32_t *coeff,
00027 int firorder, int iirorder,
00028 unsigned int filter_shift, int32_t mask, int blocksize,
00029 int32_t *sample_buffer)
00030 {
00031 int32_t *firbuf = state;
00032 int32_t *iirbuf = state + MAX_BLOCKSIZE + MAX_FIR_ORDER;
00033 const int32_t *fircoeff = coeff;
00034 const int32_t *iircoeff = coeff + MAX_FIR_ORDER;
00035 int i;
00036
00037 for (i = 0; i < blocksize; i++) {
00038 int32_t residual = *sample_buffer;
00039 unsigned int order;
00040 int64_t accum = 0;
00041 int32_t result;
00042
00043 for (order = 0; order < firorder; order++)
00044 accum += (int64_t) firbuf[order] * fircoeff[order];
00045 for (order = 0; order < iirorder; order++)
00046 accum += (int64_t) iirbuf[order] * iircoeff[order];
00047
00048 accum = accum >> filter_shift;
00049 result = (accum + residual) & mask;
00050
00051 *--firbuf = result;
00052 *--iirbuf = result - accum;
00053
00054 *sample_buffer = result;
00055 sample_buffer += MAX_CHANNELS;
00056 }
00057 }
00058
00059 void ff_mlpdsp_init(MLPDSPContext *c)
00060 {
00061 c->mlp_filter_channel = ff_mlp_filter_channel;
00062 if (ARCH_X86)
00063 ff_mlpdsp_init_x86(c);
00064 }