+++ /dev/null
-#if 0
-+----------------------------------------------------------------------+
-| Question: My filter design package gives me decimal fractional |
-| numbers as output for my FIR filter coefficients. |
-| How do I convert these decimal fractions into the |
-| DSP56200's format? |
-+----------------------------------------------------------------------+
-
- Answer:
- It's fairly easy to convert decimal fractions into the
- data format required by the DSP56200. The DSP56200 coeffi-
- cients are represented as 24-bit signed, fractional, 2's
- complement numbers as shown in Table 1.
-
- TABLE 1 - Representations for FIR Filter Coefficients
- -----------------------------------------------------
-
- Decimal Hexadecimal
- Fraction 24-Bit Binary Value Coefficient
- -------- ------------------- ----------
-
- 0.75 0.1100000 00000000 00000000 60 00 00
- 0.5 0.1000000 00000000 00000000 40 00 00
- 0.25 0.0100000 00000000 00000000 20 00 00
- 0.125 0.0010000 00000000 00000000 10 00 00
- -0.125 1.1110000 00000000 00000000 F0 00 00
- -0.75 1.0100000 00000000 00000000 A0 00 00
-
- Each 24-bit coefficient is separated into three bytes
- corresponding to the high, middle, and low bytes. The high
- byte is written to the DSP56200 at address 0A (hex), the
- middle byte to address 0B (hex), and the low byte to address
- 0C (hex).
-
- Conversion Procedure:
-
- Step 1: Multiply the decimal fraction by 8388608.0 (decimal).
- Note that 8388608 = 2 raised to the 23rd power.
- Step 2: Truncate or round the result into an integer.
- Step 3: Logically AND this integer with 00FFFFFF (hex).
- Step 4: Write the result to an output file as a hex integer.
-
- It is easy to write a program to perform this conversion on
- a set of coefficients. If done by computer program, make
- sure that all integer variables are represented with at
- least 24-bits. An example of a short "C" program is
- included at the end of this answer.
-
- Things to watch for:
-
- (1) Avoid letting a coefficient value be exactly 800000
- (-1.0 in a fractional system). If this coefficient
- is multiplied by a data sample with value -1.0, the
- result is -1.0 instead of +1.0 as expected. This is
- because +1.0 cannot be represented in a signed, 2's
- complement, fractional system.
-
- (2) The filter coefficients must be carefully selected
- to prevent overflow. If there is a possibility of
- overflow with a set of filter coefficients, then all
- coefficients must be scaled by a constant value. The
- DSP56200's 24-bit coefficients allow plenty of room
- for scaling. If 12-bit input data samples are used
- in a system, the potential for overflow is greatly
- reduced if the samples are right justified and sign-
- extended four bits before they are sent to the
- DSP56200.
-
-"C" Program:
-#endif
- /****************************************\
- ** DECIMAL FRACTION TO HEX CONVERSION **
- \****************************************/
-
-/******************************************************************\
-* This program converts one decimal, fractional number to a hex *
-* number which can be written to the DSP56200's Coefficient RAM *
-* Access registers. It prompts the user for a decimal fraction *
-* and returns the corresponding hex number. *
-* *
-* Examples of Program Results (useful for checking programs) *
-* Inputs Outputs *
-* ------ ------- *
-* 0.750 => 600000 *
-* 0.500 => 400000 *
-* 0.250 => 200000 *
-* 0.125 => 100000 *
-* -0.125 => f00000 *
-* -0.750 => a00000 *
-* 0.00784313678741455 => 010101 *
-* -0.00784313678741455 => fefeff *
-* *
-* Note: The program assumes that the variable type "long" is an *
-* integer which is at least 24-bits wide. *
-* *
-* Also: The DSP56200 cannot use any coefficient value with a *
-* magnitude of 1.0 or larger. All coefficients must be *
-* signed, fractional quantities. *
-\******************************************************************/
-
-main()
-{
- double fractnum; /* double precision floating pt */
- long hexval; /* long integer */
-
- for(;;) {
- /* Read 1 Decimal Floating Point Number from the Keyboard */
- printf("Enter the decimal fraction: ");
- scanf("%lf", &fractnum);
-
- /* Convert to a Hex Integer which can be used by the DSP56200 */
- hexval = (long) (8388608.0 * fractnum);
- hexval = 0x00ffffffL & hexval;
-
- /* Write the Hex number out to the Terminal */
- printf("DSP56200 Coefficient = %06lx\n", hexval);
- }
-}