Page 1 of 2

Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Mon Aug 12, 2019 11:24 pm
by guyman
Hello ALL !!!

I'm just building a simple vertical bar graph display that shows (with fantastic accuracy hopefully) the volume of 10 or 12 different octaves (1 octave per bar, 0-1/-inf - unitydb) .


I'm currently utilizing bw bandsplitters, and envelope followers to get my signal (saw a few others implement this approach, made my own from scratch. cpu heavy but It works great... proud 8-) ) but >>>>

I thought hey maybe I could increase accuracy and reduce cpu usage by analyzing to get a fft spectrum, divide the bins/array sections(?) into groups of octaves (how? math?) getting the magnitude into a 0-1 scale, adding the bins in each octave group together and rescaling the mag to get average of the octave, and using this as my amplitude to drive my bar graph... I would love the ability to change/choose the (f*2^n) band /octave splitter points with ease... I'm just not super hip to manipulating these fft arrays... I'm smart, yet not smart !


I know it sounds like I'm making a request for a schematic (not opposed to getting one :mrgreen: ) but I'm more so wondering on the math/logic of getting my magnitudes, and dividing these bins into octave groups...

(would the octave splitter cutoffs be too steep to illustrate average amplitude? If that assumption holds weight.. is there a work around to simulate cutoff slopes?? is that thought relevant whatsoever??)

AND more importantly fft wisdom in general,, ? (samples? mag accuracy? bin vs freq? speed, responsive enough for multiband modulation? HELL... phase? pitch correlation/detection??)

prolly easier than I think. I'm thinking about just sweeping with sin waves and figuring it out (please save me...)

PS: also could I further this to semitone accuracy ( :shock: 10 octaves * 12 semitones = 120 band bar graph ..genius? dumb? needed? UNWARRANTED?? )

:cry: :oops: :geek:

Ultimately the question is, will this yield me a result that is less CPU intensive and more accurate (speed/sync, freq, volume) ?

FFT Spectrum :arrow: OCTAVES :arrow: AMP BAR GRAPH :arrow: :D

To whatever brave soul that has read this, I hope I have inspired you and we can exchange more ideas.. AND HOPEFULLY you can EDUCATE your friend here....

~That Guy

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Tue Aug 13, 2019 2:12 pm
by trogluddite
Coincidentally, there' s been some discussion of related problems on tulamide's thread HERE, which may be of interest.

In short, when you use the FFT, you have to make a trade, balancing two factors...

- Precise frequency measurement. This gets better for bigger blocks of samples passed to the FFT, but bigger blocks will add latency (time delay) while you collect the samples to fill the next block. The block size also determines the lowest frequency that you can measure (excepting bin zero, which is the DC offset plus everything below bin one) - so if you need an accurate display for the sub-bass octave, you'll need to use a very long block of samples!

- Precise timing/low-latency. The output bins of the FFT only tell you what frequencies happened at some point within the block of samples - but not where in the block they are present. So to react to changes quickly, or to analyse transients, you have to use small block sizes, sacrificing frequency precision and the bass end.

For your display, there are also a couple of added complications...

- The frequency 'bins' output by the FFT are spread linearly across frequency - each bin spans the same number of Hz. So each octave of the signal will have to average a different number of bins - the top half of the bins will be the highest octave, the top half of the remainder, the next octave down, and so on, until you reach the lowest band, which will have only a single bin (repeated halving will always work because the block size has to be a power of two for the usual FFT implementation.)

- The boundaries for the bins depend only on the sample rate and the number of bins. So if you wanted to control where the boundaries between octaves are, you'd have to resample the signal to a different sampling rate.

- Each bin doesn't perfectly isolate a band of frequencies - they 'leak' into the bins on either side (a bit like the slope of a conventional filter.) Because the bands are spread linearly across frequency, the upshot is that the measurements will get less and less selective for lower octaves. Or you could say that the lower frequencies are trickier because the analysis has fewer cycles of the wave to work from - it amounts to the same thing in practice.

