Điểm nổi TMS320 (DSP nhạc cụ Texas từ '98)


7

Lý lịch

Có ai ở đây là một EE có kinh nghiệm lập trình đã làm việc với DSP TMS320 C3X-series của Texas không? Tôi hiện đang làm một số công việc với C3X cho một dự án. Mục tiêu của tôi ở đây là chuyển đổi các giá trị thập lục phân của dấu phẩy động có định dạng C3X thành định dạng IEEE 754. Mã mà tôi có hoạt động đúng cho:

nhập mô tả hình ảnh ở đây

Trong đó x là số hex hex của dấu phẩy động đơn đầu vào (được biểu thị dưới dạng UInt32).

Vấn đề là khi tôi cố gắng sử dụng một số như 0.123 . Dường như tôi luôn nhận được giá trị NaN . Tôi hiện đang sử dụng đoạn mã này từ Đại học Florida mà tôi đã chuyển sang C #.

Thủ tục

  1. Hoán đổi các dấu hiệu và trường số mũ để đi từ C3X sang IEEE. Tôi sẽ không hiển thị mã này (trừ khi được hỏi) vì tôi tin rằng nó rất đơn giản cho bất kỳ ai đã làm việc với DSP này.
  2. Thực hiện thuật toán của Đại học Florida (được liên kết ở trên), mà tôi tin rằng tôi không hiểu đầy đủ.
  3. Kết hợp các dấu hiệu, số mũ và mantissa thành điểm nổi IEEE 754 có độ chính xác đơn.

Thực hiện C #

Dưới đây là mã được sử dụng để thực hiện thuật toán khi số float của C3X nằm trong khoảng từ 0 đến 1 (trong đó sự cố đang xảy ra). Đối c30tượng, đại diện cho số dấu phẩy động C3X. Đối ieeetượng đại diện cho số dấu phẩy động IEEE 754.

EDIT: Theo yêu cầu phổ biến, đây là một mẫu mã không tệ. Mẫu này là phiên bản hoạt động chính xác nơi chúng tôi kết xuất trong 15.913,35 ... (dưới dạng thập lục phân C3X).

C30Float c30 = null;
UInt32 bias = 127;
Int32 mantissa = 0;
Int32 digit = 0;
double fraction = 0;
double exponent = 0;
double fpValue = 0;
double sign = 0;

// 1. Declare the new C3X floating point value.
c30 = new C30Float(0x0D78A56B);

// 2. Get the sign bit value.
sign = c30.GetSign();

// 3. Decide whether or not to do the flip.
if (sign == 1)
{
    // flip
    mantissa = c30.GetMantissa();
    mantissa = mantissa + 1;
    mantissa = (~mantissa) & 0x007FFFFF; // the first 9 bits have nothing to do with the mantissa
}
else
{
    mantissa = c30.GetMantissa();
}

// 4. Obtain part of the fraction (do the swim!).
for (int i = -1; i > -24; i--)
{
    // mantissa index
    int currentDigit = i + 23; // n = -23 + 23 => n = 0

    // shift forward (get the digit)
    digit = mantissa;
    digit = digit & (1 << currentDigit);

    // shift back (get the digit into the lowest place)
    digit = digit >> currentDigit;

    // apply the digit to the fraction
    fraction += digit * Math.Pow(2, i);
}

// 5. Obtain the exponential part of the number.
exponent = c30.GetExponent() + 0x7F;

// 6. Get the floating point number.
fpValue = Math.Pow(-1, sign);
fpValue *= (1 + fraction) * Math.Pow(2, exponent - bias);

Tôi biết rằng tôi chưa cung cấp các chi tiết triển khai cho các mục sau:

GetMantissa()
GetExponent()
GetSign()

hoặc là...

SetMantissa()
SetExponent()
SetSign()

Lý do cho điều này là tất cả những gì đang làm là nhập / kéo các số đến / từ các trường tương ứng của chúng như được chỉ định trong Hướng dẫn sử dụng TMS320 C3X . Ai biết được, có lẽ đó là nơi tôi đang đi sai, nhưng bây giờ tôi muốn bắt đầu ở nơi tôi nghĩ phạm vi của vấn đề bắt đầu. Nếu bất kỳ ai trong số các bạn tin rằng vấn đề không có ở đây thì hãy hỏi về việc triển khai này và tôi sẽ cung cấp thêm chi tiết như được bảo hành.

Câu hỏi

Vấn đề của tôi rõ ràng là có các số từ 0 đến 1. Vì vậy, nếu bất kỳ ai đã biết các giá trị hex của C3X và các số float / real đối tác đã biết mà tôi có thể cắm và chug sẽ rất tuyệt để tôi có thể khắc phục sự cố thuật toán này.

Lưu ý: Chúng tôi không có DSP trước mặt cho những gì chúng tôi đang làm và không thể lấy số ra.


Bạn có nhớ chuyển đổi số mũ giữa 8 bit đã ký (có lẽ là phần bù 2, tôi không thể thấy nó được nêu trong tài liệu TI) và 8 bit không dấu với bias = 127 (IEEE)? Lần trước tôi sử dụng TMS320, nó vẫn chỉ là số nguyên 16 bit ... (TMS32010)
Brian Drumond

@BrianDrummond được gọi là "lật" và vâng tôi đang làm điều đó.
Snoop

@BrianDrummond bạn đã làm việc với DSP này chưa?
Snoop

@BrianDrummond có vẻ như những con số phát sinh từ điều này là "nên" (và tôi sẽ nói rằng vì chúng ta chỉ ở đây để thảo luận về DSP và KHÔNG phải là bản chất của ứng dụng) các số phân số nhỏ, ví dụ như 0,234 có giá trị lũy thừa lớn. Điều này có bình thường không? Hay không thể?
Snoop

Đó chắc chắn là nơi tôi sẽ tập trung ý định của mình. Tôi nghĩ số mũ (0,234) phải là 124 (IEEE) hoặc -3 = 252 (TMS320).
Brian Drumond

Câu trả lời:


1

Các Hướng dẫn sử dụng TMS320C3x liệt kê một vài giá trị kiểm tra:

  • Giá trị hex của giá trị nổi C3X được hiểu là uint32 ~ ~ Giá trị dấu phẩy động tương ứng
  • 0x02400000 ~ ~ +6 (xem trang 5-10)
  • 0x01C00000 ~ ~ -3.0 (xem trang 5-11)
  • 0xFB400000 ~ ~ (+3/64) (xem trang 5-11)

Tôi đoán bạn muốn mã giống như:

/*
Convert from single-precision TMS C3x floating point
to single-precision IEEE floating point.
2016-07-11: minor tweaks by David Cary
2016-03-21: StevieV

(see
http://electronics.stackexchange.com/questions/223832/tms320-floating-point-texas-instruments-dsp-from-98
http://etd.fcla.edu/UF/UFE0005060/tmsieeeconv.c
http://etd.fcla.edu/UF/UFE0005060/tmsieeeconv.h
)
*/

C30Float c30 = null;
Int32 mantissa = 0;
double exponent = 0;
double sign = 0;
double fpValue = 0;

// 1. Declare the new single precision C3X floating point value.
c30 = new C30Float(0x0D78A56B);

/*
We could have followed page 5-21 in the TMS320C3x User's Guide
http://www.ti.com/lit/ug/spru031f/spru031f.pdf
for C3X-->IEEE conversion.

But it seemed simpler to follow page 5-9
in the TMS320C3x User's Guide
"5.3.5 Determining the Decimal Equivalent of a TMS320C3x Floating-Point Format"
http://www.ti.com/lit/ug/spru031f/spru031f.pdf
*/

// 2. Break up the C3X floating value into its components
// (Assume that these 3 functions deal with endianness).
sign = c30.GetSign(); // either 0 (positive) or 1 (negative)
exponent = c30.GetExponent(); // a signed 8-bit integer, -128 to +127.
mantissa = c30.GetMantissa(); // a 23-bit unsigned integer

// insert implied most significant bit to the left of MSB of the mantissa.
mantissa = ((1 + sign) << 23) + mantissa;

// 6. Get the floating point number.
// Move the binary point left 22 places,
// then adjust further based on exponent.
// (Possibly something like ldexp() or BitConverter.ToSingle()
// would be more efficient).
fpValue = (-sign) * mantissa * Math.Pow(2, exponent - 22);
return fpValue;

Tôi thấy câu trả lời của bạn, tôi chưa quay lại dự án này. Tôi sẽ xem xét điều này khi tôi quay lại với nó.
Snoop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.