(Prog) Расчет FIR-фильтра по стандартной формуле (Си)
Материал из Модулярная арифметики
Версия от 13:05, 15 июля 2013; Turbo (обсуждение | вклад)
Содержание
Описание
Расчет FIR-фильтра (КИХ-фильтра) по стандартной формуле для линейной свертки.
Исходник
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define NL 1000
/*
Простейший подход - действуем по определению свертки
*/
int calc_fir_filter_deafult(
int *vec1,
int len1,
int *vec2,
int len2,
int *out)
{
int i, j;
for (i = 0; i < len1+len2-1; i++) {
out[i] = 0;
printf("res[%d] = ", i);
for (j = (i-len2+1 > 0)?(i-len2+1):0; j <= i; j++) {
if (j >= len1)
break;
out[i] += vec1[j]*vec2[i-j];
if (len1 < 10 && len2 < 10)
printf("a[%d]*b[%d] + ", j, i-j);
}
printf(" = %d\n", out[i]);
}
return 0;
}
int main ()
{
int i, z;
double maxVal;
int filter[NL];
int filterLen;
int testArray[100*NL];
int arrayLen;
int dataBit;
int res[10*NL];
freopen("input.txt", "r", stdin);
scanf("%d", &z);
while(z--) {
scanf("%d %d %d", &dataBit, &filterLen, &arrayLen);
for (i = 0; i < filterLen; i++) {
scanf("%d", &(filter[i]));
}
for (i = 0; i < arrayLen; i++) {
scanf("%d", &(testArray[i]));
}
}
maxVal = pow(2.0, 2*dataBit)*(filterLen+arrayLen);
printf("Max value: %.0lf\n", maxVal);
calc_fir_filter_deafult(filter, filterLen, testArray, arrayLen, res);
return 0;
}
Входные/выходные данные
Формат входных/выходных данных для FIR-фильтра
Пример (входные данные)
1 4 4 8 3 0 1 2 4 3 5 1 5 6 3 2
Пример (выходные данные)
Max value: 3072 res[0] = a[0]*b[0] + = 12 res[1] = a[0]*b[1] + a[1]*b[0] + = 9 res[2] = a[0]*b[2] + a[1]*b[1] + a[2]*b[0] + = 19 res[3] = a[0]*b[3] + a[1]*b[2] + a[2]*b[1] + a[3]*b[0] + = 14 res[4] = a[0]*b[4] + a[1]*b[3] + a[2]*b[2] + a[3]*b[1] + = 26 res[5] = a[0]*b[5] + a[1]*b[4] + a[2]*b[3] + a[3]*b[2] + = 29 res[6] = a[0]*b[6] + a[1]*b[5] + a[2]*b[4] + a[3]*b[3] + = 16 res[7] = a[0]*b[7] + a[1]*b[6] + a[2]*b[5] + a[3]*b[4] + = 22 res[8] = a[1]*b[7] + a[2]*b[6] + a[3]*b[5] + = 15 res[9] = a[2]*b[7] + a[3]*b[6] + = 8 res[10] = a[3]*b[7] + = 4