소스 검색

Merge branch 'master' of ssh://git.davidventura.com.ar:443/david/orga2-simd

Fabian 11 년 전
부모
커밋
1325c50c67
1개의 변경된 파일17개의 추가작업 그리고 5개의 파일을 삭제
  1. 17 5
      filtros/blur_c.c

+ 17 - 5
filtros/blur_c.c

@@ -3,7 +3,7 @@
 #include <math.h>
 #define M_PI 3.14159265358979323846
 #include "../tp2.h"
-
+#define DEBUG 0
 /**
 *	Calculo la matriz de convulsión.
 *	Hago el calculo de todos los componentes.
@@ -13,16 +13,27 @@
 float* convulcion_matrix(float sigma, int r) {
 	unsigned int contador = 0;
 	unsigned int largo = 2*r + 1;
-	float* conv_matrix = malloc(sizeof(float)*largo*largo);
+	unsigned int diff = largo+ 4-(largo % 4);
+	unsigned int tam = diff*largo;
+	float* conv_matrix = malloc(sizeof(float)*tam);
 
+	if (DEBUG)
+		printf("Sigma: %f | Radio: %d \n", sigma,r);
 	// Recorro cada pixel
 	for (int y = -r; y <= r; y++) {
-		for (int x = -r; x <= r; x++) {
+		for (int x = -r; x <= r+1; x++) {
 			// Por cada pixel obtengo la sub-matriz de convulsion para cada componente
-			//printf("Sigma: %f | Radio: %d | X: %d | Y: %d | Gauss: %f \n", sigma, r, x, y, (1 / (2*M_PI*sigma*sigma)) * exp(- (pow(x,2)+pow(y,2))/(2*sigma*sigma)));
-			conv_matrix[contador] = (1 / (2*M_PI*sigma*sigma)) * exp(- (pow(x,2)+pow(y,2))/(2*sigma*sigma));
+			if (x==r+1) { //Con esta idea, la matriz siempre tiene mult de 4 columnas, son todas 0 entonces no me afecta
+				conv_matrix[contador] = 0;
+			} else {
+				conv_matrix[contador] = (1 / (2*M_PI*sigma*sigma)) * exp(- (pow(x,2)+pow(y,2))/(2*sigma*sigma));
+			}
+			if (DEBUG)
+				printf("%.8f\t", conv_matrix[contador]);
 			contador++;
 		}
+		if (DEBUG)
+			printf("\n");
 	}
 	return conv_matrix;
 }
@@ -43,6 +54,7 @@ void blur_c(unsigned char *src, unsigned char *dst, int cols, int filas, float s
 			// Recorro la submatriz que le corresponde al pixel actual y hago las multiplicaciones
 			for(y=-r; y<=r; y++) {
 				for(x=-r; x<=r; x++) {
+					//En C nunca veo la ultima posicion (0) de la matriz
 					tmp[0]+=src_matrix[i+y][4*(x+j)+0] * mc[matPos];
 					tmp[1]+=src_matrix[i+y][4*(x+j)+1] * mc[matPos];
 					tmp[2]+=src_matrix[i+y][4*(x+j)+2] * mc[matPos];