elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Convolución Circular
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Convolución Circular  (Leído 6,834 veces)
drbeat

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Convolución Circular
« en: 2 Marzo 2011, 13:55 pm »

Código
  1. /*Declaración de funciones*/
  2. void conv(int dim1,int x[],int dim2,int h[],int y[]);
  3.  
  4.  
  5. /*Funcion main*/
  6. int main()
  7. {
  8. int i;
  9.  printf("Introduzca la dimension del vector de entrada: ");
  10.  scanf("%d",&dim1);
  11.  
  12.   xn = malloc(dim1 * sizeof (int));
  13.  
  14.  
  15.   printf("Introduce los valores del primer vector:\n");
  16.   for (i=0; i<dim1; i++) {
  17.     printf("\nElemento %d: ", i+1);
  18.     scanf("%d", &aux);
  19.     *(xn+i)= aux;  
  20.   }
  21.   printf("\n");
  22.  
  23.   printf("Introduzca la dimension del segundo vector: ");
  24.    scanf("%d",&dim2);
  25.  
  26.    hn = malloc(dim2 * sizeof (int));
  27.  
  28.   printf("Introduce los valores del segundo vector:\n");
  29.   for (i=0; i<dim2; i++) {
  30.     printf("\nElemento %d: ", i+1);
  31.     scanf("%d", &aux);
  32.     *(hn+i)=aux;
  33.   }
  34.  
  35.   yn = malloc((dim1+dim2-1) * sizeof (int));
  36.  
  37. if(dim1<=dim2)
  38. {
  39. int dimcirc=dim2;
  40. conv(dim1,xn,dim2,hn,yn);
  41.  
  42.  
  43. printf("Dimension de la Convolucion Circular=%d \n" , dimcirc);
  44. zn = malloc(dimcirc * sizeof (int));
  45. zi=0;
  46.  
  47.  
  48. wn = malloc(dimcirc * sizeof (int));
  49. k=dim2-dim1-2;
  50. q=dim1+dim2-2;
  51.  
  52.  
  53. for(j=dimcirc-1;j>=0;j--)
  54. {
  55. *(zn+j)=0;
  56. *(wn+j)=0;
  57. *(wn+j)=*((yn+(q%dimcirc))+j);
  58. *(zn+j)=*((yn+(k%dimcirc))-j);
  59. }
  60.  
  61.  
  62. for(zi=0;zi<dimcirc;zi++)
  63. {
  64. printf("zn:[%d]=%d \n",zi,(*(zn-zi)+*(wn-zi)));
  65. }
  66. }
  67. else
  68. {
  69. int dimcirc=dim1;
  70. paux = xn;
  71. xn = hn;
  72. hn = paux;
  73. conv(dim2,xn,dim1,hn,yn);
  74. printf("Dimension de la Convolucion Circular=%d \n" , dimcirc);
  75. zn = malloc(dimcirc * sizeof (int));
  76. zi=0;
  77.  
  78. wn = malloc(dimcirc * sizeof (int));
  79. k=dim1-dim2-2;
  80. q=dim1+dim2-2;
  81.  
  82.  
  83. for(j=dimcirc-1;j>=0;j--)
  84. {
  85. *(zn+j)=0;
  86. *(wn+j)=0;
  87. *(wn+j)=*((yn+(q%dimcirc))+j);
  88. *(zn+j)=*((yn+(k%dimcirc))-j);
  89. }
  90. for(zi=0;zi<dimcirc;zi++)
  91. {
  92. printf("zn:[%d]=%d \n",zi,(*(zn-zi)+*(wn-zi)));
  93. }
  94. }
  95.  
  96.  
  97.  
  98. }
  99.  
  100.  
  101.  
  102.  
  103. void conv(int dim1,int x[],int dim2,int h[],int y[])
  104. {
  105. /*Declaro e Inicializo las variables contador de los vectores*/
  106. int xi=0,yi=0,hi=0;
  107. int dimres=dim1+dim2-1;
  108. printf("Dimensión de la Convolución Lineal=%d \n",dimres);
  109. for(xi=0;xi<dim1;xi++)
  110. {
  111.  
  112. for(hi=0;hi<dim2;hi++)
  113. {
  114. y[xi+hi]=(y[xi+hi]+x[xi]*h[hi]);
  115.  
  116.  
  117. }
  118.  
  119. }
  120. for(yi=0;yi<dimres;yi++)
  121. { printf("yn:[%d]=%d \n",yi,y[yi]);
  122. }
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129. }
  130.  


