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

Материал из Модулярная арифметики
Перейти к: навигация, поиск

Описание

Расчет 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

Пример (выходные данные)