(Prog) Расчет FIR-фильтра по стандартной формуле (Си)
Материал из Модулярная арифметики
Версия от 11:35, 10 июля 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