DSPRelated.com
Forums

Re: FW: Re: reading values from aic23d codec in c6713 dsk

Started by Jeff Brower February 9, 2007
Pablo-

> Jeff, I follow your advice and I got that it sounds. However,
> I have done some changes and tests in order to be sure that I understand perfectly
> the codec working. Unfortunately I don't. My first test was to erase this line:
> while (!DSK6713_AIC23_write(hCodec, rch)); /* write right ch */
> I dissapoint a bit because without this line, the sound is still
> happening, and through the two headphones. I expected to hear the noise by only one
> channel.
> Why this happen??

With only one line, you are alternating writes to left and write channels. That cuts
the sampling rate in half, and also "splits out" on two channels what you expect to
hear on just one channel.

What you should try is keep the second DSK6713_AIC23_write() call but set rch to
zero. Then you should hear "nothing" on the right channel.

> I also tried to set masks to the channels registers (leftch and
> rightch) leaving only the first or the last 16 bits (I think this is the way to get
> the two channels values by separate).
>
> leftch = sinetable[sample];
> rightch = -leftch;
> leftch=(leftch&0x0000FFFF); /*or also leftch=(leftch&0xFFFF0000);*/
>
> the results are very different with these two masks: with the first one
> (0x0000FFFF) nothing is heard, but the sound does appear with the second
> (0xFFFF0000).
>
> Can you explain me why I am really getting with these masks and why is the reason
> of this behaviour??

Even though lch and rch are ints (int32), they only contain 16-bit signed codec
values. To reflect this, the Spectrum Digital APIs should be called:

DSK6713_AIC23_write16()
DSK6713_AIC23_read16()

as they are with other DSKs, but unfortunately for DSK 6713 they are not.

-Jeff

> >From: Jeff Brower
>
> >To: Pablo L.Sordo Martez
> >CC: c...
> >Subject: Re: [c6x] reading values from aic23d codec in c6713 dsk
> >Date: Tue, 06 Feb 2007 11:06:30 -0600
> >
> >Pablo-
> >
> > > DSK6713_AIC23_CodecHandle hCodec;
> > > Int16 msec, sample;
> > > Uint32 leftch, rightch;
> > >
> > > (...)
> > >
> > > /* Generate a 1KHz sine wave for 5 seconds */
> > > for (msec = 0; msec < 5000; msec++)
> > > {
> > > for (sample = 0; sample < SINE_TABLE_SIZE; sample++)
> > > { leftch=(sinetable[sample]<<16);
> > > /* Send a sample to the left channel */
> > > while (!DSK6713_AIC23_write(hCodec, leftch));
> > >
> > > rightch=(sinetable[sample]>>16);
> > > /* Send a sample to the right channel */
> > > while (!DSK6713_AIC23_write(hCodec, rightch));
> > > }
> > > }
> > >
> > > I take the 16 bit sample and turn into a 32bit variable. As
> you
> > > said, lefch has the first 16 bits with the value of the sample. On the other
> hand,
> > > rightch has the last 16 bits with the value of the sample. Is this correct?? I
> > > don't think so, because I have loaded it on the board and it doesn't sound.
> What is
> > > the mistake??
> >
> >I had written another post to Joshy indicating that I was incorrect and 2x 16-bit
> >reads/writes are needed. Suggest to try this:
> >
> >short int i;
> >int lch, rch;
> >
> > while (1) {
> >
> > for (i=0; i>
> > lch = sinetable[i];
> > rch = -lch;
> >
> > while (!DSK6713_AIC23_write(hCodec, lch)); /* write left ch */
> > while (!DSK6713_AIC23_write(hCodec, rch)); /* write right ch */
> > }
> > }
> >
> >You should hear continuous tone on both channels, with no static or pops. Each
> >channel should sound the same, but if you look with dig scope, they should be 180
> out
> >of phase. Frequency of the tone should be sampling rate / length of sine table.
> For
> >example if sampling rate is 16 kHz, then you should hear 62.5 Hz tone (assuming
> sine
> >table length is 256 -- I don't know that offhand). Note that if you set the
> sampling
> >rate too low, then you won't hear the tone (but you can still see it on the
> scope).
> >
> >-Jeff
> >
> > >
> -----------
> > >
> > > From: Jeff Brower
> > > To: Joshy Jose
> > > CC: c...
> > > Subject: Re: [c6x] reading values from aic23d codec in c6713 dsk
> > > Date: Fri, 02 Feb 2007 14:08:12 -0600
> > >
> > > Joshy-
> > >
> > > > i need to take values from audio codec in c6713 dsk?
> > > > as there are two lines (left , right) microphone input , i need to
> > > > take values from each line seperately, and process it
> > > > i have tried with the function
> > > > DSK6713_AIC23_read() available in the dsk but i could not successfuly do it
> > > > i used
> > > > while (!DSK6713_AIC23_read(hCodec, data ));
> > > > while (!DSK6713_AIC23_read(hCodec, data ));
> > > >
> > > > to get two line values,
> > > >
> > > > what is the correct way to do this?
> > >
> > > Each call to DSK6713_AIC23_read() should return a 32-bit value, with high and
> low
> > > words being the 2 channel (line) samples. Check this post for some example C
> code:
> > >
> > > http://www.dsprelated.com/groups/c6x/show/6704.php
> > >
> > > In your code above, you are actually waiting for four (4) values, discarding
> the
> > > first 2, and therefore cutting the sampling rate in half.
> > >
> > > -Jeff


         Hi Jeff,


               I have followed your advices again and I have kept the second DSK6713_AIC23_write();. The results haven't been what you told me. I have thought that the problem might be in hardware. I am using loudspeakers (left and right) to hear the "sounds" from the board. So, withe the changes you suggested me, I expected to hear noise in lefch and nothing in rightch. Unfortunately, I hear sound by both and I don't understand why.


