For BU9480F D-A Conv.

Dependencies:   mbed

Revision:
0:805cffac956b
Child:
1:02bfb013660c
diff -r 000000000000 -r 805cffac956b main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Aug 26 12:48:50 2010 +0000
@@ -0,0 +1,141 @@
+/* DPCM & Rice Golomb Lossless Audio Player and Realtime encoder */
+#include "mbed.h"
+#include "string"
+#include "SDHCFileSystem.h"
+#include "_bitio.h"
+//FILE    *infp,*outfp;
+SDFileSystem sd(p11, p12, p13, p14, "sd");
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+AnalogOut DACout(p18);
+Ticker tick;
+
+// a FIFO for the DAC
+volatile short DAC_fifo[1024];
+volatile short DAC_wptr=0;
+volatile short DAC_rptr=0;
+volatile short DAC_on;
+volatile short int DAC_diff=0;
+
+
+void encode(long int n);
+void decode(void);
+void dac_out();
+
+
+
+  
+int main() {
+
+    
+    if ( NULL == (infp = fopen( "/sd/test.rgm", "rb" )) ) {
+        printf( "\r\nError: The message file cannot be accessed\r\n" );
+        return -1;
+    }
+    //tick.detach();
+    tick.attach_us(&dac_out, 45); //set 22.050kHz sampling data    
+    decode();
+    tick.detach();    
+        
+    fclose( infp );
+    //fclose( outfp );  
+
+ 
+    
+    while (1);
+}
+
+void dac_out()
+{
+  //  printf("\t%d\r\n",DAC_diff);
+    if (DAC_diff > 0) {
+        led2 = 0;
+        DACout.write_u16(DAC_fifo[DAC_rptr]);
+        DAC_rptr=(DAC_rptr+1) & 0x3ff;
+        DAC_diff--;
+   }else led2 = 1;
+}
+void encode(long int n){
+    int zero_shift = 0;
+    
+    if(n < 0){
+        putbit(0);                    // sign (put 0:if n as negative)
+        n = -n;                        // n = abs(n)
+        //printf("\t 0");
+    }
+    else{ 
+        putbit(1);                    // sign (put 1:if n as positive)
+        //printf("\t 1");
+    }
+    zero_shift = (n >> (k));
+    //printf("\t shift= %d",zero_shift);
+    while(zero_shift > 0){
+
+        zero_shift--;
+        putbit(0);
+    }    // put n/(2^k) 0's
+    
+    putbit(1);                        // terminating "1"
+    putbits(k,rightbits(k,n));
+    //printf("\t finish= %d \r\n",(n & ((1U<<k)-1)));
+}
+
+
+
+void decode(void){
+    short dac_data;
+    long int decode_buff;
+    short diff,diff2;
+    unsigned int buff_sign,zero_shift;
+    //char flag;
+
+    diff = 0;
+    diff2 = 0;
+    // get sign(1 for positive, 0 for negative)
+    while(1){
+        
+        if((buff_sign = getbit())==OVERRUN)break;
+        zero_shift = 0;
+        while(getbit()==0)zero_shift++;
+        
+        decode_buff = (signed int)((1U << k)*zero_shift);
+        decode_buff += (getbits(k));
+        
+        if(!buff_sign)decode_buff =- decode_buff;
+        /* return decode_buff; */
+        diff =(diff + decode_buff);
+        
+        dac_data = ((int)diff + 32768) >> 1;
+        DAC_fifo[DAC_wptr]=dac_data;
+        DAC_wptr=(DAC_wptr+1) & 0x3ff;
+        DAC_diff=(DAC_diff+1);
+        while (DAC_diff >= 1023){
+            led1 = 1;
+        }   //wait
+        led1=0;
+        if(DAC_diff <= 0)
+            led2=1;
+        else led2=0;
+ 
+        
+        if((buff_sign = getbit())==OVERRUN)break;
+        zero_shift = 0;
+        while(getbit()==0)zero_shift++;
+        
+        decode_buff = (signed int)((1U << k)*zero_shift);
+        decode_buff += (getbits(k));
+        
+        if(!buff_sign)decode_buff =- decode_buff;
+        /* return decode_buff; */
+        diff2 =(diff2 + decode_buff);
+
+       /* 
+        drawc((unsigned char)diff2 & 0xff);
+        drawc((unsigned char)((diff2>>8) &0xff));
+        */
+        //fwrite(&diff2, sizeof(short int), 1, outfp);
+        
+    
+         
+    }
+}