Sign in

username:

password:



Not a member?

Search c54x



Search tips

Subscribe to c54x



c54x by Keywords

5409 | 5416 | AD5 | ADC | BIOS | Boot | Booting | Bootloader | C540 | C5402 | C5409 | C5416 | CCS | Codec | DMA | Dmad | DSK | DSKPlus | Dsplib | EVM | FFT | FIR | Flash | GPIO | HPI | Initialization | Interrupt | JTAG | LOG_printf | MCBSP | RFFT | RTDX | Sampling | STLM | UART | VC540

Ads

Discussion Groups

Discussion Groups | TMS320C54x | Re: [Fwd: Re: code working on simulator but not on device?]

Technical discussions about the TI C54x DSPs (including the c5401, c5402, c5402a, c5404, c5407, c5409, c5409a, c5410, c5410a, c5416, c5420, c5421, c5441, c549, c5470 and c5471).

  

Post a new Thread

Re: [Fwd: Re: code working on simulator but not on device?] - megha daga - May 22 11:15:46 2006



Dear Jeff
I did normalize and quantize the sos to Q15. But the thing I am not getting any difference in
the filtered output of non quantized and quantized coefficients. I checked the pole zero plot
in both the case and its the same. 
  Following are my calculations:
  
  Fs = 48000;
  HalfFs = Fs/2;
  Wp = 6000/HalfFs;
  Ws = 8600/HalfFs;
  Rp = 3;
  Rs = 20;
  [n,Wn] = buttord(Wp,Ws,Rp,Rs)
  
  n =
  
       6

  Wn =
  
      0.2587
  
  [b,a] = butter(n,Wn);
  
  b =
  
      0.0012    0.0075    0.0187    0.0249    0.0187    0.0075    0.0012

  a =
  
      1.0000   -2.8748    3.9031   -3.0192    1.3840   -0.3521    0.0386
  
  sos =
  
  1.0000    2.0085    1.0085    1.0000   -0.8084    0.1756
  1.0000    2.0000    1.0000    1.0000   -0.9087    0.3215
  1.0000    1.9915    0.9915    1.0000   -1.1577    0.6836

  g =
  
  0.0012
  With above values and i/p as
  X = [100, 200, 150, 345, 23, 678, 23, 567, 890, 46]
  my output came :
  R = filter(b,a,X)
  
  R  =
  
  Columns 1 through 8
  
  0.1246     1.3546      6.9579     22.8703     54.7673    103.0378    160.8801   218.3556
  
  Columns 9 through 10
  
  268.7207    312.9030
  Now I divided whole sos by 2.0085 (normalize) and multiplied by 32768 (for
  > Q15) and then cal a and b:
  sosnew=sos/2.0085
  
  sosnew =
  
      0.4979    1.0000    0.5021    0.4979   -0.4025    0.0874
      0.4979    0.9958    0.4979    0.4979   -0.4524    0.1601
      0.4979    0.9915    0.4937    0.4979   -0.5764    0.3404
  
  sosnew = sosnew*32768
  
  sosnew =
  
    1.0e+004 *
  
      1.6315    3.2768     1.6454    1.6315   -1.3188    0.2864
      1.6315    3.2629    1.6315    1.6315   -1.4826    0.5246
      1.6315    3.2491    1.6177     1.6315   -1.8888    1.1153
  
  [b,a] = sos2tf(sosnew,g)
  b =
  
  1.0e+011 *
  
  0.0541      0.3245      0.8113      1.0818      0.8113      0.3245      0.0541
  
  a =
  
  1.0e+013 *
  
  0.4342     -1.2484      1.6949     -1.3111      0.6010     -0.1529      0.0168
  
  and calculated filter on same data with these values:
  R = filter(b,a,X)
  
  R =
  
  Columns 1 through 8
  
  0.1246      1.3546      6.9579     22.8703     54.7673    103.0378    160.8801  218.3556
  
  Columns 9 through  10
  
  268.7207    312.9030
  
  So now you can see that, both the times R value is same. I dont understand why the values are
not changing. Kindly provide your opinion.
  Kinldy reply.
  Thanking You
  Megha Daga

Jeff Brower <j...@signalogic.com> wrote: Megha-

After normalizing and changing to Q15, then print sos again.  What does it
look like?  If looks correct, then maybe sos2tf() does a normalization of
its own, and puts the values back again.  In that case, maybe you have to
normalize and quantize b and a matrices.

-Jeff