1) Does loudspeakers separate sound of the two channels, I mean, rightch matches with right loudspeaker and lefch matches with left one?? (I add the code)


void main()
{
    DSK6713_AIC23_CodecHandle hCodec;
                      [...]
    /* Start the codec */
    hCodec = DSK6713_AIC23_openCodec(0, &config);
     
    while(DSK6713_DIP_get(0)==1)   
    { /* Generate a 1KHz sine wave for 5 seconds */
      for (msec = 0; msec < 5000 ; msec++)
      {  for (sample = 0; sample < SINE_TABLE_SIZE; sample++)
         {  leftch = sinetable[sample];  
          
rightch=0x00000000;  

           while (!DSK6713_AIC23_write(hCodec, leftch)); /* write left ch */
           while(!DSK6713_AIC23_write(hCodec, rightch)); /* write right ch */
            }
        }


  }            [...]


2) Can I produce a song with CCS and reproduce it with AIC23??


3) Why is neccesary to use while (!DSK6713_AIC23_write( , )); instead of DSK6713_AIC23_write( , );?? What are the differences??


           Thanks in advance,


        Pablo L.







From: Jeff Brower <j...@signalogic.com>
To: Pablo L.Sordo Martez <s...@hotmail.com>
CC: c...
Subject: Re: FW: Re: [c6x] reading values from aic23d codec in c6713 dsk
Date: Thu, 08 Feb 2007 15:50:17 -0600






Pablo-

> Jeff, I follow your advice and I got that it sounds. However,
> I have done some changes and tests in order to be sure that I understand perfectly
> the codec working. Unfortunately I don't. My first test was to erase this line:
> while (!DSK6713_AIC23_write(hCodec, rch)); /* write right ch */
> I dissapoint a bit because without this line, the sound is still
> happening, and through the two headphones. I expected to hear the noise by only one
> channel.
> Why this happen??

With only one line, you are alternating writes to left and write channels. That cuts
the sampling rate in half, and also "splits out" on two channels what you expect to
hear on just one channel.

What you should try is keep the second DSK6713_AIC23_write() call but set rch to
zero. Then you should hear "nothing" on the
right channel.

> I also tried to set masks to the channels registers (leftch and
> rightch) leaving only the first or the last 16 bits (I think this is the way to get
> the two channels values by separate).
>
> leftch = sinetable[sample];
> rightch = -leftch;
> leftch=(leftch&0x0000FFFF); /*or also leftch=(leftch&0xFFFF0000);*/
>
> the results are very different with these two masks: with the first one
> (0x0000FFFF) nothing is heard, but the sound does appear with the second
> (0xFFFF0000).
>
> Can you explain me why I am really getting with these masks and why is the reason
> of this behaviour??

Even though lch and rch are ints (int32), they only contain 16-bit signed codec
values. To reflect this, the Spectrum Digital APIs should be
called:

DSK6713_AIC23_write16()
DSK6713_AIC23_read16()