« Última modificación: 2 Marzo 2011, 15:57 pm por drbeat » En línea

drbeat

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Convolución Circular
« Respuesta #1 en: 2 Marzo 2011, 14:08 pm »

Hola buenas!
A pesar de ser nuevo en el foro a partir de ahora me veréis más por aquí.
Soy estudiante de teleco y estoy tratando de realizar la simulación de la convolución lineal y circular de 2 señales digitales genéricas en código C. A pesar de lo raro que os suene a algunos, no son más que 2 arrays unidimensionales que interactúan entre ellos.  El usuario elige previamente el numero de elementos de cada uno y cada valor.
En la convolucion lineal, se multiplican y se suman siendo el numero de elementos del resultado = numelementos1ºvector + numelementos2ºvector -1    ;y en la circular, el resultado de ésta y el vector mas pequeño deben tener el mismo numero de elementos que el primero y normalmente se implementa en código la Transformada de Fourier Discreta (DFT). Pero para evitar a Fourier, se coge el cacho correspondiente al array resultado de la convolucion lineal que cuadre con el numero de elementos del mayor vector, y al vector mas pequeño se le añaden ceros para despues sumar ambos y obtener el resultado.
Para que me comprendais mejor,  la convolucion se puede comprobar en Matlab haciendo y=conv(a,b) para la lineal  y=ifft(fft(a).*fft(b))   para la circular, siendo a y b dos vectores cualesquiera.

Dado mis conocimientos básiquisimos de programación y que hace años que no me topo con el lenguaje C, posteo este hilo para vuestro deleite.
El problema seguramente lo tenga al operar y en mis bucles "for" irrisorios.
Se agradece un cable ;)

Un saludin :)


« Última modificación: 2 Marzo 2011, 14:14 pm por drbeat » En línea

drbeat

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Convolución Circular
« Respuesta #2 en: 2 Marzo 2011, 14:16 pm »

Nota:

En el código la funcion conv solo hace la convolucion lineal y de momento parece que funciona.
La convolución circular la trato de hacer justo después pero en el cuerpo de la main y no hay manera chico...  :-\
En línea

drbeat

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Convolución Circular
« Respuesta #3 en: 2 Marzo 2011, 15:18 pm »

No sé si estoy operando correctamente con los punteros *zn y *wn.
Lo que hago es reservar memoria previamente para ellos utilizando malloc, pero me gustaría usar calloc con el puntero *zn y da un error de memoria...  :-\
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Convolución Circular
« Respuesta #4 en: 2 Marzo 2011, 15:45 pm »

Deberías colocar el código dentro de las etiquetas GeSHi seleccionando la opción para código C:

Solo para que se entienda mejor y no sea tedioso leerlo!
Saludos
« Última modificación: 2 Marzo 2011, 23:01 pm por gankutsuo » En línea

drbeat

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Convolución Circular
« Respuesta #5 en: 2 Marzo 2011, 15:57 pm »

sorry!  :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en nodo de lista circular
Java
apolo85 3 4,968 Último mensaje 28 Noviembre 2009, 03:57 am
por egyware
Cola circular estatica
Java
soser 5 23,122 Último mensaje 14 Marzo 2017, 13:56 pm
por Orubatosu
una lista circular en c#
.NET (C#, VB.NET, ASP)
Fingerling 2 12,955 Último mensaje 24 Septiembre 2010, 17:23 pm
por -=[ §ÂßÂÑÐØ ]=-
General Motors presentará en 2017 un Cadillac capaz de circular sin que el ...
Noticias
wolfbcn 0 1,218 Último mensaje 9 Septiembre 2014, 02:13 am
por wolfbcn
Mantener un directorio circular con X ficheros, eliminando los más antiguos
Scripting
genosida 6 2,474 Último mensaje 10 Septiembre 2019, 12:55 pm
por genosida
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines