15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Rich Moore. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/////. Start CORDIC 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var AG_CONST = 0.6072529350; 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function FIXED(X) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return X * 65536.0; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function FLOAT(X) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return X / 65536.0; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function DEG2RAD(X) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0.017453 * (X); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Angles = [ 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FIXED(45.0), FIXED(26.565), FIXED(14.0362), FIXED(7.12502), 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FIXED(3.57633), FIXED(1.78991), FIXED(0.895174), FIXED(0.447614), 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FIXED(0.223811), FIXED(0.111906), FIXED(0.055953), 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FIXED(0.027977) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ]; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Target = 28.027; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function cordicsincos(Target) { 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var X; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var Y; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var TargetAngle; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var CurrAngle; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var Step; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) X = FIXED(AG_CONST); /* AG_CONST * cos(0) */ 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Y = 0; /* AG_CONST * sin(0) */ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TargetAngle = FIXED(Target); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrAngle = 0; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Step = 0; Step < 12; Step++) { 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var NewX; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (TargetAngle > CurrAngle) { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NewX = X - (Y >> Step); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Y = (X >> Step) + Y; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) X = NewX; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrAngle += Angles[Step]; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NewX = X + (Y >> Step); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Y = -(X >> Step) + Y; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) X = NewX; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrAngle -= Angles[Step]; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FLOAT(X) * FLOAT(Y); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)///// End CORDIC 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var total = 0; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function cordic( runs ) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var start = new Date(); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for ( var i = 0 ; i < runs ; i++ ) { 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) total += cordicsincos(Target); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var end = new Date(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return end.getTime() - start.getTime(); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)cordic(25000); 101