![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
danielz85
Joined: 22 Sep 2012 Posts: 37
|
Generating a Sum of Sines |
Posted: Thu Nov 29, 2012 4:33 am |
|
|
Hi,
I'm trying to output a sum of several pure sine waves with the frequencies {17Khz, 17.2 Khz, 17.4Khz, etc}
I'm not quite sure what would be the best way to do it:
I thought I'd calculate in advance a 300-elements array, in which each element holds a sample of the sum, and then output it circularly using DAC. However, this method has it's downside which is calculating 300 elements, where each elements may require 8 (at worst) sine calculations, which is A LOT of calculation time...
Am I missing something here? or is this NOT the right way to generate this kind of a sum?
Thanks a lot in advance
Daniel |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19368
|
|
Posted: Thu Nov 29, 2012 5:49 am |
|
|
Forget about calculating sines....
You only need bytes or words, corresponding to the DAC value you want for a sine. If you remember that values in a sine, are duplicated in the second quadrant in the opposite direction, and then (for a DAC), if you have +ve values going from (say - for a 10bit DAC), 0 to 511, then the two lower quadrants are the 512- each of these values, while the upper quadrants are 512+ each value. You can generate a DAC sine value, using a couple of tests, a lookup, and one addition or subtraction. Probably 1000* faster than generating these using normal arithmetic. You should be able to get a sine, in under thirty instructions. Further, if you then add just the 'offset' values together as integers (adding or subtracting each entry, from a total), then when finished, if you are adding (say) six sines, instead of dividing by 6 to get the required value for the DAC, multiply by 42 and divide by 256. Key here is that multiplication (for integers on a PIC18), takes typically 1/10th the time for a division. The exception is divisions by binary values (2,4,8,16 etc..), which can be done by simple rotations. You could then generate each sum value, suitably scaled, in something of the order of a 1/10000th second....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9174 Location: Greensville,Ontario
|
|
Posted: Thu Nov 29, 2012 5:52 am |
|
|
Since PICs weren't originally designed to do 'fancy math', one option if possible,is to 'offload' the math to a PC then just download the 'table of sums' values.
If it must be in the PIC, an option is to calculate only the first 90* worth of sums.The 2nd 90* is the reversed order of the 1st,the 3rd is the negative signed first90* ,the 4th 90* the negative signed,reversed ordered 1st90*.
This 'trick' reduces 75% of the calculations which WILL speed up the 'fancy math' operations.
Other 'tricks' include using sin tables and integer math.The first takes up space,both save time.
hth
jay |
|
![](templates/subSilver/images/spacer.gif) |
danielz85
Joined: 22 Sep 2012 Posts: 37
|
|
Posted: Thu Nov 29, 2012 8:07 am |
|
|
Ttelmah, temtronic
thank you very much for the quick replies.
I will try your approach.
best wishes,
Daniel |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|