#include #include #include #include #define A 5 //Maximum desired amplitude #define NBBITS 20 //Number of bits of the DAC #define PRECISION 10 //Number of points per period if the signal is not a square, must be even for the triangle void conversion(double tab[PRECISION], int conv[PRECISION]); void lagrange(double * tab, int branches, int precision); void conversionExp(double * tab, int * conv, int branches); int main (void) { int signalType, branches; float freq; int conv[PRECISION]; int convSquare[2]; int * convExp; printf("Choose the type of signal you want to use :\n1 Square\n2 Triangle\n3 Exponential\n4 Sawtooth Rise\n5 Sawtooth Fall\n"); scanf("%d",&signalType); printf("Choose the frequency\n"); scanf("%f",&freq); if(signalType == 1) //square { double square[2] = {0,A}; convSquare[0] = 0; convSquare[1] = pow(2,NBBITS)-1; printf("Signal values :\n%f\n %f\n",square[0],square[1]); } else { int i; if(signalType == 2) { double triangle[PRECISION]; for(i = 1; i <= (float)PRECISION/2 - 1; i++) { triangle[i] = (A/(PRECISION/2)) * i; triangle[PRECISION - i] = triangle[i]; } triangle[PRECISION/2] = A; conversion(triangle, conv); } else { if(signalType == 3) { int j, nbPoints, x; double point; printf("How many exponential branches for the signal ?\n"); scanf("%d",&branches); double * exp = malloc(branches*PRECISION*sizeof(double)); convExp = malloc(branches*PRECISION*sizeof(int)); for(i = 0; i < branches; i++) { for(j = 0; j < PRECISION; j++) { *(exp + PRECISION*i + j) = -50; } } for(i = 0; i < branches; i++) { printf("Branch %d, how many points ?\n",i + 1); scanf("%d", &nbPoints); for(j = 0; j < nbPoints; j++) { printf("Choose the coordinate for the point %d between 0 and %d\n", j + 1, PRECISION - 1); scanf("%d",&x); printf("Now choose the value\n"); scanf("%lf",&point); *(exp + PRECISION*i + x) = point; } } lagrange(exp, branches, PRECISION); conversionExp(exp, convExp, branches); } else { if(signalType == 4) { double stR[PRECISION]; for(i = 0; i < PRECISION; i++) { stR[i] = ((float)A/((float)PRECISION-1)) * i; } conversion(stR, conv); } else { if(signalType == 5) { double stF[PRECISION]; for(i = 0; i < PRECISION; i++) { stF[i] = A - ((A/((float)PRECISION-1)) * i); } conversion(stF, conv); } } } } } system("pause"); return 0; } void conversion(double tab[PRECISION], int conv[PRECISION]) { int i, j; for(i = 0; i < PRECISION; i++) { conv[i] = (int)((tab[i]/A) * (pow(2,NBBITS)-1)); printf("%d\n",conv[i]); for(j = 0; j < NBBITS; j++) { if(conv[i] & (1<<(NBBITS-j-1))) printf("1 "); else printf("0 "); } printf("\n"); } } void lagrange(double * tab, int branches, int precision) { double x[PRECISION]; double y[PRECISION]; double lPolynom; int i, j, k, l; int index; for(i = 0; i < branches; i++) { index = 0; for(j = 0; j < PRECISION; j++) { if(*(tab + i*PRECISION + j) != -50) { y[index] = *(tab + i*PRECISION + j); x[index] = j; index++; } } for(j = 0; j < PRECISION; j++) { if (*(tab + i*PRECISION + j) == -50) { *(tab + i*PRECISION + j) = 0; for(k = 0; k < index; k++) { lPolynom = 1; for(l = 0; l < index; l++) { if(l != k) lPolynom = lPolynom * ((double)j - x[l])/(x[k] - x[l]); } *(tab + i*PRECISION + j) = y[k]*lPolynom + *(tab + i*PRECISION + j); } } printf("%d %f\n",j, *(tab + i*PRECISION + j)); } } } void conversionExp(double * tab, int * conv, int branches) { int i, j, k; for(i = 0; i < branches; i++) { for(j = 0; j < PRECISION; j++) { *(conv + i*PRECISION + j) = (int)((*(tab + i*PRECISION + j)/A) * (pow(2,NBBITS)-1)); printf("%d\n",*(conv + i*PRECISION + j)); for(k = 0; k < NBBITS; k++) { if(*(conv + i*PRECISION + j) & (1<<(NBBITS-k-1))) printf("1 "); else printf("0 "); } printf("\n"); } } }