% Laboratorio 4 DSP
% Manejo de periféricos de punto fijo
%
% Profesor Marco Rivera
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Guía de Laboratorio 4
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
clear all
pack
clc
%
% Primero setear en formato largo, para evitar aproximaciones de Matlab
 
format long

% La representación en punto fijo de un número puede calcularse como:
% 2^(m-1)-1/2^f
% m : bits de magnitud
% f : bit fraccionales

% Ejemplo, si se disponen de 16 bits en total y se utilizan 11 bits para
% representar los enteros (m=11) y los restantes 5 bits para los
% fraccionales (f=5), entonces el máximo número positivo representable es
'ejemplo 1'
m = 11
f = 5
Max_positivo = 2^(m-1)-1/2^f
Max_negativo = -2^(m-1)
% en este caso el máximo número positivo representable es 1023.96875
% si ud realiza la siguiente operación,
% 01111111111.11111  (el cero en el bit más significativo indica el signo)
% 1*2^9+1*2^8+1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2
% ^0+1*2^-1+1*2^-2+1*2^-3+1*2^-4+1*2^-5
1*2^9+1*2^8+1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0+1*2^-1+1*2^-2+1*2^-3+1*2^-4+1*2^-5

'ejemplo 2'
m = 12
f = 4
Max_positivo = 2^(m-1)-1/2^f

'ejemplo 3'
m = 13
f = 3
Max_positivo = 2^(m-1)-1/2^f


% La representación de un punto flotante está dada por:
% a = m*b^e
% a : valor real del número a representar
% m : mantisa, dígitos significativos del número
% b : base del sistema de representación (10 en sistema decimal, 8 en sistema octal, 2 en sistema binario, etc.)
m = 6.02
b = 10
e =-23
a = m*b^e


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Complemento 2
% Ejemplo
'Forma 1'
% 7 en binario es 0111
N = 7
% Considerando 4 bits, n=4;
n = 4
% entonces
resultado = 2^n-N
% que en binario es 
'1001'

'Forma 2 (más rápida)'
% 7 en binario es 0111
N = 7
% Considerando 4 bits, n=4;
n = 4
% entonces
% se intercambia ceros por uno y viceversa
% 0111 ---> 1000
% al resultado sumar 1
% 1000 + 1 ---> 1001
% Así se tiene que 
'el complemento a 2 de 7 es -7'

% Complemento a dos 	Decimal
%       0111         	7
%       0110            6
%       0101            5
%       0100            4
%       0011            3
%       0010            2
%       0001            1
%       0000            0
%       1111           -1
%       1110           -2
%       1101           -3
%       1100           -4
%       1011           -5
%       1010           -6
%       1001           -7
%       1000           -8


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 
% Qn
%
% El formato Qn utiliza n bits para representar decimales, por lo que 
% se alcanza una resolución de 2^(-n)
% De los m bits restantes uno es utilizado como bit de signo, 
% por lo que el rango de enteros representable es [-2^(m-1), 2^(m-1)-1].

%%%%%%%%%%%%%%%%%%%%%%
% Suma en punto fijo
%%%%%%%%%%%%%%%%%%%%%%
%
% Ejemplo 
% Hacer la suma 1.5 + 2.5 en formato Q4
% Solución 
% 1.5 puede representarse como 0001.1000
% esto porque el entero 1 se representa por 0001 en binario
% y el decimal 0.5, correspondiente a 1/2, corresponde a 1*2^-1, entonces
% 1.5 = 0*2^3+0*2^2+0*2^1+1*2^0+1*2^-1+0*2^-2+0*2^-3+0*2^-4

% del mismo modo para 2.5
% el cual queda representado en Q4 como 0010.1000
% entonces al hacer la suma se tendrá

%   0001.1000
%+  0010.1000
% ------------

% si se hace la suma bit por bit, se verá que al sumar el binario 1 + el
% binario 1, se tendrá un overflow, pues el resultado será 1 + 1 = 10
% entonces en este caso se tiene

%   0001.1000
%+  0010.1000
% ------------
%   0101.0000  

% y el entero 0101 en binario corresponde al número 5 en decimal, es decir
% 1.5 + 2.5 = 5 --- 0101.0000 en Q4


%%%%%%%%%%%%%%%%%%%%%%
% Multiplicación en punto fijo
%%%%%%%%%%%%%%%%%%%%%%
%
% Hacer la multiplicaicón 1.5 + 2.5 en formato Q4
% Solución 
% 1.5 --- > 0001.1000 en Q4
% 2.5 --- > 0010.1000 en Q4

% 1.5 * 2.5 = 3.75
% 
% desarrollo
%    1.5*2.5       
% ------                  5*5 = 25
%    7 5
%+ 3 0
% ------
%  3 7 5                  2 decimales
%  3.75 

% en Q4
% 0001.1000 * 0010.1000

% ------------
%              0 0 0 0 0 0 0 0
%            0 0 0 0 0 0 0 0
%          0 0 0 0 0 0 0 0 
%        0 0 0 1 1 0 0 0
%      0 0 0 0 0 0 0 0
%    0 0 0 1 1 0 0 0 
%  0 0 0 0 0 0 0 0
%0 0 0 0 0 0 0 0
%-----------------------------------
%0 0 0 0 0 1 1 1 1 0 0 0 0 0 0      % se eliminan los 4 menos significativos
%
%0 0 0 0 0 1 1 1 1 0 0 - - - -              %
%
%0 0 0 0 0 1 1.1 1 0 0 - - - -      % como es Q4, se tienen 4 decimales
%
%- - - 0 0 1 1.1 1 0 0 - - - -      % si se considera un dato de 8 bits

% la parte entera  es 0011 ---> 3
% la parte decimal es 1100 ---> 1*2^-1 + 1*2^-2 = 0.75


