# Understanding code from Frequency measurement

Hey!
Could anyone explain the lines under "if" ?

``````#include <[color=#cc6600]FreqMeasure[/color].h>

[color=#cc6600]void[/color] [color=#cc6600][b]setup[/b][/color]() {
[color=#cc6600][b]Serial[/b][/color].[color=#cc6600]begin[/color](57600);
[color=#cc6600]FreqMeasure[/color].[color=#cc6600]begin[/color]();
}

[color=#cc6600]double[/color] sum=0;
[color=#cc6600]int[/color] count=0;

[color=#cc6600]void[/color] [color=#cc6600][b]loop[/b][/color]() {
[color=#cc6600]if[/color] ([color=#cc6600]FreqMeasure[/color].[color=#cc6600]available[/color]()) {
count = count + 1;
[color=#cc6600]if[/color] (count > 30) {
[color=#cc6600]float[/color] frequency = [color=#cc6600]FreqMeasure[/color].[color=#cc6600]countToFrequency[/color](sum / count);
[color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color](frequency);
sum = 0;
count = 0;
}
}
}
``````
``````void loop()
{
if (FreqMeasure.available())  //if there is a frequency measurement available
{
count = count + 1;  //increment count
if (count > 30) //if 30 readings have been done
{
float frequency = FreqMeasure.countToFrequency(sum / count);  //calculate average frequency
//taking into account the speed of the processor
Serial.println(frequency);  //print the average frequency
sum = 0;  //zero the running sum for next average
count = 0;  //zero the count
}
``````

See

``````float FreqMeasureClass::countToFrequency(uint32_t count)
{
#if defined(__AVR__)
return (float)F_CPU / (float)count;
#elif defined(__arm__) && defined(TEENSYDUINO) && defined(KINETISK)
return (float)F_BUS / (float)count;
#elif defined(__arm__) && defined(TEENSYDUINO) && defined(KINETISL)
return (float)(F_PLL/2) / (float)count;
#elif defined(__arm__) && defined(TEENSYDUINO) && (defined(__IMXRT1052__) || defined(__IMXRT1062__))
return (float)F_BUS_ACTUAL / (float)count;
#endif
}
``````

NOTE that I am not familiar with the library

By the way, what does the topic title have to do with your question ?

UKHeliBob:

``````void loop()
``````

{
if (FreqMeasure.available())  //if there is a frequency measurement available
{
count = count + 1;  //increment count
if (count > 30) //if 30 readings have been done
{
float frequency = FreqMeasure.countToFrequency(sum / count);  //calculate average frequency
//taking into account the speed of the processor
Serial.println(frequency);  //print the average frequency
sum = 0;  //zero the running sum for next average
count = 0;  //zero the count
}

``````

See

``````

float FreqMeasureClass::countToFrequency(uint32_t count)
{
#if defined(AVR)
return (float)F_CPU / (float)count;
#elif defined(arm) && defined(TEENSYDUINO) && defined(KINETISK)
return (float)F_BUS / (float)count;
#elif defined(arm) && defined(TEENSYDUINO) && defined(KINETISL)
return (float)(F_PLL/2) / (float)count;
#elif defined(arm) && defined(TEENSYDUINO) && (defined(IMXRT1052) || defined(IMXRT1062))
return (float)F_BUS_ACTUAL / (float)count;
#endif
}

``````

NOTE that I am not familiar with the library
``````

float frequency = FreqMeasure.countToFrequency(sum / count);
Does FreqMeasure.countToFrequency read the value from sum and divide it by count? Then create a value?

Does FreqMeasure.countToFrequency read the value from sum and divide it by count?

No

The library seems to work by counting the peaks in the input waveform using an interrupt and storing them in an array

FreqMeasure.countToFrequency() appears to take the array values and return a float, the calculation of which depends on the type of processor that the code is running on and hence its frequency. In the example sketch that you posted the value of the parameter is the average of 30 values hence the use of sum / count

The count variable used in the function is the value of the parameter passed to it and is not the same as the count variable in loop(). The library code is at FreqMeasure/FreqMeasure.cpp at master · PaulStoffregen/FreqMeasure · GitHub and, of course, on your PC

What exactly is it that you are trying to do and what range of frequencies are involved ?

skjermlue:
Could anyone explain the lines under "if" ?

Average 30 readings by summing them in 'sum', counting them in 'count' and, when reaching 30, dividing 'sum' by 'count' (always 30). A function is then used to convert the averaged reading to a frequency.

UKHeliBob:
What exactly is it that you are trying to do and what range of frequencies are involved ?

I'm trying to understand what I'm actually programming, not just copy paste and not knowing what and why I'm doing it.
Still not sure why sum / count is in the colon after FreqMeasure.countToFrequency

Still not sure why sum / count is in the colon after FreqMeasure.countToFrequency

Looks like a language problem here

To me a colon is this :
Do you mean brackets like this ( )

skjermlue:
Still not sure why sum / count is in the colon after FreqMeasure.countToFrequency

The result of the calculation 'sum / count' is the average of 30 'readings'. The average is passed to the "countToFrequency" function which converts a 'reading' to a frequency.

UKHeliBob:
Looks like a language problem here

To me a colon is this :
Do you mean brackets like this ( )

I meant brackets, excuse my Norwegian to English translation

excuse my Norwegian to English translation

No problem. I certainly don't know what the Norwegian for brackets is !

UKHeliBob:
No problem. I certainly don't know what the Norwegian for brackets is !

But I think the answer to my question is the one Johnwasser typed?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.