as they are with other DSKs, but unfortunately for DSK 6713 they are not.

-Jeff


> >From: Jeff Brower
>
> >To: Pablo L.Sordo Martez
> >CC: c6x@yahoogroups.com
> >Subject: Re: [c6x] reading values from aic23d codec in c6713 dsk
> >Date: Tue, 06 Feb 2007 11:06:30 -0600
> >
> >Pablo-
> >
> > > DSK6713_AIC23_CodecHandle hCodec;
> > > Int16 msec, sample;
> > > Uint32 leftch, rightch;
> > >
> > > (...)
> > >
> > > /* Generate a 1KHz sine wave for 5 seconds */
> > > for (msec = 0; msec < 5000; msec++)
> > > {
> > > for (sample = 0; sample <
SINE_TABLE_SIZE; sample++)
> > > { leftch=(sinetable[sample]<<16);
> > > /* Send a sample to the left channel */
> > > while (!DSK6713_AIC23_write(hCodec, leftch));
> > >
> > > rightch=(sinetable[sample]>>16);
> > > /* Send a sample to the right channel */
> > > while (!DSK6713_AIC23_write(hCodec, rightch));
> > > }
> > > }
> > >
> > > I take the 16 bit sample and turn into a 32bit variable. As
> you
> > > said, lefch has the first 16 bits with the value of the sample. On the other
> hand,
> > > rightch has the last 16 bits with the value of the sample. Is this correct?? I
> > > don't think so, because I have loaded it on the board and it doesn't sound.
> What
is
> > > the mistake??
> >
> >I had written another post to Joshy indicating that I was incorrect and 2x 16-bit
> >reads/writes are needed. Suggest to try this:
> >
> >short int i;
> >int lch, rch;
> >
> > while (1) {
> >
> > for (i=0; i>
> > lch = sinetable[i];
> > rch = -lch;
> >
> > while (!DSK6713_AIC23_write(hCodec, lch)); /* write left ch */
> > while (!DSK6713_AIC23_write(hCodec, rch)); /* write right ch */
> > }
> > }
> >
> >You should hear continuous tone on both channels, with no static or pops. Each
> >channel should sound the same, but if you look with dig scope, they should be 180
> out
> >of phase. Frequency of the tone should be sampling rate / length
of sine table.
> For
> >example if sampling rate is 16 kHz, then you should hear 62.5 Hz tone (assuming
> sine
> >table length is 256 -- I don't know that offhand). Note that if you set the
> sampling
> >rate too low, then you won't hear the tone (but you can still see it on the
> scope).
> >
> >-Jeff
> >
> > >
> ----------------------------------------------------------
> > >
> > > From: Jeff Brower
> > > To: Joshy Jose
> > > CC: c6x@yahoogroups.com
> > > Subject: Re: [c6x] reading values from aic23d codec in c6713 dsk
> > > Date: Fri, 02 Feb 2007 14:08:12 -0600
> > >
> > > Joshy-
> > >
> > > > i
need to take values from audio codec in c6713 dsk?
> > > > as there are two lines (left , right) microphone input , i need to
> > > > take values from each line seperately, and process it
> > > > i have tried with the function
> > > > DSK6713_AIC23_read() available in the dsk but i could not successfuly do it
> > > > i used
> > > > while (!DSK6713_AIC23_read(hCodec, data ));
> > > > while (!DSK6713_AIC23_read(hCodec, data ));
> > > >
> > > > to get two line values,
> > > >
> > > > what is the correct way to do this?
> > >
> > > Each call to DSK6713_AIC23_read() should return a 32-bit value, with high and
> low
> > > words being the 2 channel (line) samples. Check
this post for some example C
> code:
> > >
> > > http://www.dsprelated.com/groups/c6x/show/6704.php
> > >
> > > In your code above, you are actually waiting for four (4) values, discarding
> the
> > > first 2, and therefore cutting the sampling rate in half.
> > >
> > > -Jeff





__._,_.___







">http://www.dsprelated.com/groups/c6x/1.php



_____________________________________

Note: If you do a simple "reply" with your email client, only the author of this message will receive your answer.  You need to do a "reply all" if you want your answer to be distributed to the entire group.



_____________________________________

About this discussion group:



Archives:  http://www.dsprelated.com/groups/c6x/1.php



To Post:  Send an email to c...



Other DSP Related Groups: http://www.dsprelated.com/groups.php









stime71372758













__,_._,___