> i just need to confirm what I am doing:
> As you suggested to normalize the data and then quantize. I tested it on
> matlab in the following manner:
> initially sos was:
> sos =
>
>     1.0000    2.0085    1.0085    1.0000   -0.8084    0.1756
>     1.0000    2.0000    1.0000    1.0000   -0.9087    0.3215
>     1.0000    1.9915    0.9915    1.0000   -1.1577    0.6836
> g =
>
>     0.0012
> With above values and i/p as
> X = [100, 200, 150, 345, 23, 678, 23, 567, 890, 46]
> my output came :
> R = filter(b,a,X)
>
> R =
>
>   Columns 1 through 8
>
>     0.1246    1.3546    6.9579   22.8703   54.7673  103.0378  160.8801
> 218.3556
>
>   Columns 9 through 10
>
>   268.7207  312.9030
> Now I divided whole sos by 2.0085 (normalize) and multiplied by 32768 (for
> Q15) and then cal a and b:
> [b,a] = sos2tf(sosnew,g)
> b =
>
>   1.0e+011 *
>
>     0.0541    0.3245    0.8113    1.0818    0.8113    0.3245    0.0541
> a =
>
>   1.0e+013 *
>
>     0.4342   -1.2484    1.6949   -1.3111    0.6010   -0.1529    0.0168
>
> and calculated filter on same data with these values:
> R = filter(b,a,X)
>
> R =
>
>   Columns 1 through 8
>
>     0.1246    1.3546    6.9579   22.8703   54.7673  103.0378  160.8801
> 218.3556
>
>   Columns 9 through 10
>
>   268.7207  312.9030
> and the result is same. Hence I dont see any effect by normalizing and
> then quantizing.
> I think this method should work.
> Jeff kindly correct me if I am going wrong anywhere. I also checked a
> random data on TO device and MATLAB and both give same output. Hence I
> guess, if this quantizing thing works on matlab, it should work on C5416.
> Kindly provide your suggestion. My filter is an IIR low pass filter with
> cut off at 6000Hz (for speech signal).
> Thanking You
> Megha Daga
>
> Jeff Brower  wrote:     Megha-
>   wont the scaling of coefficients effect the filter response?
> Scaling all coefficients changes the overall filter gain, but the not the
> shape of the frequency response.
> -Jeff
> Jeff Brower  wrote:  Megha-
>   Thanks for the reply. But I guess I need the format in Q15 to use it in
> the command iircas51. Even if I convert it to Q13, it wont work.
> Can you suggest a method so that I can quantize/normalize my whole data
> between 1 and -1. After that I can convert it into Q15 and I guess that
> should work.
> iircas51() uses 5 coefficients per biquad, so it makes no assumption that
> one coefficient = 1 (see iircas4 function).  In that case, you can try
> dividing all coefficients by the magnitude of your largest coefficient.
> Call this a scale factor k.  Then apply 1/k to final output before it goes
> to the AIC to allow correct overall gain for filter output.  Note that you
> should *not* apply 1/k to y[n] values -- only to D/A output, which I think
> can be more than 16 bits on the DSK 5510 board.Hopefully your IIR filter
> can then work in Q15 without overflow.  If not, then trying increasing
> k.-Jeff
>   Jeff Brower  wrote:  Megha-> I had a query in Q
> format. I am using iircas51 for IIR filter. In that
>> the coefficient data type should be DATA thats defined as short. So my
>> query is its not necessary to use Q15 format. I can aswell use Q2.13
>> format. But jeff is there any function to convert float to Q2.13 as
>> there is for float to Q15.To convert floating-point coefficients to Q13,
>> multiply by 8192 (instead
> of 32768 for Q15).I.e. multiplier = 2 ^^ QThis assumes all of your
> coefficients are less than +/- 4.0-Jeff> Jeff Brower wrote: Megha- I had
> one question.
>> In functions like butter (for filters) we declare a variable Wn (the cut
>> off frequency). ex: [B,A] = BUTTER(N,Wn). In this Wn value is between 0
>> and 1, where 1 means half of sampling rate. What I am not understanding
>> is
>> where is it getting sample rate value from. I saw some codes and in that
>> the sample rate value is not declared before using the command. Directly
>> the command is used. Where is it getting sample rate value from?
>> What I understand is suppose I have to run that filter design on an AIC.
>> And AIC is set at some sampling rate ex 48KHz. Then the code is
>> understanding that sample rate and setting Wn accordingly. Kindly
>> correct
>> me if I am wrong.
>> If your actual sampling rate is 48 kHz, and you want lowpass Butterworth
>> filter with 2 kHz cutoff, then set Wn = 0.0833.
>> Digital filters don't "know" the actual analog sampling rate; they only
>> know the Z-plane unit circle, or 0 to 1 as you mention. In this example,
>> if you vary the sampling rate (reprogram the AIC) then the filter cutoff
>> is always 0.0833*fs/2.
>> -Jeff
>>
>> Jeff Brower wrote: Megha-
>> I tried getting more material on maxflat but I am not getting much. I am
>> not understanding what exactly SOS and G stand for.
>> If I want coeff for IIRCAS51 (cascaded IIR filter design with biquads
>> qith
>> 5 coefficients) I want 3 coeff for zero (numerator) and 2 for poles
>> (denominator). I am not getting how to get those. i am not understanding
>> what does what stand for.
>> Maxflat() is for Butterworth IIR filter design. It's one option -- you
>> also might want Chebyshev or elliptic design.Another MATLAB function for
>> converting direct-form transfer function to cascade of biquad sections
>> is
>> tf2sos(). Here are some pages that might give you some clues:
>> http://www.math.psu.edu/local_doc/matlab/toolbox/signal/tf2sos.html
>> http://www.ee.ic.ac.uk/pcheung/teaching/ee3_Study_Project/iir_lab2.pdf-Jeff
>> Jeff Brower wrote: Megha-
>> > This is in continuation to my previous mail. I also tried with a
>> breakpoint at my
>>> next statement after fltoq15. If I run that. It stops in between and
>>> gives the
>>> error:
>>> Trouble running Target CPU: Attempted write to ROM at Addr:0x00ffff,
>>> Page:0
>>> I guess it is because of the infinite loop thing. Kindly reply and
>>> suggest
>>> something.Waiting for your reply.Your code is trying to write somwhere
>>> in mem locations 0x8000-0xffff, which are
>> external Flash as you mentioned before. Writing directly to Flash area
>> won't work
>> (although there is a way, which involves a series of Flash chip-specific
>> commands).
>> You have to check the C code ptr and array address values just before
>> the
>> breakpoint
>> to see why they are not pointing at onchip or offchip SRAM.Also, did you
>> see the c55x group thread about IIR cascade fixed-point filters? I've
>> included a copy of the latest message below. If you're not subscribed to
>> the c55x
>> group, you should. C55xx devices are the next generation after C54xx --
>> both 16-bit
>> fixed-point.-Jeff
>> -------- Original Message --------
>> Subject: Re: [c55x] IIR filter coefficients in iircas5 dsplib
>> Date: Tue, 16 May 2006 08:37:25 +0200
>> From: Christian Narvaez
>> To: c...@yahoogroups.com thanks Misan, thanks RK:
>> indeed this was the problem... I have successfully implemented the
>> filter now.CNnasim ahmed ha scritto:
>>> hi christian,
>>> u r trying to get q14 fixed point format but dsplib
>>> has q15 format, i suggest u to use both in same format . u can
>>> multiply with 2^15 . And two q15 multiplication results q2.30. here 2
>>> sign bit presents so u hav to modify that according to ur desired
>>> output format. i hope it will help u , if u hav any prob u can send me
>>> message.
>>>
>>> regards misan
>>>
>>> */Christian Narvaez /* wrote:
>>>
>>> Hi,
>>> I am having a problem trying to implement an IIR filter on an TI c55x.
>>> I have calculated the filter on matlab getting the following
>>> coefficients for 2 second order sections:
>>>
>>> SOS
>>> 1.0000 1.6854 1.0000 1.0000 -1.7197 0.8565
>>> 1.0000 -1.9999 1.0000 1.0000 -1.8899 0.9250
>>> G
>>> 1.0000
>>> 0.1041
>>> 1.0000
>>>
>>> Simulations perform as expected.
>>> Since the coefficients are between ]-2..2[ I transform the SOS matrix
>>> as SOS_fix = SOS*2^14:
>>>
>>> SOS_fix
>>> 16384 27614 16384 16384 -28175 14033
>>> 16384 -32766 16384 16384 -30964 15155
>>>
>>> The question is: can I run this coefficients on iircas5 of the TI
>>> dsplib? I know dsplib is Q.15 while my coefficients are Q.14, but I
>>> suppose this is not a problem if the filter's input is small
>>> enough not
>>> to cause any overflow. Unfortunately this does not work, the
>>> output is
>>> completely wrong.
>>>
>>> The second think I tried was to multiply the numerator
>>> coefficients of
>>> the second section of the filter by 0.1041 (according to G), before
>>> converting them to Q.14, getting this:
>>>
>>> SOS_fix_G
>>> 16384 27614 16384 16384 -28175 14033
>>> 1706 -3412 1706 16384 -30964 15155
>>>
>>> But this also does not work.
>>>
>>> Does anyone have any idea how I should convert my coefficients in
>>> order
>>> to work with iircas5?
>>>
>>> Thanks.
>>>
>>> Christian
>



(You need to be a member of c54x -- send a blank email to c54x-subscribe@yahoogroups.com )