Go Down

### Topic: FHT Library Frequency Output  (Read 1 time)previous topic - next topic

#### mitch_gaines0

##### Dec 06, 2017, 04:41 pm
Hey, this is probably going to be a rookie question, but I am using the Arduino FHT library from http://wiki.openmusiclabs.com/wiki/ArduinoFHT in order to do frequency detection. I understand that you can output the data to a spectrum analyzer using a 3rd party application, but all I want to do is get like an integer value for the frequency.

Whenever I run the code below, I get a lot of data in the serial monitor, but nothing I can make sense of. (the code is mostly straight from one of the examples and I've been playing around with it)

Any thoughts on how I would simply get the frequency value? Or is my understanding flawed somehow?

Thanks

Code: [Select]
`#define LOG_OUT 1 // use the log output function#define FHT_N 256 // set to 256 point fht#include <FHT.h> // include the libraryvoid setup() {  Serial.begin(115200); // use the serial port  TIMSK0 = 0; // turn off timer0 for lower jitter  ADCSRA = 0xe5; // set the adc to free running mode  ADMUX = 0x40; // use adc0  DIDR0 = 0x01; // turn off the digital input for adc0}void loop() {  while(1) { // reduces jitter    cli();  // UDRE interrupt slows this way down on arduino1.0    for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples      while(!(ADCSRA & 0x10)); // wait for adc to be ready      ADCSRA = 0xf5; // restart adc      byte m = ADCL; // fetch adc data      byte j = ADCH;      int k = (j << 8) | m; // form into an int      k -= 0x0200; // form into a signed int      k <<= 6; // form into a 16b signed int      fht_input[i] = k; // put real data into bins    }    //Serial.println(fht_input[0], fht_input[1]);    fht_window(); // window the data for better frequency response    fht_reorder(); // reorder the data before doing the fht    fht_run(); // process the data in the fht    Serial.println(fht_input[0], fht_input[1]);        //fht_mag_log(); // take the output of the fht    //Serial.println(fht_log);    sei();    //Serial.write(255); // send a start byte    Serial.write(fht_input[0]);    //Serial.write(fht_log_out, FHT_N/2); // send out the data  }}`

#### el_supremo

#1
##### Dec 06, 2017, 05:27 pm
What frequency value are you looking for? What is the input you are trying to analyze?

Read up on how Serial.print and Serial.write work.

Pete
Don't send me technical questions via Private Message.

#### mitch_gaines0

#2
##### Dec 06, 2017, 09:04 pm
Of course... Knew it would probably something stupid like that. Thanks for the guidance.

#### Grumpy_Mike

#3
##### Dec 06, 2017, 09:36 pm
Quote
I get a lot of data in the serial monitor, but nothing I can make sense of.
Each number you print out is the contents of a frequency bin. You have 256 bins, and each bin covers a frequency range which depends on your sampling rate.

So the input before it gets into the Arduino needs to be filtered so that you do not get any frequencies through it that will not have at least two samples per cycle. Otherwise all bets are off and you get rubbish numbers called aliasing.

Then in the top bin you get a number corresponding to a frequency that is half the sample rate, the next bin down is one quarter the sample rate, the next down 1/8 the sample rate then 1/16 and so on. So each bin is a different range of frequencies and they get wider the lower you go.

Quote
but all I want to do is get like an integer value for the frequency.
Using an FFT to get the frequency is not a very good technique. What you would have to do here is to look at all the bins and return the bin number that has the biggest number in it. That assumes that the fundamental frequency of the sound you have measured is the biggest harmonic.

#### MarkT

#4
##### Dec 08, 2017, 02:24 pm
Determining the dominant frequency and measuring a spectrum are related, but definitely different operations.

Auto-correlation is a useful operation for frequency determination for instance, that's solely in the time
domain.  Simple zero-crossing analysis can be used too.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

Go Up