(Prog) Расчет FIR-фильтра по стандартной формуле (Си)

Материал из Модулярная арифметики
Версия от 13:05, 15 июля 2013; Turbo (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Описание

Расчет FIR-фильтра (КИХ-фильтра) по стандартной формуле для линейной свертки.

Исходник

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define NL 1000
  6.  
  7. /*
  8. Простейший подход - действуем по определению свертки
  9. */
  10.  
  11. int calc_fir_filter_deafult(
  12. 	int *vec1,
  13. 	int len1,
  14. 	int *vec2,
  15. 	int len2,
  16. 	int *out) 
  17. {
  18. 	int i, j;
  19. 	for (i = 0; i < len1+len2-1; i++) {
  20. 		out[i] = 0;
  21. 		printf("res[%d] = ", i);
  22. 		for (j = (i-len2+1 > 0)?(i-len2+1):0; j <= i; j++) {
  23. 			if (j >= len1)
  24. 				break;
  25. 			out[i] += vec1[j]*vec2[i-j];
  26. 			if (len1 < 10 && len2 < 10)
  27. 				printf("a[%d]*b[%d] + ", j, i-j);
  28. 		}
  29. 		printf(" = %d\n", out[i]);
  30. 	}
  31. 	return 0;
  32. }
  33.  
  34. int main ()
  35. {
  36. 	int i, z;
  37. 	double maxVal;
  38.  
  39. 	int filter[NL];
  40. 	int filterLen;
  41. 	int testArray[100*NL];
  42. 	int arrayLen;
  43. 	int dataBit;
  44. 	int res[10*NL];
  45.  
  46. 	freopen("input.txt", "r", stdin);
  47.  
  48. 	scanf("%d", &z);
  49. 	while(z--) {
  50. 		scanf("%d %d %d", &dataBit, &filterLen, &arrayLen);
  51. 		for (i = 0; i < filterLen; i++) {
  52. 			scanf("%d", &(filter[i]));
  53. 		}
  54. 		for (i = 0; i < arrayLen; i++) {
  55. 			scanf("%d", &(testArray[i]));
  56. 		}
  57. 	}
  58.  
  59. 	maxVal = pow(2.0, 2*dataBit)*(filterLen+arrayLen);
  60. 	printf("Max value: %.0lf\n", maxVal);
  61.  
  62. 	calc_fir_filter_deafult(filter, filterLen, testArray, arrayLen, res);
  63.  
  64. 	return 0;
  65. }

Входные/выходные данные

Формат входных/выходных данных для 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