home *** CD-ROM | disk | FTP | other *** search
- #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);
- }
- }
-