Skip to content
Snippets Groups Projects
Commit 1b281752 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Added functions COMPLEX_*() to convert between polar and rectangular coordinates.

parent 8aeebc8a
No related branches found
No related tags found
1 merge request!219No functional change. Use short index variables names in capitals, to ease...
Pipeline #26244 passed
......@@ -471,6 +471,15 @@ PACKAGE common_pkg IS
FUNCTION COMPLEX_MULT_REAL(a_re, a_im, b_re, b_im : INTEGER) RETURN INTEGER; -- Calculate real part of complex multiplication: a_re*b_re - a_im*b_im
FUNCTION COMPLEX_MULT_IMAG(a_re, a_im, b_re, b_im : INTEGER) RETURN INTEGER; -- Calculate imag part of complex multiplication: a_im*b_re + a_re*b_im
FUNCTION COMPLEX_RADIUS(re, im : REAL) RETURN REAL;
FUNCTION COMPLEX_RADIUS(re, im : INTEGER) RETURN REAL;
FUNCTION COMPLEX_PHASE( re, im : REAL) RETURN REAL; -- in degrees
FUNCTION COMPLEX_PHASE( re, im : INTEGER) RETURN REAL; -- in degrees
FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL; -- phase in degrees
FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL; -- phase in degrees
FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL; -- phase in degrees
FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL; -- phase in degrees
FUNCTION SHIFT_UVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR; -- < 0 shift left, > 0 shift right
FUNCTION SHIFT_SVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR; -- < 0 shift left, > 0 shift right
......@@ -2255,6 +2264,49 @@ PACKAGE BODY common_pkg IS
RETURN (a_im*b_re + a_re*b_im);
END;
FUNCTION COMPLEX_RADIUS(re, im : REAL) RETURN REAL IS
BEGIN
-- Must use ABS() with ** of real, because (negative)**2.0 yields error and value 0.0.
-- Must must use brackets (ABS()) to avoid compile error.
-- Alternative equivalent code would be: SQRT(re * re + im * im).
RETURN SQRT((ABS(re))**2.0 + (ABS(im))**2.0);
END;
FUNCTION COMPLEX_RADIUS(re, im : INTEGER) RETURN REAL IS
BEGIN
RETURN COMPLEX_RADIUS(REAL(re), REAL(im));
END;
FUNCTION COMPLEX_PHASE(re, im : REAL) RETURN REAL IS -- in degrees
BEGIN
RETURN ATAN2(Y => im, X => re) * 360.0 / MATH_2_PI;
END;
FUNCTION COMPLEX_PHASE(re, im : INTEGER) RETURN REAL IS -- in degrees
BEGIN
RETURN COMPLEX_PHASE(REAL(re), REAL(im));
END;
FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL IS -- phase in degrees
BEGIN
RETURN ampl * COS(phase * MATH_2_PI / 360.0);
END;
FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees
BEGIN
RETURN COMPLEX_RE(REAL(ampl), REAL(phase));
END;
FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL IS -- phase in degrees
BEGIN
RETURN ampl * SIN(phase * MATH_2_PI / 360.0);
END;
FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees
BEGIN
RETURN COMPLEX_IM(REAL(ampl), REAL(phase));
END;
FUNCTION SHIFT_UVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR IS
BEGIN
IF shift < 0 THEN
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment