Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>It's been a month since I've asked this question, and thanks, Geebs, for your response! :)</p> <p>So, this is related to a project that I've been working on, and the feature that is based on this was implemented about 2 days after asking that question. Clearly, I've slacked off on posting a closing response (sorry about that). I posted a comment on Jan 7, as well, but circling back, seems like I had a confusion with var names. >_&lt;. Thought I'd give a full, line by line answer to this question (with pictures). :) </p> <p>So, here goes:</p> <pre><code>//mDecibelResolution is the "weight" factor of each of the values in the meterTable. //Here, the table is of size 400, and we're looking at values 0 to 399. //Thus, the "weight" factor of each value is minValue / 399. MeterTable::MeterTable(float inMinDecibels, size_t inTableSize, float inRoot) : mMinDecibels(inMinDecibels), mDecibelResolution(mMinDecibels / (inTableSize - 1)), mScaleFactor(1. / mDecibelResolution) { if (inMinDecibels &gt;= 0.) { printf("MeterTable inMinDecibels must be negative"); return; } //Allocate a table to store the 400 values mTable = (float*)malloc(inTableSize*sizeof(float)); //Remember, "dB" is a logarithmic scale. //If we have a range of -160dB to 0dB, -80dB is NOT 50% power!!! //We need to convert it to a linear scale. Thus, we do pow(10, (0.05 * dbValue)), as stated in my question. double minAmp = DbToAmp(inMinDecibels); //For the next couple of steps, you need to know linear interpolation. //Again, remember that all calculations are on a LINEAR scale. //Attached is an image of the basic linear interpolation formula, and some simple equation solving. </code></pre> <p><img src="https://i.stack.imgur.com/hQhPS.jpg" alt="Linear Interpolation Equation"></p> <pre><code> //As per the image, and the following line, (y1 - y0) is the ampRange - //where y1 = maxAmp and y0 = minAmp. //In this case, maxAmp = 1amp, as our maxDB is 0dB - FYI: 0dB = 1amp. //Thus, ampRange = (maxAmp - minAmp) = 1. - minAmp double ampRange = 1. - minAmp; //As you can see, invAmpRange is the extreme right hand side fraction on our image's "Step 3" double invAmpRange = 1. / ampRange; //Now, if we were looking for different values of x0, x1, y0 or y1, simply substitute it in that equation and you're good to go. :) //The only reason we were able to get rid of x0 was because our minInterpolatedValue was 0. //I'll come to this later. double rroot = 1. / inRoot; for (size_t i = 0; i &lt; inTableSize; ++i) { //Thus, for each entry in the table, multiply that entry with it's "weight" factor. double decibels = i * mDecibelResolution; //Convert the "weighted" value to amplitude using pow(10, (0.05 * decibelValue)); double amp = DbToAmp(decibels); //This is linear interpolation - based on our image, this is the same as "Step 3" of the image. double adjAmp = (amp - minAmp) * invAmpRange; //This is where inRoot and rroot come into picture. //Linear interpolation gives you a "straight line" between 2 end-points. //rroot = 0.5 //If I raise a variable, say myValue by 0.5, it is essentially taking the square root of myValue. //So, instead of getting a "straight line" response, by storing the square root of the value, //we get a curved response that is similar to the one drawn in the image (note: not to scale). mTable[i] = pow(adjAmp, rroot); } } </code></pre> <p>Response Curve image: As you can see, the "Linear curve" is not exactly a curve. >_&lt; <img src="https://i.stack.imgur.com/NFfZ4.jpg" alt="Square root response image"></p> <p>Hope this helps the community in some way. :)</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload