Hi there!

I am doing a project related with real-time feedback.

I need to acquire and analyze the data in a few tens of microseconds. However, using the build-in mathematical operations, it takes too much.

I am not going to put all my code because of its extension, just the part that I need to optimize.

int ADC1After[] ;

float A_Fourier;

float B_Fourier;

float Amplitude;

float Phase;

A_Fourier=2.0/3.0*(ADC1After[0]*cos(0.0*PI/3.0)+ADC1After[1]*cos(2.0*PI/3.0)+ADC1After[2]*cos(4.0*PI/3.0));

B_Fourier=2.0/3.0*(ADC1After[0]*sin(0.0*PI/3.0)+ADC1After[1]*sin(2.0*PI/3.0)+ADC1After[2]*sin(4.0*PI/3.0));

Amplitude=sqrt(pow(A_Fourier,2)+pow(B_Fourier,2))/1023*3.3;

Phase=atan2(B_Fourier,A_Fourier) * 180 / PI;

the ADC1After vector is some data vector I had previously acquired (in uint32_t datatype).

As you can see, it involves sum, multiplication, division,sqrt, pow, and a trigonometric function.

This whole 4 lines of code takes 120 microseconds ( I have estimated it with an oscilloscope ), and breaking it down, each line code takes:

1st line (10 uS), 2nd line (10 uS), 3r line (25 us), and 4th line (75 us).

As expected, the phase, as it involves a division and trigonometric functions takes the longest.

My objective is to reduce all the computation time up to 25-30 uS.

After some research I found that in general there are methods to substitute the division by multiplication and shift, and the trig. function to Taylor expansions. However, I don't think I can use Taylor, as my phase can take values from 0 to 2pi.

Any suggestions?

I have also read that programming in assembly language can improve the speed of performance. However, as it is not an easy task I'll try to avoid it if possible.