#include #include #include #include #define BYTE_PORDEFECTO 97 #define VTXON_PORDEFECTO 1200 #define BW_PORDEFECTO 1000 #define bit(code,i) (((code)>>(7-i))&1) #define sqr(x) ((x)*(x)) #define PI 3.1415926535897932384626433832795 static int byte=BYTE_PORDEFECTO; static int vtxon=VTXON_PORDEFECTO; static int bw=BW_PORDEFECTO; static int ancho_espectro=0; static int n_opt; static char NombreFich[255]; double a(int n, int caracter) { double suma = 0; int i; for (i = 0; i < 8; i++) suma += bit(caracter,i) * (sin (n * PI * (i + 1) / 4.0) - sin (n * PI * i / 4.0)); return suma / (n * PI); } double b(int n, int caracter) { double suma = 0; int i; for (i = 0; i < 8; i++) suma += bit(caracter,i) * (cos (n * PI * i / 4.0) - sin (n * PI * (i + 1) / 4.0)); return suma / (n * PI); } double a0(int caracter) { double suma = 0; int i; for (i = 0; i < 8; i++) suma += bit(caracter,i); return suma / 8; } int main(int argc, char **argv) { int n,nArmonicos,bit; float f,periodo; n_opt=1; while (n_opt0)?byte:1,byte); printf("- Vel. txon: %d bps\\n",vtxon); printf(" --> Duracion de un bit:\\n %5.4f ms \\n",(1.0/vtxon)*1000); printf(" --> Periodo de un byte:\\n %5.4f ms \\n",periodo*1000); printf(" --> Frec. fundamental:\\n %5.2f Hz \\n\\n",f); printf("- Ancho de banda del medio \\n(ideal): %5.2f Hz\\n",(float)bw); printf(" --> Numero de armonicos\\n pasantes: %d\\n\\n",nArmonicos); printf("\"at screen 0.7,0.8 left\n"); printf("set multiplot\n"); printf("set nokey\n"); printf("set size 0.7, 0.5\n"); printf("set origin 0.0, 0.5\n"); printf("set yrange [-0.5:1.5]\n"); printf("set ylabel \"Amplitud\"\n"); printf("set xlabel \"Tiempo (seg)\"\n"); printf("f=%f\n",f); printf("# Funcion que define el byte original que se transmite\n"); printf("byte(x)="); for (bit=0;bit<8;bit++) printf("(x<%f)?%d:",(bit+1)*(1.0/vtxon),bit(byte,bit)); printf("0\n"); printf("# Funcion que define la serie de Fourier como la suma de sus terminos\n"); for (n=1;n<=nArmonicos;n++) { printf("s%d(x) = %f*cos(2*pi*%d*f*x)+ ",n,a(n,byte),n); printf("(%f*sin(2*pi*%d*f*x))\n",b(n,byte),n); } printf("s(x)=%f",a0(byte)); for (n=1;n<=nArmonicos;n++) printf("+s%d(x)",n); printf("\n"); printf("set title \"Representacion de Fourier\"\n"); // Acá se daba el error en GNUPLOT 4.6: printf("plot [0:%f] byte(x) with lines 3, s(x) with lines 1\n",periodo); printf("plot [0:%f] byte(x) with lines, s(x) with lines\n",periodo); printf("set origin 0.0, 0.0\n"); FILE *FichArmonicos=fopen(NombreFich,"wt"); fprintf(FichArmonicos,"0.0 %f\n",a0(byte)); for (n=1;n<=nArmonicos;n++) fprintf(FichArmonicos,"%f %f\n",n*f,sqrt(sqr(a(n,byte))+sqr(b(n,byte)))); fclose(FichArmonicos); printf("set arrow 23 from %d,0 to %d,0.6 lt 3\n",bw,bw); printf("set yrange [0:1]\n"); printf("set ylabel \"Amplitud\"\n"); printf("set xlabel \"Frecuencia (Hz)\"\n"); printf("set title \"Analisis espectral\"\n"); printf("plot [0:%d] \"%s\" with impulse\n",ancho_espectro,NombreFich); return 0; }