- It's not necessarily more efficient. An FFT with a sample block of N samples is effectively calculating N/2 band-pass filters. While it does calculate these very efficiently, if you use a block long enough to reach into the bass region, that still a lot more filters that your current method is using!

As I said in the other thread that I linked to, whatever method you use to split the frequencies, the trade-offs are theoretically the same - the FFT is certainly very handy and efficient for many kinds of analysis, but the problems of the time/frequency trade-off and leakage between 'bands' are just inherent to any method of analysing waves.

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Tue Aug 13, 2019 5:54 pm
by guyman
Wow, you broke that down perfectly. Just what I needed to hear. Everything seems to have it's trade off.

Thank you Trogg !

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Wed Aug 14, 2019 6:03 am
by martinvicanek
Here is an octave band analyzer demo. Have fun!

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Wed Aug 14, 2019 2:06 pm
by trogluddite
You're welcome!

A brilliant example, as ever! One question for you - I'm guessing that the window is something like a gaussian function, but what are the polynomial coefficients generating exactly, and how did you work them out?

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Wed Aug 14, 2019 8:26 pm
by guyman
Results were unsatisfactory. I'm going with envelope followers on mono streams to float. Is there a more efficient way of doing this? I'm running crazy high cpu all over the place. 10 bands is a lot.

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Wed Aug 14, 2019 8:46 pm
by trogluddite
guyman wrote:Is there a more efficient way of doing this?

A few things come to mind, but it would be easier to advise if you could upload a schematic for us to look at. Typically, for this kind of thing, I'd be thinking of...

- Filter code often has parts which don't need recalculating for every sample if/when the cutoff frequency is rarely changed.

- Multiple mono stream modules can often be condensed into mono4 stream modules, so that you get "four for the price of one."

- Animated GUI elements can often be optimised to reduce the CPU load from graphics rendering.

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Wed Aug 14, 2019 10:35 pm
by martinvicanek
Thank you, Trog. As you know, in analysis it is important to use a window function to reduce spectral leakage (at the cost of losing some resolution). Many different window functions have been proposed, however basically it is a tradeoff between contrast and reslution:
narrow window function -> wide main lobe (low resolution), good side lobe attenuation (little spectral leakage)
wide window function -> narrow main lobe (good resolution), bad side lobe suppression (strong spectral leakage)
The popular Kaiser window is a one-parametric family, however is is a bit difficult to evaluate since it involves Bessel functions. Therefore I designed my own window functions with the following properties:

win2 - a fast approximation of the Hann window.
// Main lobe half width = 2
// Side lobe attenuation > 30 dB
// Tail falloff = 1/f^3

// Main lobe half width = 3
// Side lobe attenuation > 60 dB
// Tail falloff = 1/f^3

// Main lobe half width = 4
// Side lobe attenuation > 90 dB
// Tail falloff = 1/f^3

win3 and win4 have maximum side lobe attenuation at given main lobe half width and tail falloff. I used Excel solver to determine the coefficients.

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Thu Aug 15, 2019 3:11 am
by trogluddite
martinvicanek wrote:As you know...

Well, in gist if not in detail - I run away when I see differential calculus! :lol: Your adeptness with the mathematics never ceases to amaze me! Many thanks for those, I've no doubt they'll come in handy when I emerge from my Ruby rabbit hole back into DSP land!

Re: Splitting FFT spectrum into octave bands? how? worth it?

PostPosted: Thu Aug 15, 2019 6:03 pm
by guyman
I'll upload more cogs to my clock once I'm done doing my own optimizations. Here is my 8 pole lwr octave band splitter that I'm using. The config is setup for amplitude analysis only and not multiband recombination (phase shifts at each split). it has a x(y^n) float chain that calculates cutoff points, with text edit boxes to customize it. Could probably be more efficient, but again I'm full of afflatus and lacking craft.

Octave Band Splitter.fsm
(18.51 KiB) Downloaded 575 times