<< Chapter < Page | Chapter >> Page > |
This is a two-week lab. Your prelab is due a week after the quiz for Lab 4, and the quizzing occurs two weeks after thequiz for Lab 4.
Grading for this lab will be a bit different from past labs:
1 /* ECE320, Lab 5, Reference Implementation (Non-Optimized) */
2 /* Michael Frutiger 2/24/04 */
3
4 #include "v:/ece320/54x/dspclib/core.h" /* Declarations for core file */
5
6 main()
7 {
8 int *Rcvptr,*Xmitptr; /* pointers to Xmit & Rcv Bufs */
9 int r1,r2; // temp random bit storage
10 int symbol; // 0 for [00], 1 for [01], 2 for [10], 3 for [11]
11 int n; // dummy variable
12
13 int freqs[4] = {9, 13, 21, 17}; // 32*freqs
14 int phase[32];
15 int output[64]; // temp output storage
16
17
18 // Initial PN generator register contents
19 int seed = 1;
20
21 // Initial phase
22 int prev_phase = 0;
23
24
25 while( 1 )
26 {
27 /* Wait for a new block of samples */
28 WaitAudio(&Rcvptr,&Xmitptr);
29
30 // Get next two random bits
31 r1 = randbit( &seed );
32 r2 = randbit( &seed );
33 // Convert 2 bit binary number to decimal
34 symbol = series2parallel(r1,r2);
35
36 for (n=0; n<32; n++)
37 {
38 phase[n] = ( freqs[symbol]*n + prev_phase ) % 64; // get into 0 to 64 range
39 if (phase[n] > 32) phase[n]=phase[n]-64; // get into -32 to 32 range
40 phase[n] = phase[n] * 1024; // 1024=2^15*1/32
41 // [-2^15 2^15] range for use with
42 // SINE.asm
43 }
44 sine(&phase[0], &output[0], 32); // compute SINE, put result in output[0 -
31]
45 prev_phase = ( freqs[symbol]*32 + prev_phase ) % 64; // save current phase offset
46
47 // Get next two random bits
48 r1 = randbit( &seed );
49 r2 = randbit( &seed );
50 // Convert 2 bit binary number to decimal
51 symbol = series2parallel(r1,r2);
52
53 for (n=0; n<32; n++)
54 {
55 phase[n] = ( freqs[symbol]*n + prev_phase ) % 64;
56 if (phase[n] > 32) phase[n]=phase[n]-64;
57 phase[n] = phase[n] * 1024;
58 }
59 sine(&phase[0], &output[32], 32);
60 prev_phase = ( freqs[symbol]*32 + prev_phase ) % 64;
61
62
63 // Transfer the two symbols to transmit buffer
64 for (n=0; n<64; n++)
65 {
66 Xmitptr[6*n] = output[n];
67 }
68
69 }
70 }
71
72
73 // Converts 2 bit binary number (r2r1) to decimal
74 int series2parallel(int r2, int r1)
75 {
76 if ((r2==0)&&(r1==0)) return 0;
77 else if ((r2==0)&&(r1==1)) return 1;
78 else if ((r2==1)&&(r1==0)) return 2;
79 else return 3;
80 }
81
82 //Returns as an integer a random bit, based on the 15 low-significance bits in iseed (which is
83 //modified for the next call).
84 int randbit(unsigned int *iseed)
85 {
86 unsigned int newbit; // The accumulated XORs.
87 newbit = (*iseed >> 14) & 1 ^ (*iseed >> 13) & 1; // XOR bit 15 and bit 14
88 // Leftshift the seed and put the result of the XORs in its bit 1.
89 *iseed=(*iseed << 1) | newbit;
90 return (int) newbit;
91 }
Notification Switch
Would you like to follow the 'Ece 320 spring 2004' conversation and receive update notifications?