# making power harmonics analyser which will measure the amplitudes of the fundamental and its multiples (like 50hz, 100hz, 150hz,200 hz,…) there are)

i have been intendng to make a power frequency harmonics analyser which will measure the amplitudes of the fundamental and its multiples (like 50hz, 100hz, 150hz,200 hz,...) there are examples for making spectrum analyser with fft library's here is the example for the kosome made fft library

``````   #include <arduinoFFT.h>

#define SAMPLES 128             //Must be a power of 2
#define SAMPLING_FREQUENCY 1000 //Hz, must be less than 10000 due to ADC

arduinoFFT FFT = arduinoFFT();

unsigned int sampling_period_us;
unsigned long microseconds;

double vReal[SAMPLES];
double vImag[SAMPLES];

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

sampling_period_us = round(1000000*(1.0/SAMPLING_FREQUENCY));
}

void loop() {

/*SAMPLING*/
for(int i=0; i<SAMPLES; i++)
{
microseconds = micros();    //Overflows after around 70 minutes!

vReal[i] = analogRead(0);
vImag[i] = 0;

while(micros() < (microseconds + sampling_period_us)){
}
}

/*FFT*/
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
double peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);

/*PRINT RESULTS*/
//Serial.println(peak);     //Print out what frequency is the most dominant.

for(int i=0; i<(SAMPLES/2); i++)
{
/*View all these three lines in serial terminal to see which frequencies has which amplitudes*/

//Serial.print((i * 1.0 * SAMPLING_FREQUENCY) / SAMPLES, 1);
//Serial.print(" ");
Serial.println(vReal[i], 1);    //View only this line in serial plotter to visualize the bins
}

//delay(1000);  //Repeat the process every second OR:
while(1);       //Run code once
}
``````

how can i seperate the amplitudes for particular frequencies like amplitude of 50hz = ?, 150hz = ? and store them in other variables

• please use the `{}` button to format your code – jsotola Mar 17 '19 at 6:09

## 1 Answer

The general idea of your code looks OK, but consider using a hardware timer rather than the `for` loop for data acquisition. The sampling rate will be much more accurate and uniform because you eliminate (possibly cumulative) errors in timing. See this post for an example.

Do you know how the `FFT.MajorPeak` function works? If it simply finds the frequency of the largest point in the magnitude spectrum, this may not be a good measure of the 50 Hz peak etc. Instead, consider taking the area under the curve around the frequency of interest `f_0`, say `f_0 - 2 Hz` to `f_0 + 2 Hz`. The same code should be usable to measure the spectral power around any of the harmonics.

Also note that the mains electricity frequency is not exactly 50 Hz / 60 Hz. The short-term variation is around plus/minus 1 Hz. The above approach will also help make reliable readings.