1,885
edits
Changes
→Alternate Approaches
=== Alternate Approaches ===
The sample program uses the most basic, obvious algorithm for the problem. Let's call this "Algorithm 0", or the "Naive Algorithm". Note that it uses casting between integer and floating-point formats as well as multiplication -- both of which can be [[Expensive|expensive]] operations.
Try these alternate algorithms for scaling the sound samples by modifying copies of <code>vol1.c</code>. Edit the <code>Makefile</code> to build your modified programs as well as the original. Test each approach to see the performance impact:
# Pre-calculate a lookup table (array) of all possible sample values multiplied by the volume factor, and look up each sample in that table to get the scaled values. (You'll have to handle the fact that the input values range from -32768 to +32767, while C arrays accept only a positive index).
# Convert the volume factor 0.75 to a fix-point integer by multiplying by a binary number representing a fixed-point value "1". For example, you could use 0b100000000 (= 256 in decimal) to represent 1.00, and therefore use 0.75 * 256 = 192 for your volume factor. Multiply this fixed-point integer volume factor by each sample, then shift the result to the right the required number of bits after the multiplication (>>8 if you're using 256 as the multiplier).