Arduino Forum

Topics => Science and Measurement => Topic started by: erkngajjar on Jan 26, 2019, 07:57 pm

Title: Phasor Estiamation with DFT algoridhm
Post by: erkngajjar on Jan 26, 2019, 07:57 pm
Sir i am traying to implement DFT algoridhm for calculation of phasor magnitude and angle, but it is not working. I have generated arrey of sine wave in code itself so without analog input we can check that it is working or not. Please help
Title: Re: Phasor Estiamation with DFT algoridhm
Post by: GaryP on Jan 26, 2019, 09:51 pm
Sir i am traying to implement DFT algoridhm for calculation of phasor magnitude and angle, but it is not working. I have generated arrey of sine wave in code itself so without analog input we can check that it is working or not. Please help
This is not an Apple site...
"Sir i am traying to..."

Title: Re: Phasor Estiamation with DFT algoridhm
Post by: jremington on Jan 31, 2019, 05:32 pm
You are not correctly calculating the entire DFT of the input, just one term.

Since the number of points is a power of two, just use the FFT. http://wiki.openmusiclabs.com/wiki/ArduinoFFT
Title: Re: Phasor Estiamation with DFT algoridhm
Post by: MarkT on Jan 31, 2019, 08:52 pm
Your a[] waveform and your sin/cos frequency are different, so you're not going to see
anything meaningful, especially as you're not using a sample window function like Blackman or Hanning.

You can only resolve at the same frequency as the signal.

And this is not really a DFT, the transform converts time-domain to frequency-domain
keeping all the information, here you are picking out one complex frequency component.
Title: Re: Phasor Estiamation with DFT algoridhm
Post by: erkngajjar on Feb 24, 2019, 06:39 pm
Sir here the frequency of a[] waveform if 50hz and the frequency of sin/cos terms are also changed to 50 but nothing is happening again.

Also i have tried FFT library but it only gives magnitude with frequency, but my requirement is to take only 50hz signal and calculate its magnitude and phase angle. I want to measure phase angle between voltage and current vector later which is of 50hz.

Also i have prepared a code for taking analog samples withe 3.2kHz sampling frequency so every cycle of sine wave can have 64 samples. Both the codes are attached here with.

Thank you Mr. MarkT, Mr. Jremington and Mr. GarryP for replaying. I am also thankful to all who have tried to help.
Title: Re: Phasor Estiamation with DFT algoridhm
Post by: MarkT on Feb 25, 2019, 12:35 pm
Please post your code in code tags so we can see it easily.
Title: Re: Phasor Estiamation with DFT algoridhm
Post by: erkngajjar on Feb 28, 2019, 07:11 pm
Here is first code which is for phasor estimation..

Code: [Select]

int i=0;
int N=64;
float a[64];
float t[64];
float   p_m_1[64];
float   p_a_1[64];
float Xr_1 = 0;
float Xi_1 = 0;
float Xr_1_1 = 0;
float Xi_1_1 = 0;
float Phasor_Magnitude_1 = 0;
float Phasor_Angle_1 = 0;
float Phasor_Angle_Degree_1= 0;


void setup() {
 
Serial.begin(9600);

}

void loop() {

 
   for (i=0; i<N; i++){
   
       t[i] = i * 0.0003125;
       a[i] = 325 * sin(314.14 * t[i]);
       Serial.print("Sine wave freq: ");
       Serial.print(a[i]);
       Serial.print("    Sample no: ");
       Serial.println(i);
       
       //delay(1);
       
     }
i=0;
     

    for (i = 0; i<N; i++){
      p_m_1[i] = a[i] * cos ((2*PI * i*50)/ N);
      //delay(2);
      p_a_1[i] =- a[i] * sin ((2*PI * i*50)/ N);

     
      //delay(2);
      Serial.print("Sample no:  ");
      Serial.print(i);
      Serial.print("   Real:   ");
      Serial.print(p_m_1[i]);
      Serial.print("   Imaginary    ");
      Serial.println(p_a_1[i]);
      Xr_1 = Xr_1 + p_m_1[i];
      Xi_1 = Xr_1 + p_a_1[i];
     
     }

     Xr_1_1 = (sqrt(2)/N) * Xr_1;
     Xi_1_1 = -(sqrt(2)/N) * Xi_1;
     Serial.println("");
     Serial.print("Real value is: ");
     Serial.print(Xr_1_1);
     Serial.print("    Imaginary value is");
     Serial.println(Xi_1_1);

     Phasor_Magnitude_1 = sqrt((Xr_1_1 * Xr_1_1) + (Xi_1_1 * Xi_1_1));
     Phasor_Angle_1 = atan2 (Xi_1_1,Xr_1_1);
     Serial.print(Phasor_Magnitude_1);
     Serial.print("     ");
     Serial.println( Phasor_Angle_1);

     Phasor_Angle_Degree_1 =  Phasor_Angle_1 * 57.32;
     Serial.println(Phasor_Angle_Degree_1);

     Xr_1_1=0;
     Xi_1_1=0;
     Phasor_Magnitude_1=0;
     Phasor_Angle_1=0;
     Phasor_Angle_Degree_1=0;
     Xr_1=0;
     Xi_1=0;   

     
   
 
 

   while(1){}
 
}







Here is second code which is for taking analog samples at 3.2khz sampling frequency




Code: [Select]
#include <TimerOne.h>

int i;
unsigned long ts;
unsigned long t;
int r[64];
boolean sampling_done;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  i = 0;
Timer1.initialize(312);
Timer1.attachInterrupt(aquire);
ts = micros();
}

void loop() {
 
if (i == 63){
     t = micros() - ts;
     noInterrupts();
     Serial.println("AB");
     Serial.print("Time is");
     Serial.println((float)t/(float)1000000);
     sampling_done = true;

    if (sampling_done = true){
      i = 0;
      interrupts();
      ts = micros();
    }
  }
}


void aquire(){
  r[i] = analogRead(A0);
  r[i] = analogRead(A1);
  i += 1;
 
}




Title: Re: Phasor Estiamation with DFT algoridhm
Post by: MarkT on Mar 01, 2019, 07:26 pm
Your phasor code is populating a with 325 sin (0.09817 i),
then correlating it with sine and cosine of  (100π/64) i

100π/64 is very different from 0.9817

100π/64 is also over the Nyquist limit.